Optional

Make it yours

You don’t need to write a line of code to build a Theme Park Waits sign. But the whole thing is open source, so if you’re curious, you can read it, change it, and flash your own version. This page shows how, including handing the tedious parts to an AI coding assistant.

Just want the sign? Skip this entirely. Follow BuildAssemblyFlash & Set Up and you’re done. No coding required. This page is for people who want to tinker.

What you can change

  • Draw a custom animation for your favorite ride. The most fun one. Some people are very into one specific ride.
  • Change the colors, scroll speeds, transitions, or number-reveal effects.
  • Tweak how rides are sorted, grouped, or filtered.
  • Change the boot message or splash.
  • Or go further and build a completely different little LED gadget on top of ScrollKit.

Get the source

The app lives in one repo and the LED library it’s built on lives in another. Clone them next to each other:

git clone https://github.com/czei/themeparkwaits
git clone https://github.com/czei/scrollkit

You don’t need the hardware to start. The same code runs on a desktop simulator, a little on-screen 64×32 LED panel. From the themeparkwaits folder (see its README for the exact paths):

# open the on-screen simulator
PYTHONPATH="../scrollkit/src:src" python -m src.themeparkwaits --dev

# run the tests
pytest tests/

If the simulator window opens and the tests pass, you’re ready to change things.

Bring an AI along (optional)

You can absolutely do this by hand. But an AI coding assistant is a great way in. Point the one you like at the two repos and let it explain the structure and draft changes for you. (Theme Park Waits itself was built with a lot of AI help, so this is very much in the spirit of the project. I’m deliberately not naming a specific tool: use whatever you prefer. They change fast.)

A good opening prompt:

I'm customizing an open-source CircuitPython LED-matrix project. The app is
github.com/czei/themeparkwaits and it's built on the ScrollKit library at
github.com/czei/scrollkit. First, explain how the repo is organized and how
ride icons and their animations work (look at src/images/rides/ and
src/ui/ride_animations.py). Then help me add a new 64x32 icon and animation
for [MY FAVORITE RIDE], modeled on the existing ones. Change only the files
that need it, and keep the test suite (pytest) passing.
Work in small steps. You’re going to flash this onto a real board, so make one change at a time, run the tests after each, and keep a known-good copy of the files you started with. AI is great at drafting; it’s on you to preview and test before it goes on the hardware.

Make a custom ride animation

This is the fun one. A ride’s little icon is a 64×32 image with its own motion. The steps:

1

Draw the icon

Make a 64×32 indexed BMP with at most 16 colors (the panel is low-color on purpose). Leave the top-left pixel as the “sky” background color so the sign knows what’s transparent. Drop it in src/images/rides/. There’s an idea list in docs/ride-icons.md.

2

Point it at your ride

Icons are matched to a ride by its themeparks.wiki ID (names aren’t unique across parks). Add your ride’s ID → your BMP filename to src/images/rides/manifest.json.

3

Give it some motion (optional)

To make it move, add an entry in src/ui/ride_animations.py that maps your icon to one of the animation styles (twinkle, drift, ember trail, blink, and a dozen more) with a few tuning values. Copy an existing ride’s entry and tweak it.

4

Preview it in the simulator

See it on your computer before touching the hardware. The app ships small tools that render a ride’s intro (e.g. tools/intro_shots.py and tools/anim_demo.py). Iterate here until it looks right.

Test it

Before anything goes on the board, run the suite so you know the basics still work: display, data fetch, and updates.

pytest tests/

Green? Good. If an AI made the change, this is your safety net. Don’t skip it.

Flash your version onto the board

The board runs CircuitPython, so “installing your code” just means copying files onto its USB drive. First, back up the files currently on the board. Then put it in write mode (hold the DOWN button while pressing RESET so your computer can write to the drive) and copy your modified code.py, boot.py, and src/ over. Reset again to run it.

If something goes wrong, a factory reset (hold UP + RESET) clears it back to setup, and you can recopy your known-good backup. See Flash & Set Up for the full flashing walkthrough.

Staying in sync, and sharing back

Once you’re running your own copy, you’re in charge. The over-the-air update channel just pulls the latest release I publish to the GitHub project. Handy if you want my new features and ride art, but entirely optional. If you’ve customized things, you can ignore OTA and pull changes from GitHub yourself whenever you feel like it.

And if you make something you think others would enjoy (a great ride animation, a fix, a new feature) you’re very welcome to open a pull request and share it with everyone. No pressure at all; your fork is yours to keep. But the door’s open.

Need the sign first?

Build the hardware, then come back and make it your own.