Bring the full Monday system up from nothing. Assumes the code is deployed to both Pi and laptop, the phone is available as a hotspot, and the wearable-case hardware is wired but not powered.
For the purpose of this document "not powered" means the Belifu unit is off and the kill switch is open. The Pi, laptop, and Arduino are free to be on.
Different audience from safety_checklist.md (invariants) and hardware_day.md (session procedure). This doc is the network and process bringup, nothing safety-critical.
- Phone hotspot
- Pi
- Pi services
- Laptop network join
- Laptop network probe
- Laptop app stack
- End-to-end verification
- Enable personal hotspot on phone. Note the SSID and password.
- Confirm cellular data is enabled. The laptop needs upstream internet for Claude API calls.
- Keep the phone charged. Budget roughly 20% battery per hour with hotspot active.
-
Power the Pi via the USB-C battery pack in the wearable case. Wall power works for a bench test.
-
Wait for boot, about 30 seconds.
-
SSH in from the laptop, or use an attached keyboard and monitor for first-time setup.
-
Verify the Pi joined the hotspot:
ip addr show wlan0 # should show an IP on the phone's subnet ping -c 2 <phone's gateway IP>
-
If the Pi did not auto-join, connect via
nmcliorraspi-config.
-
SSH to the Pi.
-
cdinto the monday repo. -
Run:
./pi/start_services.sh
-
All three services should report
OK. -
Note the Pi IP address(es) printed at the end.
-
Disconnect from any other WiFi.
-
Join the phone hotspot.
-
Confirm upstream internet works:
curl -s https://api.anthropic.com/v1/messages | headAn auth error in the body is fine. A network-layer error (connection refused, no route) means the hotspot has no upstream.
-
Confirm the Pi is reachable:
ping -c 2 <pi IP>
-
Export the three service URLs (or set them in
.env/config.yaml):export MONDAY_RECEIVER_URL=http://<pi IP>:5001 export MONDAY_CAMERA_URL=http://<pi IP>:5002 export MONDAY_AUDIO_URL=http://<pi IP>:5003
-
Probe each:
curl -s $MONDAY_RECEIVER_URL/health curl -s $MONDAY_CAMERA_URL/health curl -s $MONDAY_AUDIO_URL/health
-
All three should return
{"alive": true, ...}.
-
Ensure
ANTHROPIC_API_KEYis set (env or.env). -
Run:
python -m app.main
-
The overlay window opens.
-
Startup log should show, in order:
build_stack: vision ready (url=http://<pi>:5002) build_stack: orchestrator ready VoiceListener started ... audio_url=http://<pi>:5003 build_stack: voice ready (url=http://<pi>:5003) build_stack: manual trigger ready -
If any line is replaced by a warning about
did not respond to /health, go back to step 5 and check that specific service.
Run the full command path with the Belifu off and the kill switch open. No current flows. This is a safe dry run of the network and software path.
- Press SPACE in the overlay window.
- In the terminal, type
grab the cupand press Enter. - Overlay should walk through
capturing,processing,acknowledging, thenexecuting. - The Pi receiver log (tail
pi/logs/receiver.stdout.log) should show threePOST /stimulateentries. - The Arduino relays should audibly click.
- State returns to
idle.
If that works, the network, software, and hardware wiring are all correct. Proceed to hardware_day.md for the session procedure with actual EMS current.
pingto Pi times out. Phone hotspot may have client isolation (AP isolation) enabled. Check phone settings. Some carrier hotspots block peer-to-peer traffic by default.curlto Pi services times out butpingworks. Services are not running. SSH back to the Pi and checkpi/logs/*.stdout.logandpi/logs/*.log.ANTHROPIC_API_KEYworks on normal WiFi but not on the hotspot. Phone cellular data may be paused or exhausted. Check the phone.- Audio stream drops repeatedly during a session. Hotspot bandwidth instability. Move closer to the phone or switch phone hotspot to 5 GHz if supported.
app/voice.pywill reconnect automatically and log each reconnect. - Vision fetches but takes more than one second per frame. Hotspot latency or interference. Try another WiFi channel on the phone. Last resort, lower
MONDAY_PI_CAMERA_WIDTH/HEIGHTon the Pi to shrink JPEG payloads. - Receiver accepts commands but Arduino does not click. Check
pi/logs/receiver.stdout.logforERR:responses. Most often a USB cable issue or the Arduino reset into the bootloader after a sketch re-flash.
- Quit laptop
app.main(Q or ESC in the overlay). - SSH to Pi, Ctrl-C on
start_services.sh. - Power off the Pi:
sudo shutdown -h now, wait for the green LED to stop, unplug battery. - Turn off the phone hotspot.