v0.47.17 — Marketplace, themes, smart sync
A catch-up release covering everything shipped since v0.45.5 (2026-06-10). 12 patch versions; the highlights below are organised by theme rather than tag.
Themes as a catalog kind
- Themes can now be installed from the marketplace alongside widgets and fonts. Single themes or theme packs.
- Six theme packs available in the community catalog today: Tonal, Pigment, Muted, Vivid, Gradient, Auroras (60+ themes total).
- Per-theme "Show in picker" toggle so a freshly-installed catalog doesn't bury the themes you actually use.
- Vivid and Gradient theme packs extracted out of the bundled set, so the host stays lean.
Smart sync for rotations
- Rotations JIT-render the upcoming step when a bound device is close to waking, instead of rendering on the scheduler's tick. Panels grab a frame that's seconds old, not minutes old.
- Live countdown to the next step + "play this step now" override on the rotations page.
Marketplace UX
- Browse page splits widgets / themes / fonts via kind filter chips.
- Carousel preview for catalog entries with multiple screenshots.
- GitHub star counts displayed on cards, cached and refreshed hourly.
- Bundle entries surface their folder list inline.
Network egress capability contract
- Widget manifests can declare which hosts they reach (
requires: ["network:api.github.com"]). The host enforces at the socket layer; undeclared egress raisesCapabilityDenied. - Worked example shipped in the devref bundle (
devref_egress).
GitHub widget bundle expansion
- Bundle grew from 7 to 14 widgets. New hero-stat widgets: Star Count, Streak, Open PR Count, CI Status, Star Growth, Activity Heatmap, Commit Cadence.
Notable fixes
- Webpage widget now awaits iframe load before screenshotting, so scheduled pushes to TRMNL X / Inky Impression don't capture blank cells (fixes #15).
- Community and user themes now apply on panel push (loopback bypass for
/themes/*.css). - Editor cell config no longer reverts after edit; multi-device layout corruption fixed.
- History view shows page name on schedule and rotation rows instead of the raw hex id.
- Thumbnail
.tmpextension bug + mypy strict miss in github_commit_cadence sample.
Catalog and ecosystem
- First third-party widget submission (Belgian public transport widget by @JayJay1989).
- Dashboards list grouped by device for instances with many panels.
- Recipes widget shipped to the catalog with QR-code-back-to-source rendering (segno added as a host dep).
Devices
- esp32_bw + photopainter clients documented in the README and on the wiki.
Upgrade: Docker users pull ghcr.io/dmellok/tesserae:0.47.17; HA add-on bumps land automatically once the add-on repo syncs.
927 tests, all green.