Every sign, every update

Update your sign

This is how the app gets updated on every Theme Park Waits sign: plug it into a computer, replace the app on its drive, plug it back in. About ten minutes. Bought box or one you built yourself, coming from 2.x or from last month’s release, it’s the same job and this is the page for it.

The sign no longer updates itself over WiFi. Earlier 3.x releases did, and it worked until it didn’t: downloading over an encrypted connection eventually wedges the board’s networking stack, and once that happens the sign can’t open a new connection to anything until it reboots. The bug is in CircuitPython, underneath our code, and we can’t fix it from here. So the sign stopped making encrypted downloads entirely, which is exactly why it now runs for weeks without anyone touching it. That reliability costs ten minutes a release, over USB, and this is the ten minutes.

What you’re actually doing

Your sign keeps its files on a small drive that shows up on your computer like a USB stick. The whole job is: make that drive writable, swap the old app for the new one, and plug the sign back in. No installer, nothing added to your computer, and nothing you can permanently break. If a copy goes wrong you just do it again.

Which version are you on?

It changes one step and nothing else. Open http://themeparkwaits.local from any phone or computer on your WiFi and scroll to Diagnostics at the bottom; it prints the version. If the sign is too dead to answer, or the page looks nothing like that, treat it as 2.x.

  • Already on 3.x, moving to the current release: leave one file alone and your parks, colors, and WiFi password survive the update. You’ll be back to scrolling theme park ride wait times without touching your phone.
  • On 2.x, which covers every finished box sold back when this was a product, plus any older build that never got updated: erase the drive completely, then reconnect WiFi and pick your parks again at the end. A few extra minutes, once. From then on you’re in the first case like everyone else.
Coming from a box you bought: you don’t need to change the CircuitPython on your board. It already runs the version the app wants (CircuitPython 9.2.8), so the old “flash a .uf2 first” step is gone. If you already flashed CircuitPython 10 following an earlier version of these instructions, see I already flashed CircuitPython 10 at the bottom.
Is the sign you’re updating dead or misbehaving? Copy error_log, error_log.old, and boot_out.txt off the drive before you erase anything. They’re the only record of what went wrong, and the update destroys them. What to send, and where.

What you need

  • Your Theme Park Waits sign.
  • 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 sign fine but no drive will ever appear. If no drive shows up, the cable is the first suspect.
  • About ten minutes.
1

Download the app

One zip, which unpacks to a folder named themeparkwaits-3.5.x (the number is the current release). If your browser didn’t unzip it automatically, double-click the file. Inside there’s also a README.txt with the short version of these steps, for when this page is on the wrong screen.

Download the app (zip)

2

Put the drive in write mode

Unplug the sign from its wall power and plug it into the computer with the USB-C cable. The display may light up and start scrolling; that’s fine, ignore it. A drive named CIRCUITPY appears, holding the app that’s on there now.

Out of the box that drive is read-only to your computer, which is the single most common place this job stalls. To flip it: hold the DOWN button, tap RESET, then let go of DOWN once the display comes back. On a finished box those buttons hide behind the three small holes on the side edge: DOWN is the top hole (labeled Boot), UP is the middle one (labeled Init), and RESET is the recessed, unlabeled hole at the bottom, next to where the cable enters. A straightened paperclip or a thin screwdriver reaches them.

Here’s the whole thing on a real box, forty seconds, with sound:

You’ll know it worked at the next step: if the computer lets you delete files off CIRCUITPY, you’re in write mode. If it says the disk is read-only, do this step again.

3

Replace the app

Coming from 3.x: select everything on CIRCUITPY except settings.json and delete it. That one file holds your parks, your colors, and your WiFi password, and the zip deliberately doesn’t contain a copy, so leaving it there is what carries your setup across the update.

Coming from 2.x: select everything on CIRCUITPY and delete it, settings.json included. You’ll pick your parks and WiFi again at the end, and the 3.x sign is different enough that starting clean is worth the two minutes.

Either way, now open the themeparkwaits-3.5.x folder you unzipped, select everything inside it, and copy that onto CIRCUITPY. Copy the contents of the folder, not the folder itself. If your computer offers Replace or Merge, choose Replace. The copy takes a few minutes; let it finish.

When it’s done, the drive should look like this (plus your settings.json, if you kept it):

Right
CIRCUITPY
  • boot_out.txt
  • boot.py
  • code.py
  • lib
  • README.txt
  • safemode.py
  • src
Wrong
CIRCUITPY
  • themeparkwaits-3.5.x
“The disk is read-only”? That’s write mode not having taken. Go back to step 2 and do it again.
4

Restart it properly

Eject CIRCUITPY like any USB drive, unplug the sign 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 opening reveal, which is your confirmation the install worked. If you kept settings.json, the sign rejoins your WiFi and goes back to your parks on its own, and you’re done: skip the last step.

5

Reconnect WiFi and re-pick your parks

Only if you erased settings.json. A fresh install doesn’t know your WiFi, 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.

Then, 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. Two minutes, and it’s the same page you’ll use to change parks before your next trip.

That’s the whole job

Parks and theme park ride wait times take care of themselves from here: they come from a server that already tracks them, so the sign fetches them every ten minutes and new parks show up without you touching anything. Only the app itself needs you, and only when a release you actually want comes out. Still free, still no subscription, still no account, and the whole thing, source code included, belongs to you. What’s New in 3.0 shows what the current release does.

If something goes sideways

No CIRCUITPY drive appears

Almost always the cable: charge-only USB-C cables power the sign but carry no data, so the sign lights up and no drive ever shows. Try a cable you know syncs data (a phone-to-computer cable usually does) and another USB port.

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), then release DOWN. The video in step 2 shows the whole move. Holding DOWN is the part that matters; it has to still be held when the sign boots.

I kept settings.json and the sign came back with no parks

Either the file got deleted with everything else, or the copy replaced it. No harm: the sign is now in first-run state, so follow step 5 and set it up fresh. Two minutes.

I already flashed CircuitPython 10

Earlier versions of this guide told you to, so if you did, you followed the instructions correctly. Since then CircuitPython 10.2.1 turned out to have a bug in its networking code: after a while the board can’t open new connections, and the sign stops being able to fetch theme park ride wait times until it reboots. The app now ships on CircuitPython 9.2.8 instead.

To go back, flash 9.2.8 the same way you flashed 10:

Download CircuitPython 9.2.8 (.uf2)

Plug the sign into your computer and double-tap the reset button (the bottom of the three side holes), two quick presses like a mouse double-click. The display goes dark and a drive named MATRIXS3BOOT appears. Drag the .uf2 onto it; the board reboots by itself and comes back as CIRCUITPY. Flashing wipes the drive, so redo steps 2 through 5 afterward, including picking your parks and WiFi again.

No rush if your sign is working fine today. The bug shows up as the sign quietly going stale rather than anything dramatic.

The copy failed partway through

No harm done; nothing is half-installed until the sign boots it. Eject the drive, unplug and replug the sign, 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.

Do I have to take every release?

No. Nothing expires, nothing nags you, and a sign left on an older 3.x keeps fetching theme park ride wait times exactly as it does today. Read what changed and update when something in it is worth ten minutes to you. If you’re running your own customized copy, ignore the zip entirely and pull the changes yourself.

Stuck anywhere else

Get in touch and I’ll walk you through it personally. If you bought one of these back when it was a product, that still counts for something.

See what you’re updating into

The ride animations, transitions, and effects, rendered straight from the app.

What’s new in 3.0 →