Release notes

FEATURE

Migration paints migration routes across a dusk sky

Open Migration, fourteenth visual theme, and a dusk sky appears with a latitude-and-longitude grid. Three V-shaped flocks cross it at different speeds, with moving wings.

Route labels such as ROUTE. 7 identify those journeys. This follows illustrated field-guide approach of Lepidoptera panel, using migration as scene this time.

FEATURE

README galleries are rebuilt to complete missing themes and hide real data

Five READMEs were like practice sheets filled with different sample data: photos missed themes, failed to line up, and old images were hand-captured from a real machine, carrying real project names and dollar amounts onto public pages.

Headings claimed thirteen images but showed ten: stained_glass and origami had never been photographed, catppuccin only in Chinese, and old images predated Antigravity card. scripts/make_panel_shots.py now rebuilds shots from same synthetic payload used by website. Since galleries put three pictures in each row, a shorter panel pushes whole grid out of line, so all shots use tallest panel height; wide HUD world_cup, genuinely 243 pixels shorter, stays out. That leaves twelve images in four even rows. Website still displays all thirteen alone at own size. GitHub strips scripts and iframes from Markdown, so README remains static images.

FEATURE

Website gallery runs all thirteen live panels and switches their language

Theme wall on website moves from ten static screenshots to thirteen real panels you can view directly.

origami and stained_glass had no image, while catppuccin showed only Chinese, so thirteen themes meant ten visible themes. Website now puts real panel HTML into frame with hand-written demo payload, and gets theme list from panels.all_panels(). When fourteenth panel arrives, running scripts/make_panel_demo.py places it on site without remembering two more photos. Existing applyLang() also passes site language choice to panel, so all five languages change together. Panel is display-only: no native side on web page can answer Switch Panel or Quit buttons. Old screenshots remain in docs/, and READMEs still link to them.

FEATURE

Stained Glass gains counter-rotation like a kaleidoscope

Stained Glass keeps its existing light sweep, but scene now gains another layer of motion.

Layered fragments counter-rotate through kaleidoscopeTurn, while light sweep follows through kaleidoscopeSweep. Existing sunlightSweep remains, as do panel's id and name, so this upgrades existing Stained Glass visually rather than creating another theme.

FEATURE

Seven modules move into packages to avoid a `setup` naming collision at build time

Project root moves out seven more modules and now holds only 28 Python files.

panel_window and panel_window_state join panels/; critter_frames joins menubar/; four modules setup_hook, session_hooks, statusline_settings, and login_item install usage into user's system and join new installer/ package. It cannot be called setup: repository root sits on Python's sys.path (list of places Python searches for modules), and a top-level package of that name would shadow import setup used by setuptools and py2app during packaging. Failure surfaces only when packaging, not in test suite. Four modules used to walk upward from __file__ for hook scripts; scripts remain at root to run under system Python, so they now walk up one extra level.

Original changelog

Original changelogMigration paints migration routes across a dusk sky
**Migration is the fourteenth visual theme.** Its dusk sky carries a latitude-and-longitude grid while three V-shaped flocks cross at different speeds, their wings moving as route labels such as `ROUTE. 7` identify the journeys. It follows the Lepidoptera panel's illustrated field-guide approach.
Original changelogREADME galleries are rebuilt to complete missing themes and hide real data
**The README theme galleries are rebuilt from synthetic data and now line up.** All five READMEs listed ten screenshots under a heading that said thirteen — `stained_glass` and `origami` had never been photographed, `catppuccin` only in Chinese. The old images were also hand-captured from a real machine, so they carried actual project names and dollar amounts onto a public page, and predated the Antigravity card entirely. Every shot is now regenerated by `scripts/make_panel_shots.py` from the same synthetic payload the website uses. The galleries place three images per row, so a panel that is shorter than its neighbours pushes the whole grid out of line; the shots are therefore all captured at the tallest panel's height, and `world_cup` — a wide HUD that is genuinely 243 pixels shorter than the rest — sits this gallery out. Twelve images, four even rows. All thirteen are still on the website, where each one is shown alone at its own size. GitHub strips scripts and iframes from Markdown, so the README stays static images.
Original changelogWebsite gallery runs all thirteen live panels and switches their language
**The website now shows all thirteen panels, live, instead of ten screenshots.** The gallery held ten static images; `origami` and `stained_glass` had never been photographed at all, and `catppuccin` only in Chinese — so the page showed ten themes under a heading that said thirteen. It now renders the real panel HTML in a frame with a hand-written demo payload, and the theme list comes from `panels.all_panels()`, so a fourteenth panel appears on the site by running `scripts/make_panel_demo.py` rather than by remembering to take two more screenshots. Picking a language on the site switches the panel too, in all five languages, because the site's existing `applyLang()` forwards to it. The panel is display-only — its Switch Panel and Quit buttons have no native side to answer them on a web page. The old screenshots stay in `docs/`; the READMEs still link to them.
Original changelogStained Glass gains counter-rotation like a kaleidoscope
**Stained Glass now turns like a kaleidoscope.** The existing `sunlightSweep` remains, while layered fragments counter-rotate through `kaleidoscopeTurn` and the light sweep follows through `kaleidoscopeSweep`; its id and name stay the same, so this is a visual upgrade to the existing panel rather than a new theme.
Original changelogSeven modules move into packages to avoid a `setup` naming collision at build time
**Seven more modules moved out of the repository root.** `panel_window` and `panel_window_state` joined `panels/`, `critter_frames` joined `menubar/`, and a new `installer/` package took `setup_hook`, `session_hooks`, `statusline_settings`, and `login_item` — the four modules that install usage into the user's system. The root is down to 28 Python files. The package is named `installer` rather than `setup` because the repository root is on `sys.path` and a top-level `setup` package would shadow the bare `import setup` that setuptools and py2app perform during a build — a failure that only surfaces when packaging, never in the test suite. The four modules that resolve the hook scripts by walking up from `__file__` now walk up one extra level, since those scripts stay at the root to run under the system Python.