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 LIVEYES / ❌

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