1
2
3
4
5
6
Pi boots with no WiFi credentials
broadcasts its own SoftAP
User joins the Pi's WiFi from their phone
captive portal opens on :18091
User enters home WiFi password + claim code
claim code binds the device to their account
Pi joins the home WiFi
SoftAP shuts down
Pi confirms the claim → /v1/claim/confirm
sudo-api mints a Device JWT (HS256, 1-year)
Paired ✅
plays the ready cue · joins room_<uid>
starts ~30s heartbeat that keeps the agent warm