The worship stream,
on the lobby TV automatically.

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.

Raspberry Pi RTMP nginx + mpv Web image manager Full console access Apache-2.0 Releases
Get Started View on GitHub
$ 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

What it does

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.

🌐

Web-based image manager

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.

📊

System status at a glance

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.

💻

Full console access

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.

📺

Automatic switching

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.

🚀

Zero-touch deploy

make deploy rsyncs the repo, symlinks the player, reloads nginx, and restarts the service — no password prompts, thanks to a narrow sudoers whitelist.

Self-healing

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.

🖥

Predictable HDMI

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.

🧰

One-command setup

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.

🔌

Reachable without DHCP

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.

How it fits together

Your switcher pushes a stream; the Pi receives it, plays it full-screen, and falls back to a splash when nothing is live.

🎥

ATEM / OBS

Pushes RTMP to rtmp://pi/live

📡

nginx-rtmp

Receives the stream on the Pi

mpv in cage

Plays live feed, else the splash

📺

HDMI

The lobby TV

Manage it your way

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.

🌐

Volunteers: the web image manager

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

💻

Admins: full console access

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 both

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

Quick Start

From a freshly flashed SD card to a working kiosk.

1

Flash & boot

Raspberry Pi OS Lite (64-bit), SSH enabled, hostname displaypi. Add an SSH alias on your workstation.

2

Provision

One command installs the kiosk, deploys the repo, and brings up the volunteer web manager.

3

Point your switcher

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

💡 One command, fresh Pi to working kiosk

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.

Full Setup Guide Web Manager & HTTPS Splash Guide (offline / SSH)