
One launcher for all the scenes
The project includes clocks, a stock ticker, rainbow, digital rain, fireworks, snowfall, plasma, and several other animated views. I wanted them to work together instead of copying a different demo onto the board every time.
main.py sets up the panel, graphics, options, sound, WiFi, and view manager. A background listener handles the buttons while the selected view runs. The main file doesn't need to know how every scene draws itself.
Shared services handle buttons, settings, WiFi, sound, and view switching. A clock can focus on time, and a particle effect can focus on throwing bright pixels around.
Switching scenes without leaving a mess
The view manager keeps an ordered mapping from names to async entry points. When the selection changes, it cancels the current task, clears the display, saves the new name, and starts the next view.
The name is stored in current_view.json. When the board restarts, it goes back to the selected scene. That bit of memory makes it feel like a real device instead of a demo with amnesia.
Effects can start their own supporting tasks. Fireflies, for example, combines animated brightness with occasional cricket sounds. Those tasks have to stop with the view, or old sound and animation work keeps running in the background.

Buttons have shared and scene-specific jobs
A and B move through the scenes. The brightness and volume buttons change the global settings. Sleep blanks the display and mutes the sound, then restores both when the board wakes.
C and D belong to the selected view. The clocks and stock ticker use them for text color, while Rainbow uses them for stripe width. Each scene gets useful controls without changing the common navigation.
Network features are optional
The offline effects work without WiFi credentials in options.json. The clock views use World Time API and the configured timezone, then keep ticking locally. If the connection fails, they fall back to device time.
The stock view uses Finnhub, a list of symbols, and an API key. It refreshes after the configured number of scroll passes. This is a tiny LED ticker, not a real-time trading terminal.
Those services need their own accounts and aren't always available. Keep API keys and WiFi credentials out of screenshots and shared configuration files. If an offline view works but the ticker doesn't, check the network and service response before blaming the display code.
Running it and extending it
Install the Galactic Unicorn MicroPython firmware, open the device in Thonny, and copy the contents of scripts/ to the board root. Edit the options if you want network data or a different timezone, then restart the board so main.py starts the launcher.
To add a scene, put it in scripts/views/ with an async entry point, then register it with the view manager. Existing scenes show how to use the sound service and handle C and D without taking over the rest of the controls.
The repository credits the Pimoroni examples and other work that helped shape the project. I think that's worth keeping visible. The smaller Unicorn-Pi build uses the same basic approach on a Pico with a Unicorn Pack. This version puts the larger board's sound and extra controls to work.
