Skip to content

Checklist to run AFTER the deploy, with a physical iPad connected to the same network as the server. Estimated time: 20 minutes.

Prerequisites ​

  • [ ] Server deployed and working (see Pre-deploy)
  • [ ] iPad connected to the same LAN as the server (192.168.1.0/24)
  • [ ] Flutter app built and installed on the iPad (→ see Build Flutter App if not done yet)
  • [ ] Working Flussonic stream URL for testing

1. Verify backend (2 min) ​

Open a browser on your Mac:

bash
# Device list — must return [] (requires the API key)
curl -H "X-API-Key: <API_KEY>" http://192.168.1.127/api/devices

# Link list — must return []
curl -H "X-API-Key: <API_KEY>" http://192.168.1.127/api/links

# License status (public endpoint, no key needed)
curl http://192.168.1.127/api/license
# Expected output: { "valid": true, "client": "Stadio Olimpico", ... }

# Swagger UI
open http://192.168.1.127/docs
TestExpected result✅
Backend responds on port 80HTTP 200☐
Valid licensevalid: true☐
Swagger UI accessibleDocs page☐

2. Verify Control Room UI (3 min) ​

Open the Control Room in the browser:

bash
open http://192.168.1.127/
TestExpected result✅
Basic Auth worksLogin window appears☐
Login with regia / 1234Access granted☐
Dashboard loadsSummary view without errors☐
Sidebar shows all pagesStreams, Links, Devices, Events, License☐
WS status is greenWebSocket connection established☐
License page shows detailsClient, expiry, days remaining☐

3. Verify iPad app (5 min) ​

TestHowExpected result✅
App startsTap the iPad iconEmpty 3-slot screen (no errors)☐
WS connection establishedAfter startupConnection status OK☐
Device appears in Control RoomGo to Control Room → DevicesiPad appears in the list with heartbeat☐

4. Live stream test (5 min) ​

From the Control Room:

TestHowExpected result✅
Create a linkLinks → Add link: name, m3u8 URLLink created with "inactive" status☐
Test URL with PingClick 📡 on the created linkShows time in ms (e.g. 342ms) or ERR☐
Activate MAIN slotClick "Activate on MAIN"Link becomes active, MAIN slot occupied☐
Video on iPad (MAIN)Watch iPadHLS stream starts in the MAIN slot☐
Change MAIN linkActivate another link on MAINiPad switches to the new stream☐
Free MAIN slotStreams → Free MAINVideo stops, slot free☐
FEED and ALTRepeat for FEED and ALT slotsAll 3 slots work☐

5. DVR test (3 min) ​

TestHowExpected result✅
DVR seekTap the DVR timelineVideo seeks to the selected position☐
Go LiveTap "Go Live"Video returns to live instantly☐
LIVE/DVR badgeWatch the badge at the topLIVE (red) or DVR (blue) correct☐

6. Remote control test (3 min) ​

From the Control Room, Devices page:

TestHowExpected result✅
Restart allExpand device → click "Restart all"iPad stops and restarts all 3 streams☐
Stop MAINExpand device → ⏹ MAINThe MAIN stream stops on the iPad☐
Play MAIN▶ MAINThe MAIN stream resumes☐
Restart MAIN🔄 MAINThe MAIN stream restarts☐
Stop/Restart FEED/ALTRepeat for FEED and ALTThey work like MAIN☐

7. Headphone audio test (2 min) ​

TestHowExpected result✅
Default volumeStart a streamVolume at 0 (silent)☐
Connect Bluetooth headphonesConnect headphones to the iPadVolume activates automatically☐
Volume sliderAdjust with the volume controlVolume follows the slider☐
Disconnect headphonesDisconnect headphonesVolume returns to 0☐

8. Resilience test (3 min) ​

TestHowExpected result✅
Server restartpm2 restart zerolatency-live-player-apiiPad reconnects on its own☐
iPad restartPhysically restart the iPadApp restarts, reconnects to the server☐
Network disconnectionTurn off WiFi 10s, turn back oniPad reconnects with exponential backoff☐
Unreachable linkActivate a fake URLiPad shows an error but does not crash☐

9. Multi-iPad test (if available) ​

TestHowExpected result✅
2 simultaneous iPadsStart the app on 2 iPadsBoth appear in Control Room → Devices☐
Stream switch on bothActivate MAIN linkBoth iPads receive the new stream☐
Ping on bothWatch statusBoth synchronized☐

10. Final verification ​

bash
# All tests passed? Sign below.
AreaStatusNotes
Backend API☐ ✅ / ❌
Control Room UI☐ ✅ / ❌
iPad App☐ ✅ / ❌
Video streaming☐ ✅ / ❌
DVR☐ ✅ / ❌
Remote control☐ ✅ / ❌
Headphone audio☐ ✅ / ❌
Resilience☐ ✅ / ❌
Multi-iPad☐ ✅ / ❌
READY FOR LIVE☐ YES / ❌

Notes for the operator ​

  • If a stream does not start, use Ping 📡 from the Control Room to verify the URL is reachable
  • If an iPad disconnects, the Control Room shows lastSeen — if it exceeds 60s, the device is offline
  • The Restart all button is an emergency crutch — use it only if a stream gets stuck
  • Free a slot before assigning a new link to avoid conflicts
  • The default Basic Auth password is regia / 1234 (injectable at deploy time via REGIA_HTPASSWD) — change it after the first test; with REGIA_PRESERVE=1 the deploy does not overwrite it
  • The license expires on the indicated date — renew it BEFORE expiry or the server stops

© 2026 Zerolatency — All Rights Reserved