E-ink dashboard: TRMNL from cloud plugin to self-hosted byos¶
Phase 1 — cloud private plugin (worth documenting, then discarding): - Webhook: 2KB/request, 12/hour (free). We fit dithered 1-bit album art as a data-URI + queue into 2KB with progressive degradation. It worked. Barely.
Phase 2 — self-hosted byos_next (usetrmnl org, Next.js + postgres):
- No rate/size limits, LAN-only, renders server-side at native grayscale.
- BETTER_AUTH_URL must equal the public URL (origin checks).
- Devices repoint via captive portal: Advanced → Custom Server (no trailing /).
- Custom recipes = TSX with getData (server-side PULL — no pusher needed).
Meta block + RecipeDefinition<params, data>; recipes compile in, so the
compose flips from prebuilt image to build-from-source.
- Our recipe: priority screen — HA timer countdown > MA now-playing (500px
grayscale art, full queue via an ma-snapshot sidecar on the byos docker
network) > byos native calendar+weather composed side-by-side.
- Dual-mode params make it shareable: sidecar mode (full queue) or direct-HA
mode (base URL + long-lived token; art inlined as data-URI).
- Dynamic refresh: patched the display route (env-gated) to ask the sidecar's
/mode — 15s timer / 30s music / 300s idle.
- E-ink honesty: countdown shows "< N mins" (ceiling), end-time is the
precise anchor; giant bold fonts blob — 150-170px at weight 400 with
letter-spacing reads better than 210px bold.