Is your feature request related to a problem?
A single theme can only show as many stats as fit on the panel. If you want more (e.g. a host page, a Kubernetes page, a network page), today's options are running one process per screen or hacky theme-swapping via restart — which re-inits the device and repaints the whole panel.
Full-frame redraws are also visibly slow on these serial-attached panels (~300 KB/frame over CDC-ACM ≈ 1–2 s top-down "wipe").
Describe the solution you'd like
Two complementary pieces, both implemented and running (REV A / TURING_3_5, Linux, Python 3.14):
-
Page carousel — one process rotates through multiple YAML-defined pages (dwell/refresh configurable, file live-reloaded so edits apply without restart). Widgets so far: bar, metric, radial, text. A page can use any existing theme background, and radial can trace ring art — e.g. live gauges over the stock Cyberdeck theme's rings.
-
Diff-based partial rendering — each new frame is diffed (PIL.ImageChops) against the last pushed frame and only changed horizontal bands are sent. In-page value updates become wipe-free (a few tiny rectangles instead of a full repaint); page transitions still repaint the content that differs, but skip unchanged chrome and blank space, so they complete noticeably faster than a full-frame push. This part could benefit every user of slow serial panels, independent of the carousel.
Working implementation: https://github.com/JacquesBronk/turing-smart-screen-python/tree/display-platform — docs in DISPLAY.md. It's purely additive (no upstream files modified); the stock engine remains available untouched via a small dispatcher.
Two REV A quirks discovered along the way, documented in DISPLAY.md, that may be worth noting upstream: Clear() leaves the panel in PORTRAIT (its trailing no-arg SetOrientation() restores the default, not the previous orientation), and clean_stop()'s ScreenOff() means any external replacement process must explicitly ScreenOn().
Describe alternatives you've considered
Theme-swapping with process restarts (flicker + device re-enumeration risk), one fat theme (doesn't fit), forking permanently (would rather contribute).
Additional context
Happy to adapt naming/structure/scope to your preferences and split this into smaller PRs — e.g. diff rendering first, carousel second. The branch also contains more niche extras (Prometheus data source, network-map page) that I'd expect to stay out of scope; the PR would cover the carousel + widgets + diff rendering core, with homelab-specific config replaced by generic psutil-only example pages.
Is your feature request related to a problem?
A single theme can only show as many stats as fit on the panel. If you want more (e.g. a host page, a Kubernetes page, a network page), today's options are running one process per screen or hacky theme-swapping via restart — which re-inits the device and repaints the whole panel.
Full-frame redraws are also visibly slow on these serial-attached panels (~300 KB/frame over CDC-ACM ≈ 1–2 s top-down "wipe").
Describe the solution you'd like
Two complementary pieces, both implemented and running (REV A /
TURING_3_5, Linux, Python 3.14):Page carousel — one process rotates through multiple YAML-defined pages (
dwell/refreshconfigurable, file live-reloaded so edits apply without restart). Widgets so far:bar,metric,radial,text. A page can use any existing theme background, andradialcan trace ring art — e.g. live gauges over the stock Cyberdeck theme's rings.Diff-based partial rendering — each new frame is diffed (
PIL.ImageChops) against the last pushed frame and only changed horizontal bands are sent. In-page value updates become wipe-free (a few tiny rectangles instead of a full repaint); page transitions still repaint the content that differs, but skip unchanged chrome and blank space, so they complete noticeably faster than a full-frame push. This part could benefit every user of slow serial panels, independent of the carousel.Working implementation: https://github.com/JacquesBronk/turing-smart-screen-python/tree/display-platform — docs in
DISPLAY.md. It's purely additive (no upstream files modified); the stock engine remains available untouched via a small dispatcher.Two REV A quirks discovered along the way, documented in DISPLAY.md, that may be worth noting upstream:
Clear()leaves the panel in PORTRAIT (its trailing no-argSetOrientation()restores the default, not the previous orientation), andclean_stop()'sScreenOff()means any external replacement process must explicitlyScreenOn().Describe alternatives you've considered
Theme-swapping with process restarts (flicker + device re-enumeration risk), one fat theme (doesn't fit), forking permanently (would rather contribute).
Additional context
Happy to adapt naming/structure/scope to your preferences and split this into smaller PRs — e.g. diff rendering first, carousel second. The branch also contains more niche extras (Prometheus data source, network-map page) that I'd expect to stay out of scope; the PR would cover the carousel + widgets + diff rendering core, with homelab-specific config replaced by generic psutil-only example pages.