Native appearance payload checkpoint
Observed 2026-09-23 at source commits 6829f574b9e3c917f7f6464eca50829fdf70ad6e
and ef7b2a8c57f935f4aa12c2a3e0d1301cde5f030a.
The pinned helper still resolves Omarchy colors/templates. The small adapter
types its generated shell.toml into a bounded appearance.json per immutable
generation. It retains every generated section/key, including gradients with
authored stop order/angle, separate alpha, numeric spacing, and per-side border
widths. The theme command package includes this adapter; the pinned Catppuccin
default includes a derived payload bound to an ID hashing the source colors,
icon selector and canonical token payload without self-reference.
The native launcher receiver stages this payload with its palette during
prepare, adopts it before a redraw ACK, restores it on rollback, and loads
the selected generation on restart. It exposes brush, border, number, icon
theme, safe still-background path and generation serial getters. A missing or
invalid payload is rejected instead of displaying a partly themed generation.
The current touch-launcher.c still consumes only its earlier palette fields;
drawer/card rendering of the new getters is a separate integration task.
| Generated section | Fields in pinned default | Intended consumer state |
|---|---|---|
launcher | 12 | Drawer; new native getters available, rendering pending |
menu | 12 | Card/Settings chrome pending |
notifications | 6 | Notification surface pending |
controls | 22 | Controls/keyboard state rendering pending |
popups, tooltip | 5 each | System overlays pending |
image-picker | 7 | Background chooser pending |
font, spacing | 1, 2 | Handheld scale adaptation pending |
bar, lock, polkit, hyprland | 7, 11, 10, 2 | No corresponding shipped handheld surface/config; retained as data, not applied |
Commands and results:
python3 tests/test_handheld_theme_rendering.py PASS 3 host tests
python3 tests/test_handheld_theme_default.py PASS 1 host test
python3 tests/test_shell_appearance_receiver.py PASS 6 native host tests
python3 tests/test_omarchy_theme_activation.py PASS 8 host tests
python3 tests/test_omarchy_theme_resolution.py PASS 4 host tests
python3 tests/test_omarchy_theme_sources.py PASS 5 host tests
python3 tests/test_omarchy_theme_transaction.py PASS 13 host tests
cc -std=c11 -Wall -Wextra -Werror -fsyntax-only nix/touch-launcher/appearance.c $(pkg-config --cflags json-glib-1.0)
PASS native host syntax
openspec validate the-shell-loads-omarchy-themes --strict
PASS
nix build --no-link .#handheld-theme-command .#handheld-theme-default --print-out-paths
PASS package cross-build
Build outputs: /nix/store/w3xbmli5ncdcyvvxdb7qmpp5hi767588-handheld-theme-command-0.1
and /nix/store/zahja8nizkmm3mg21k6g81pg0r4cfzfb-handheld-theme-default-28ceaae7.
These are host/package checks. There is no changed image, display capture,
physical interaction, rollback-on-glass or full surface compatibility proof
from this checkpoint. The existing opt-in receiver remains disabled by default.