Amal
← All projects

Digital Signage POC

Live

An offline-first menu board that survives a full internet outage.

Next.jsService WorkersIndexedDBPWA
Digital Signage POC screenshot

// 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.