Digital Signage POC
LiveAn offline-first menu board that survives a full internet outage.

// what it is
A fullscreen 16:9 menu board for a TV, driven by a Raspberry Pi, where the menu artwork is designed as images and dropped into a Dropbox folder by whoever owns the shop. Each screen is one main panel and one narrower weekly feature.
// the problem
A menu board is judged on the worst day, not the average one. The failure that matters is the shop's internet dropping and someone power-cycling the TV — at which point a normal web app reloads into a blank page, and the shop has a black screen where its prices used to be.
// decisions
- 01
Precache before switching, not after
A hand-written Service Worker fetches and stores the whole app and every image for the new version before that version is allowed to become the live one. A half-downloaded update never becomes what the screen is showing.
- 02
Content hashes in the asset URLs
A plain cache lookup matches by URL across every cache bucket, so an older stored response can be served instead of a newer one. Baking each image's content hash into its URL means a changed image is genuinely a different URL — there is nothing stale left to match by accident.
- 03
The Service Worker itself must never be cached
Registered with updateViaCache disabled and served with no-store headers. A stale Service Worker is the one bug that cannot fix itself, because the thing responsible for updating is the thing that is out of date.
- 04
Dropbox as the CMS, deliberately
No admin UI. The person who designs the menu drops a PNG in a folder, which is a workflow they already have. The app polls for changes by comparing content hashes, and the token never leaves the server — the browser only ever sees same-origin asset URLs.
Have a project in mind?
I'm currently open to freelance work and new opportunities — reach out and let's talk.