Fleet changelogs · dev.ecs0.net
rdmsm4x-changelog-20260824-2213-dev-dataroo-wiki-product-favicons

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

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:

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).

Site default (/favicon.png + /apple-touch-icon.png):

Tyrell icon (/tyrell/favicon.png + /tyrell/apple-touch-icon.png):

~/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)

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)

  1. p/llmroo.html is a stale orphan. gen_site.py main() only overwrites pages for products currently in products.json — it never deletes p/*.html for a product that was renamed or removed, so the pre-rename LLMRoo page (superseded by p/tyrell.html on 2026-08-24) was left behind and is unreachable from site navigation (no nav link points at it). Spawned a background task suggestion for a gen_site.py prune step; not done here since it's beyond "add favicons."
  2. (Minor/FYI, not spawned) ~/Library/LaunchAgents/net.dataroo.app-icon-gallery.plist runs a KeepAlive python3 -m http.server 8766 bound to 127.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.