Upgrade your original box to 3.0
You bought a finished Theme Park Waits box back when this was a product. Version 3.0 is yours free: over 80 animated ride icons, thirteen screen transitions, and a sign that fixes itself when the WiFi hiccups. One thing stands between you and it. 3.0 runs on CircuitPython 10, your box shipped with CircuitPython 9, and that one jump can’t happen over the air. So this is a one-time job at a computer, about fifteen minutes. After it, updates go back to arriving over the air, and you shouldn’t need the computer again.
What “flashing” actually means
The box runs its code on CircuitPython, a small version of the Python programming language that lives on the board inside the sign. Think of it as the box’s operating system. The sign can update its own app over the air, but it can’t replace the thing it’s running on, for the same reason you can’t change a tire while driving on it. “Flashing” sounds like surgery; in practice it means dragging one file onto a drive. The board does everything else itself.
What you need
- Your Theme Park Waits box.
- A computer. Mac or Windows, either works, and nothing gets installed on it.
- A USB-C cable that carries data. Many USB-C cables are charge-only; they power the box fine but no drive will ever appear. If step 2 does nothing, the cable is the first suspect.
- About fifteen minutes.
Download the two files
First, CircuitPython 10.2.1 itself. It’s a single file ending in .uf2, which is the entire operating system packed into one drag-and-droppable file.
Download CircuitPython 10.2.1 (.uf2)
Second, the app. It’s one zip that unpacks to a folder named themeparkwaits-3.5.x (the number is the current release in the 3.0 series; the sign keeps itself current over the air once it’s running). If your browser didn’t unzip it automatically, double-click the file.
Flash CircuitPython 10
Unplug the box from its wall power and plug it into the computer with the USB-C cable. The sign may light up and start scrolling; that’s fine, ignore it.
Find the reset button. On a finished box it hides behind the bottom of the three small holes on the side edge, below the holes labeled Boot and Init, next to where the cable plugs in; press it with a straightened paperclip or a thin screwdriver (step 3 has a video of these holes). Double-tap it, two quick presses like a mouse double-click. The display goes dark and a drive named MATRIXS3BOOT appears on your computer.
Drag the .uf2 file onto that drive. A progress bar runs, the drive ejects itself, and the board reboots. A few seconds later a drive named CIRCUITPY appears. That was the flash; the scary part is over.
Replace the old app
The CIRCUITPY drive still holds the old 2.x app, which can’t run on CircuitPython 10. You’re going to replace it wholesale.
First, put the drive in write mode. On a finished box the buttons hide behind the three small holes on the side edge: Boot on top, Init below it, and the recessed reset button at the bottom, next to where the cable enters. With a straightened paperclip or a thin screwdriver, hold the Boot button in while you press and release reset, then let go of Boot. (On a bare board, that’s: hold DOWN, press RESET.) In normal running the sign protects its drive from the computer, which is why the drive often shows up read-only; this hands it over. If the drive was already writable, no harm done.
Here’s the whole thing on a real box, forty seconds, with sound:
Now select everything on CIRCUITPY and delete it. Then open the themeparkwaits-3.5.x folder you unzipped (the number is the current version), select everything inside it, and copy it onto CIRCUITPY. Copy the contents of the folder, not the folder itself. The copy takes a few minutes; let it finish.
When it’s done, the drive should look exactly like this:
- boot_out.txt
- boot.py
- code.py
- lib
- README.txt
- src
- themeparkwaits-3.5.x
Files, not a folder: boot.py, code.py, and the src and lib folders sit directly on the drive. If CIRCUITPY shows a single themeparkwaits-3.5.x folder with everything inside it, the folder itself got copied instead of its contents, and the board can’t find code.py in there: open the folder, select everything inside, and copy that onto the drive instead. Don’t worry about boot_out.txt; the board writes that note itself. And once the sign has been running for a while it adds housekeeping of its own (settings.json, error_log, an updates folder). That’s normal. Leave those alone.
Reconnect WiFi from your phone
Eject CIRCUITPY like any USB drive, unplug the box from the computer, wait five seconds, and plug it back into its wall power. Always finish with the unplug and replug: don’t finish by pressing RESET, which can leave the WiFi radio in a bad state. You’ll see the new 3.0 opening reveal, which is your confirmation the install worked.
The fresh install doesn’t know your WiFi yet, so the sign opens its own temporary WiFi network and scrolls join instructions. Connect your phone to that network, and a setup page appears (go to http://192.168.4.1 if it doesn’t pop up on its own). Pick your home network, enter the password, and the sign saves it, reboots, and joins your WiFi by itself. No cables, no editing files.
Re-pick your parks
From any phone or computer on your home WiFi, open http://themeparkwaits.local (http, not https). Choose up to four parks, set brightness, colors, and scroll speed, and save. The sign rebuilds and goes back to scrolling live theme park ride wait times, now with the animated icons and transitions. This part takes two minutes, and it’s the same page you’ll use to change parks before your next trip.
That’s the whole job
From here on, updates arrive over the air again: when a new release goes out, the sign shows an “Installing… do not unplug” screen, installs it, and reboots on its own. Still no subscription, still no account, and now the whole thing, source code included, belongs to you. What’s New in 3.0 shows everything you just gained.
If something goes sideways
MATRIXS3BOOT never appears
Almost always the cable: charge-only USB-C cables power the sign but carry no data. Try a cable you know syncs data (a phone-to-computer cable usually does), another USB port, and a slightly different double-tap rhythm on RESET.
CIRCUITPY refuses to let me delete or copy
The drive is in its normal protected mode. Hold DOWN (the Boot hole on a box), press and release RESET (the bottom hole), release, and it remounts writable. The video in step 3 shows the whole move.
The copy failed partway through
No harm done; nothing is half-installed until the sign boots it. Eject the drive, unplug and replug the box, do the write-mode step again, delete everything on CIRCUITPY, and copy the folder contents again from the start.
The sign says “SAFE MODE - reconfigure”
The sign restarted too many times in a row and is protecting itself. After this update, that page works again: open themeparkwaits.local on your phone or computer, pick your parks, and press Save. The sign restarts itself and returns to normal. (On older versions the safe-mode page showed no parks to pick; this update fixes that bug.)
The sign doesn’t start after the copy
Nine times out of ten the files are one level too deep: the themeparkwaits-3.5.x folder got copied instead of its contents. Compare your drive against the picture in step 3; code.py and boot.py must sit at the top level of CIRCUITPY, not inside a folder. If they do and it still won’t start, hold UP (the Init hole on a box) while pressing RESET (the bottom hole) for a factory reset, then redo step 3.
Stuck anywhere else
Get in touch and I’ll walk you through it personally. You bought one of these back when it was a product; that still counts for something.