rdmsm4x — dev.dataroo.net wiki: per-product favicons
Gave every product page under ~/dataroo.net/wiki/ its
own app-icon favicon, falling back to a new site-wide default where no
app icon exists yet. Site is served live via nginx bind-mount from
~/dataroo.net/wiki/; HTTP Basic auth is in front (401
unauthenticated = confirmed live).
Host: rdmsm4x only. Scope touched:
~/dataroo.net/wiki/** and
~/dev/scripts/gen_site.py. No git commits. No secrets in
any page.
New site-wide default favicon
~/dataroo.net/wiki/favicon.png(64x64) and~/dataroo.net/wiki/apple-touch-icon.png(180x180), built withsipsfrom the "knitted kangaroo" mark that was already embedded as theFAVICON/APPLE_ICONbase64 constants insidegen_site.py(i.e. the mark every generated page already showed) — so the new linked file is pixel-identical to the icon those pages already carried inline.
Generator change:
~/dev/scripts/gen_site.py
The 17 p/*.html product pages and
index.html/fleet.html are generated by this
script, which has a documented hard constraint: every output page must
be a self-contained HTML5 file with zero external dependencies (its own
docstring: "works offline, from a file:// URL, in ten
years"), so the favicon is embedded as a base64 data: URI
rather than a linked file. I kept that constraint rather than fighting
it:
- Added
PRODUCT_FAVICON/PRODUCT_APPLE_ICONdicts (12 entries, keyed by product slug), each a base64 PNG built the same way as the existing site-wideFAVICON/APPLE_ICONconstants. shell(title, body, active="", extra_js="", favicon=None, apple_icon=None)— new optional params, falls back to the site-wideFAVICON/APPLE_ICONwhen omitted (index.html/fleet.htmlcallers are unchanged and keep using the site default).product_page()now callsshell(..., favicon=PRODUCT_FAVICON.get(p["slug"]), apple_icon=PRODUCT_APPLE_ICON.get(p["slug"]))— a product with no dict entry (onlyroute, devsort, devmon, fleet, ai-architecture — none of these has a dedicated app icon) transparently falls back to the site default.- File grew from 83KB to ~840KB from the embedded base64. Accepted tradeoff — consistent with the file's own stated "self-contained forever" design goal, and the same pattern it already used.
- Regenerated with
python3 ~/dev/scripts/gen_site.py --no-fleet(reused the cached~/dev/data/fleet.jsonrather than re-probing all 6 hosts over SSH — this task didn't need fresh fleet data, only the favicon change). Backup of the pre-patch script:/private/tmp/claude-501/.../scratchpad/gen_site.py.orig-backup(session-scoped scratch, not durable — if a rollback is ever needed,git diff/history on~/dev/scriptsis the durable path since this session made no commits).
Icon sources used (12 products with a dedicated icon)
| slug | source file |
|---|---|
| rtty | ~/dev/apps/RTTy/Design/icons/RTTy_app_icon_082026.png |
| logtty | ~/dev/apps/logTTY/Assets/AppIcon/user-supplied/2026-08-20/logtty-final-icon-master-1024.png
(sha256-verified against the shipped build-17 mobile appiconset
Icon-1024.png — exact match) |
| roodb | ~/dev/apps/rooDB/assets/icon/rooDB-icon-source-1254.png |
| receiptroo | ~/dev/apps/rdRECEIPT/design/icons/generated/ReceiptRoo.png |
| hyperfile | ~/dev/design/icons/generated/HyperFile-macOS.png |
| filelabeler | ~/dev/design/icons/generated/FileLabeler.png |
| rdcontact-rdbookmark | ~/dev/design/icons/generated/rdKIPP.png |
| dataroo | ~/dev/design/icons/knitted/dist/dataroo-1024.png |
| scanroo | ~/dev/design/icons/knitted/dist/scanroo-1024.png |
| bitroo | ~/dev/design/icons/knitted/dist/bitroo-1024.png |
| rdworkbench | ~/dev/apps/rdWORKBENCH/Resources/Assets.xcassets/AppIcon.appiconset/rdWORKBENCHIcon-1024.png |
| tyrell | reused the already-published
~/dataroo.net/wiki/tyrell/favicon.png /
apple-touch-icon.png bytes directly (no re-derivation) |
Flag for Rich — dataroo/scanroo/bitroo icon
provenance: these three came from
~/dev/design/icons/knitted/dist/ (22-Aug-2026 batch,
complete iconsets, most recent files that exist for those slugs). That's
the same kangaroo mascot already used as the site's own default
favicon, so it reads as on-brand. But a related, separate artifact —
~/dev/design/knit-style-kit/README.md — records that on
24-Aug you explicitly retired a broader "knit/yarn UI style kit" from
the Tyrell/LLMRoo project and marked it "unassigned — available for a
future roo-family app." That retirement was about full UI theming
(colors/texture/felt-chips), not these specific icon files (one day
older, shipped as complete Xcode-ready
.iconset/.appiconset/ .icns for
BitRoo — evidence of a finished deliverable, not an abandoned draft), so
I judged them still good to use. Flagging since it's the one non-obvious
call in this batch — trivial to swap if you disagree, they're just
PNGs.
No icon found (correctly fell back to site default):
onlyroute, devsort, devmon — no Design/icon assets exist anywhere in
their repos. fleet and ai-architecture are
ops/doc pages, not apps (the latter's actual content is the Mac-fleet AI
architecture blueprint, not rooDB's docs, despite the misleading
apps/rooDB/docs path in products.json —
confirmed by reading its products.json "what"
field before assuming).
Hand-edited
pages (outside the generator's domain — linked <link>
tags, tyrell/index.html pattern)
Site default (/favicon.png +
/apple-touch-icon.png):
~/dataroo.net/wiki/agents.html,apps.html,ai-architecture-blueprint.html,localLLM/index.html
Tyrell icon (/tyrell/favicon.png +
/tyrell/apple-touch-icon.png):
~/dataroo.net/wiki/llmroo/index.html,llmroo/concept-renders.html— meta-refresh redirect stubs to/tyrell/...(project was renamed LLMRoo → Tyrell 2026-08-24)~/dataroo.net/wiki/tyrell/gallery/index.html,tyrell/concept-renders.html,tyrell/ledloom-renders.html— gap-fill: the "already done" tyrell/ work only coveredindex.htmlandmockups/index.html; these three had no favicon tag yet
~/dataroo.net/wiki/p/llmroo.html — hand-patched in place
(data-URI swap, not linked) to carry the same icon bytes as
p/tyrell.html. See "orphan" flag below for why this file
needed a special case.
Explicitly skipped (with reason)
~/dataroo.net/wiki/monitor/index.html— live-regenerated roughly every 10-60s by launchd jobnet.dataroo.devmon(~/dev/_ops/devmon/devmon.sh collect,StartInterval=60; confirmed by watching its mtime advance twice during this session). Any hand-edit would be overwritten within about a minute, and its generator is a shell script outside the one generator this task authorized touching (gen_site.py). Left alone.~/dataroo.net/wiki/archive/*.html(3 files:index-preconsolidation.html,index.atlas-interim-20260802-235416-preconsolidation.html,index.placeholder-2026-08-03-preconsolidation.html) — historical snapshots kept for archival record. Left untouched on purpose rather than editing frozen history; trivial to add later if you want them icon'd too.
Verification
All 30 touched/generated HTML files parse cleanly (Python
html.parser, zero errors) and each has exactly one
rel="icon" + one rel="apple-touch-icon" tag —
no duplicates, no breakage of existing markup. Every favicon-bearing URL
and every touched page was curl'd over HTTPS
(https://dev.dataroo.net/...) and returned
401 (Basic Auth challenge = confirmed live via the real
nginx bind-mount, not just "file exists locally"). Full table of 33 URLs
checked is in the session's final report; sampled here:
/favicon.png 401, /tyrell/favicon.png 401,
/p/rtty.html 401, /p/onlyroute.html 401
(site-default fallback, still live), /agents.html 401,
/llmroo/index.html 401.
Open follow-ups (not done — out of scope for this task, flagging only)
p/llmroo.htmlis a stale orphan.gen_site.py main()only overwrites pages for products currently inproducts.json— it never deletesp/*.htmlfor a product that was renamed or removed, so the pre-rename LLMRoo page (superseded byp/tyrell.htmlon 2026-08-24) was left behind and is unreachable from site navigation (no nav link points at it). Spawned a background task suggestion for agen_site.pyprune step; not done here since it's beyond "add favicons."- (Minor/FYI, not spawned)
~/Library/LaunchAgents/net.dataroo.app-icon-gallery.plistruns aKeepAlivepython3 -m http.server 8766bound to127.0.0.1,--directory ~/dev/app_icon_design— that directory no longer exists. Harmless (nothing to serve, not internet-facing), not touched.
Undo
Every new/changed file is plain content under
~/dataroo.net/wiki/ — delete the added
<link> line pairs or the two new PNGs to revert.
gen_site.py's pre-patch version is saved at
/private/tmp/claude-501/.../scratchpad/gen_site.py.orig-backup
for this session only (not durable storage); re-running
python3 ~/dev/scripts/gen_site.py --no-fleet after
restoring it regenerates
index.html/fleet.html/p/*.html
back to the prior (site-default-only) favicon state.