The biggest update since launch: this release is about trusting the overlay during a live service. Every client now survives network blips and server restarts, the server remembers what's on air, and the PIN feature actually locks things down.
🛡️ Stream reliability
- Reconnect that never gives up — overlay, control panel, mobile remote, and stage display all retry forever with backoff. A server restart mid-service no longer strands the OBS browser source.
- Live-verse replay — the server tracks the verse (or ticker) currently on air, including the slide position, and replays it to any client that connects or reconnects. Open the stage display mid-sermon and it shows the right slide immediately.
- Server-driven slide auto-advance (
autoAdvanceSlidesin config.json now actually works) — the server broadcasts slide changes so the overlay and stage stay in perfect sync. - Fixed a message storm triggered by clicking an annotation color, timer races that could blank a freshly displayed verse, and a hidden verse reappearing on theme switch.
🔒 Security
remotePinnow guards every WebSocket connection and all mutating API calls — previously it was trivially bypassed. The "Setup Overlay in All Scenes" button bakes the PIN into the OBS source URL automatically; the control panel and remote prompt for it once and remember it.
✅ Correctness
- Favoriting "John 3:16" no longer corrupts into "John 3" — colon-safe key parsing everywhere
- History shows the newest verses first (was showing the oldest 20)
- OBS status is correct on page load; going live while disconnected shows an honest warning instead of a false LIVE badge
- Service-plan CSV import/export round-trips quoted commas and quotes losslessly
- OBS auto-reconnects after any successful connection; Ctrl+C shuts down cleanly
✨ Features & tooling
- Stage display route (
/stage), ticker speed control, safe-area support on all six themes, static ticker under reduced-motion - Control panel and remote dropdowns are fed by the server — you only see translations and themes that actually work
npm testsmoke suite (pages, API, WebSocket contract), Dockerfile, CONTRIBUTING.md, restored SMOKE_TEST.md and Digital Ocean deployment guide- README rewritten so every port, endpoint, config option, and shortcut matches the code
⚠️ Upgrade notes
- The
data/folder is no longer tracked in git — your history/favorites/plans are safe locally and recreated automatically - If you set a
remotePin, re-run Setup Overlay in All Scenes so your OBS sources pick up the PIN (manually added sources need?pin=appended) - Default port is 4456 (unchanged, but now documented correctly everywhere)
Full changelog: v1.0.0...v2.2.0