Testing the image
The single best moment to find a problem with your kiosk image is before you Sysprep and clone it across a fleet. Once a defect is in 50 deployed signs, fixing it costs 50× more than fixing it on one build machine.
This page is the pre-capture validation suite. Run all of it on the build machine before the capture step. Plan on 30–45 minutes to do it thoroughly.
Test 1 — Cold boot to QR
The most important property of the image: from a powered-off device, you reach a fullscreen QR claim screen with no human input.
- Power the device off (full shutdown, not sleep —
shutdown /s /t 0) - Power on
- Start a stopwatch when the BIOS POST appears
Acceptance:
- Auto-login completes within ~10 seconds of the Windows boot screen
- The DisplaySync sign app launches within ~5 seconds of auto-login
- A fullscreen QR claim screen appears (the API URL is shown in small text at the bottom)
- No "Set Network Location" wizard appears
- No Microsoft tip / consumer feature toast appears
- No Windows Update reboot prompt appears
- Cursor disappears within 3 seconds of last mouse movement
Total BIOS POST → QR screen should be under 60 seconds on modern thin client hardware. If it's significantly longer, the most common causes are Fast Startup re-enabling itself, a pending Windows Update install, or a misconfigured power plan.
Test 2 — Status dashboard
While the QR screen is showing, press Ctrl + Shift + S to open the Status Dashboard overlay. Confirm:
- Connection Status: Connected
- Sign ID: a fresh UUID (write it down — you'll compare after a reboot)
- Backend URL: matches what you wrote to
.env - WS URL: WebSocket connected, not retrying
- IP Address: the device's local IP
- Tailscale IP: populated if Tailscale is configured, blank otherwise
- Cache Status: Active (it'll say
Items Cached: 0since nothing is assigned yet)
Press Esc to dismiss the overlay.
Test 3 — Heartbeat in the dashboard
From a separate machine, log into the dashboard with the org you'll claim against. You should see the build sign appear under Unclaimed Signs with:
- A short code matching the QR screen
- Last heartbeat: less than 5 seconds ago
- Device info populated (platform, memory, CPU, screen resolution)
If the sign doesn't appear, see Troubleshooting → Sign won't claim.
Test 4 — Claim, assign, verify
Run a full claim flow against an event you've created for testing.
- From the mobile app, scan the QR code
- Pick the test event
- The sign should transition from QR screen → "Claimed" briefly → assigned content (or a "ready, no content assigned" state)
- From the dashboard, assign a known-good URL (e.g.,
https://demo.displaysync.live) - The sign updates within ~5 seconds
- From the dashboard, Reboot the sign
- After reboot, the sign auto-resumes the assigned URL — no QR screen, no claim flow
This proves the offline cache is persisting both identity (%APPDATA%\DisplaySync Sign) and the assigned URL across reboots.
Don't keep this claim
Once you've finished testing, unclaim the sign from the dashboard, then see Capturing the image → Clean before Sysprep for clearing the local identity. Otherwise every cloned image boots pre-claimed to your test event.
Test 5 — Offline mode
The desktop sign keeps the most recent content cached locally and continues to display it when the backend is unreachable. Validate this:
- With assigned content displaying correctly, pull the network cable (or disable WiFi)
- Wait 30 seconds
- Acceptance:
- Content continues to display — no "disconnected" overlay, no QR screen
- The status dashboard (Ctrl + Shift + S) shows Connection Status: Disconnected and Cache Status: Items Cached > 0
- Plug the cable back in
- Within 10 seconds:
- The dashboard shows the sign back online
- The status dashboard shows Connection Status: Connected
If the kiosk goes blank or shows an error during the disconnected window, the cache isn't picking up the content URL — see Troubleshooting → Content not loading.
Test 6 — Content reachability
The desktop sign does an HTTP HEAD on the assigned content URL every 60 seconds and notifies subscribers when the URL stops responding. Validate this end-to-end:
- Assign a URL you control (or use a demo URL)
- Confirm the dashboard shows the sign as Online with Content reachable
- Take the content URL down (block it at your firewall, or stop its origin)
- Within 90 seconds, the dashboard should:
- Mark the sign's content as Unreachable
- Generate a notification (in-app + email if subscribed)
- Restore the content URL
- Within 90 seconds, the dashboard:
- Marks content Reachable again
- Generates a recovery notification
This proves both the reachability monitor and your notification subscriptions are wired correctly.
Test 7 — Remote command round trip
From the dashboard, exercise the Remote Control commands one by one:
| Command | Expected result |
|---|---|
| Refresh | The displayed content reloads within ~2 seconds |
| Reboot app | The sign app exits, the watchdog relaunches it within ~60 seconds |
| Reboot device | The Windows machine restarts cleanly, returns to displayed content within ~90 seconds |
| Fetch logs | The dashboard receives and displays app.log content |
| Settings update | A non-content setting (e.g., display orientation) propagates to the sign |
If Reboot device fails with a UAC prompt or no-effect, the kiosk user is missing shutdown privilege — re-run the shutdown privilege grant and retest.
Test 8 — Maintenance mode round trip
Validate the maintenance-mode escape hatch:
- While the sign is showing content, plug in a keyboard
- Press Ctrl + Shift + Q
- The app exits cleanly, the desktop appears, the dashboard reflects the sign as Maintenance
- Confirm
C:\ProgramData\DisplaySync\.maintenanceexists - Reboot the device
- After reboot, the sign should be back in normal operation,
.maintenancecleared, dashboard shows the sign as online
Verify before capture
Final pre-capture checklist:
# No active claim — APPDATA folder either empty or just contains a fresh-build config
Get-ChildItem "$env:APPDATA\DisplaySync Sign" -ErrorAction SilentlyContinue
# No maintenance sentinel
Test-Path "C:\ProgramData\DisplaySync\.maintenance"
# Scheduled task is Ready (or Running), not Disabled
(Get-ScheduledTask -TaskName "DisplaySync Sign").State
# No pending Windows Updates
Get-WindowsUpdate 2>$null # PSWindowsUpdate; or check Settings → Windows Update
If everything passes, you're ready to capture. Continue to Capturing the image.