Fleet changelogs · dev.ecs0.net
rdmsm4x-changelog-20260915-2251-bitroo-epic-scenes-tidbyt-catalog-esp32

rdmsm4x-changelog-20260915-2251-bitroo-epic-scenes-tidbyt-catalog-esp32

2026-09-15 22:51:18 EDT · rdmsm4x · session_012cXdr2uPhnPS1cQfbt9pPQ

EPIC-20260915-01 (BitRoo program): all four children resolved. Scene library 5 → 31 public, Tidbyt's 888-app catalog inventoried and a tranche ported, ESP32 researched to a recommendation. Two follow-ups opened from doing the work.

Scope

Repo Commits Pushed
apps/bitROO 9c3338f scenes · f3d4c2a Tidbyt · fa2826f spike · 1e780db state origin + backup + fleet
~/dev/issues 12f0b2a backup
sites/dev.ecs0.net 4a19c4f backup

Scene library: 5 → 31 public scenes

16 general scenes (sparkline, heatmap, dualMetric, progress, battery, calendar, countdown, uptime, binaryClock, weather, ticker, nowPlaying, textCard, alert…) plus 10 Tidbyt-inspired. All render from data handed in — none calls a network, so any scene renders with no token, device or service. 27 are offered in both apps' pickers.

The defect only looking could find: tracking does not enlarge glyphs. Font3x5 is a fixed 3×5 bitmap, so tracking widens the gaps between characters and does nothing at all to a single-character string like a day number. Several scenes — and the pre-existing clock — were written as though it scaled. Added PixelCanvas.textScaled, and a test now asserts scale 3 lights exactly 9× the pixels while tracking 3 changes a single glyph's width by zero.

scripts/render_contact_sheet.zsh makes the check repeatable: 38 variants into one PNG, and it fails if the output is under 1 KB, so a renderer that silently wrote nothing cannot pass.

Tidbyt catalog: the honest answer to "re-create them all"

Licence settled first, as the ticket required: the repo is Apache-2.0 and their CLA binds contributors to Tidbyt, not us. But the licence covers the code, not the content — many apps embed artwork Tidbyt cannot sublicense (Nyan Cat, Mario, Minions, Seinfeld, Oblique Strategies, Dothraki). A NOTICE file carries the attribution and statement of changes; none of that is reproduced.

All 888 apps classified by what each needs to run:

Class Count Share Meaning
API 570 64% calls a live third-party service
CONFIG 148 17% renders locally, needs user config
KEY 121 14% needs a Tidbyt-encrypted secret or OAuth — cryptographically un-portable
SELF 49 6% fully self-contained

Of the 49 self-contained, 22 are third-party-IP wrappers and 6 are countdowns Scenes.countdown already covers with a date argument. ~10 were worth porting, and 10 were ported. "All of them" is not achievable for structural reasons, not effort ones.

ESP32 / reflashing: the blocker is ours, not the firmware's

Both Tidbyt generations are ESP32 and Tronbyt (Apache-2.0) can reflash them. But do not. The firmware pulls WebP; BitRoo only encodes GIF and pushes. Flashing today would void the warranty on Rich's hardware and produce a device that displays nothing.

Measured here rather than inherited from a code comment:

CGImageDestinationCopyTypeIdentifiers() -> 22 types, ZERO webp
gif present (control): true      <- so the empty webp result is a real absence
lipo -archs /opt/homebrew/lib/libwebp.dylib -> arm64      <- arm64 ONLY
lipo -archs /opt/homebrew/bin/cwebp        -> arm64

So the easy fix is closed off: linking Homebrew's libwebp breaks the universal2 gate in exactly its silent way — builds, copies, checksums and launches on Apple Silicon, dies at exec on the two Intel Mac Pros. Recommended sequence: vendor a universal2 libwebp → stand up the /next pull endpoint → prove the chain on a ~$30 matrixportal-s3 board the firmware already supports → only then consider the Tidbyt, and that is Rich's call. No device was flashed, powered on or modified.

Verification

swift test       -> 27 tests, 0 failures    (10 at session start, then 20, then 27)
                    incl. a negative control: different seeds MUST give different panels,
                    or a "seeded" generator returning a constant would pass
contact sheet    -> 38 variants rendered and visually inspected
make_app.zsh     -> "architectures ok: x86_64 arm64", signed ZU2882L4HT
iOS clean build  -> BUILD SUCCEEDED; reinstalled and screenshotted on iPhone 18 Pro
wiki             -> 4 ticket pages 200 through the live gateway, bogus path 404 as control

Still not true, and labelled everywhere

BitRoo has never talked to real hardware: no Tidbyt token, nothing ever pushed to a device, Tronbyt never pointed at a server, ESP32 still only a Display.Kind case, and the iOS app has run only in Simulator. Recorded in SESSION-STATE.md and STATUS.md.

Outstanding

Nothing needs Rich. No secrets appear in this record.