A Raspberry Pi that shows a splash image until your service goes live, cuts to the stream the instant it starts, and falls back to the splash when it ends — no laptop, no operator, no Sunday-morning scramble.
$ make provision HOST=displaypi STREAM_KEY=restoration [provision] setup -> deploy -> setup-web -> volunteer-web-url base kiosk installed, repo deployed, web manager up (HTTPS) Volunteer URL: https://displaypi/?token=7f40… $ # point the ATEM at rtmp://displaypi/live and press LIVE
Built for one job and done with the fewest moving parts: a single Pi that receives an RTMP push and drives an HDMI display, with no state machine to babysit.
A volunteer opens one bookmarked URL — no terminal, no SSH key, works from a phone. Upload PNG/JPEG/GIF/WebP splash images, delete or download existing ones, drag-and-drop (or ↑↓) to reorder the rotation, then Restart Service or Reboot Pi, all from the browser. The access link is rotatable in one click, and the manager is served over HTTPS by default with a locally-signed certificate.
The same health board shown on the HDMI boot screen streams live into the web manager: network, gateway, link speed, nginx/RTMP, disk, memory, CPU temperature, time sync, watchdog, and player liveness — each green, amber, or red, auto-refreshing every 15 seconds.
Everything the browser tool does has a command-line counterpart, plus the deeper stuff: make deploy, make logs, make status, and make ssh drop an admin straight into the Pi.
Shows the splash image while idle and cuts to the live feed the moment a publisher starts pushing RTMP — then back to the splash when the stream stops. No button to press.
make deploy rsyncs the repo, symlinks the player, reloads nginx, and restarts the service — no password prompts, thanks to a narrow sudoers whitelist.
A hardware watchdog, a healthcheck cron that pings an uptime monitor, and a player that relaunches on crash keep the display alive through power blips and network hiccups.
Display mode is a single source of truth: set it once and the boot config and the runtime wlr-randr layer agree, so the TV comes up in the right resolution every time.
make provision takes a blank Pi all the way to a working, volunteer-managed kiosk in a single ordered step. Every piece is idempotent and safe to re-run.
Set STATIC_IP and the Pi binds a fixed address on Ethernet alongside its normal DHCP lease — so you can still SSH in on a dumb switch, a field rig, or a laptop patched straight into the port, with no router in sight.
Your switcher pushes a stream; the Pi receives it, plays it full-screen, and falls back to a splash when nothing is live.
Pushes RTMP to rtmp://pi/live
Receives the stream on the Pi
Plays live feed, else the splash
The lobby TV
Swapping this Sunday's splash image and digging into a config file are different jobs for different people — display-pi gives each one its own door in.
One bookmarked link, no login screen. The link carries a token; on first visit the manager hands the browser a hardened, persistent cookie so the secret drops out of the address bar. From a phone or any browser a volunteer can:
• Upload a new splash (PNG/JPEG/GIF/WebP, exactly 1920×1080, ≤ 10 MB)
• Delete or download an existing slide
• Drag-and-drop (or ↑↓) to reorder the rotation
• Restart Service or Reboot Pi
• Watch the live System Status board
• Copy the link or download a .webloc/.url shortcut
• Rotate Token to instantly invalidate a leaked link
Nothing is locked behind the browser tool — every action it offers,
and everything it doesn't, is one make command away over
SSH:
• make ssh — interactive shell on the Pi
• make logs / make status — tail logs, check service health
• make deploy — push code changes, restart the player
• make diag — full diagnostics dump
Stand up the volunteer web manager
make setup-web # one-time: installs the kiosk-web service make volunteer-web-url # writes a shortcut file with the live token
HTTPS is on by default (a locally-signed cert — no domain needed)
make web-ca # fetch the Pi's root CA, trust it once per device make setup-web-tls DOMAIN=kiosk.example.org # alternative: publicly-trusted Let's Encrypt cert
make provision does bothIt runs setup-web and volunteer-web-url as part of the standard sequence, so every kiosk leaves provisioning with the browser tool already live — the console is just always there too. See the Web Manager guide for HTTPS, token rotation, and the status board. Prefer no browser at all? The older SSH-bundle splash workflow still works as an offline fallback.
From a freshly flashed SD card to a working kiosk.
Raspberry Pi OS Lite (64-bit), SSH enabled, hostname displaypi. Add an SSH alias on your workstation.
One command installs the kiosk, deploys the repo, and brings up the volunteer web manager.
Aim the ATEM (or OBS) at rtmp://pi/live and press LIVE. The Pi cuts to the feed.
Provision the Pi (runs setup → deploy → setup-web → volunteer-web-url)
make provision HOST=displaypi STREAM_KEY=restoration
No DHCP on the target network? Add a fixed fallback address
make provision HOST=displaypi STATIC_IP=192.168.50.1/24 # binds it alongside DHCP
Day to day
make deploy # push code changes + restart the player make status # is the kiosk service healthy? make logs # tail player + nginx logs make volunteer-web-url # regenerate the volunteer shortcut files
make provision runs the four one-time setup steps in the order they depend on each other, and every step is idempotent — so re-running it on an existing Pi just tops everything off.