feat: mobile setup — QR onboarding, Wi-Fi scoped mobileconfig #73

Merged
razvandimescu merged 5 commits from chore/site-updates into main 2026-04-11 03:21:51 +08:00
razvandimescu commented 2026-04-11 02:18:58 +08:00 (Migrated from github.com)

Summary

  • Mobileconfig Wi-Fi scoping: OnDemandRules restrict DNS profile to Wi-Fi only — cellular falls back to system DNS instead of failing
  • /qr endpoint: SVG QR code pointing to mobileconfig URL, Cache-Control: no-store so it reflects LAN IP changes
  • Dashboard popover: "Phone Setup" button in header (only visible when [mobile] enabled = true), QR on desktop, direct download link on mobile viewports
  • iOS install steps: 3-step guide in popover (download → install profile → enable Certificate Trust Settings)
  • Stats API: exposes mobile.enabled and mobile.port in /stats response

Test plan

  • make all passes (clippy, fmt, audit, tests)
  • Deploy, open dashboard — "Phone Setup" button visible when [mobile] enabled = true, hidden otherwise
  • Click "Phone Setup" on desktop — QR popover appears, scannable, dismiss on outside click
  • Open dashboard on phone-sized viewport — shows direct "Install Profile" link instead of QR
  • Install mobileconfig on iPhone — DNS works on Wi-Fi, falls back on cellular
  • Change LAN IP, reopen popover — QR reflects new IP

🤖 Generated with Claude Code

## Summary - **Mobileconfig Wi-Fi scoping**: `OnDemandRules` restrict DNS profile to Wi-Fi only — cellular falls back to system DNS instead of failing - **`/qr` endpoint**: SVG QR code pointing to mobileconfig URL, `Cache-Control: no-store` so it reflects LAN IP changes - **Dashboard popover**: "Phone Setup" button in header (only visible when `[mobile] enabled = true`), QR on desktop, direct download link on mobile viewports - **iOS install steps**: 3-step guide in popover (download → install profile → enable Certificate Trust Settings) - **Stats API**: exposes `mobile.enabled` and `mobile.port` in `/stats` response ## Test plan - [x] `make all` passes (clippy, fmt, audit, tests) - [x] Deploy, open dashboard — "Phone Setup" button visible when `[mobile] enabled = true`, hidden otherwise - [x] Click "Phone Setup" on desktop — QR popover appears, scannable, dismiss on outside click - [x] Open dashboard on phone-sized viewport — shows direct "Install Profile" link instead of QR - [x] Install mobileconfig on iPhone — DNS works on Wi-Fi, falls back on cellular - [x] Change LAN IP, reopen popover — QR reflects new IP 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.