Lightweight, offline-first digital signage for Raspberry Pi 5.
Upload an MP4 from any device → it plays full-screen on a TV via HDMI.
┌──────────────┐ Cloudflare ┌─────────────────────────┐
│ Your Phone │ ──── Tunnel ────→ │ Raspberry Pi 5 │
│ or Laptop │ (trycloudflare) │ │
│ /admin │ │ Flask :5000 │
└──────────────┘ │ ├─ /admin (upload) │
│ └─ / (player) │
│ │
│ Chromium (kiosk) ──→ TV│
└─────────────────────────┘
| Login | Admin Panel | Player |
|---|---|---|
![]() |
![]() |
![]() |
# On your Raspberry Pi 5 (Bookworm)
sudo apt update && sudo apt install -y chromium-browser python3-pip
# Install cloudflared
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 \
-o /usr/local/bin/cloudflared && sudo chmod +x /usr/local/bin/cloudflared
# Install dependencies (from requirements.txt)
pip3 install -r requirements.txt --break-system-packageschmod +x start.sh
./start.shThe script will:
- Start a Cloudflare Quick Tunnel (free, no account needed)
- Save the public URL to
tunnel_url.txt - Start the Flask server on port 5000
- Launch Chromium in kiosk mode showing the player
- Look at the TV — the splash screen shows the admin URL for 20 seconds
- Open the admin URL on your phone/laptop (
https://xxxx.trycloudflare.com/admin) - Upload an MP4 — it replaces the current video immediately
- The player auto-detects changes and refreshes within 30 seconds
Add to your desktop autostart:
mkdir -p ~/.config/autostart
cat > ~/.config/autostart/signage.desktop << 'EOF'
[Desktop Entry]
Type=Application
Name=DirectUpload Signage
Exec=/home/pi/directupload-signage/start.sh
X-GNOME-Autostart-enabled=true
EOFdirectupload-signage/
├── app.py # Flask server
├── start.sh # Boot orchestrator
├── tunnel_url.txt # Auto-generated tunnel URL
├── static/
│ └── video.mp4 # Current video (overwritten on upload)
└── templates/
├── admin.html # Upload panel
└── player.html # Kiosk display


