Vision monitoring for coffee roasting using a GoPro Hero 13 over USB. Captures images during a roast, analyzes bean color with Claude Vision API, and logs timestamped observations synced to Artisan roast events.
Standalone alternative to r1-eye (jailbroken Rabbit R1 over WiFi ADB). Session log format is identical, so coffee-roasting analysis pipeline consumes logs from either.
Start the sentinel, then press ON in Artisan to connect:
run_gopro gopro.py sentinel start --bean "Ethiopia Yirgacheffe"The sentinel captures images throughout the roast, adapting frequency by phase (30s drying, 20s maillard, 10s development). Each image is analyzed by Claude Vision for bean color assessment. A live terminal UI shows development score and color in real time.
Session log saved to captures/sentinel_YYYY-MM-DD_HHMM.json on DROP or Ctrl+C.
| Flag | Description |
|---|---|
--bean NAME |
Bean name for the session log |
--crack |
Enable crack detection (Phase 3, experimental) |
--port PORT |
WebSocket port (default: 8765) |
--debug |
Log raw WebSocket messages |
run_gopro gopro.py sentinel status # Last session summary
run_gopro gopro.py sentinel log # Full observation logrun_gopro gopro.py look # Capture photo (camera test)
run_gopro gopro.py ask "What do you see?" # Capture + Claude Vision
run_gopro gopro.py status # Camera status + batteryRun the simulation with reference bean images and real Claude Vision API (mocks the GoPro):
# Terminal 1
run_gopro sim_sentinel.py
# Terminal 2
.venv/bin/python fake_artisan.py --fast # 30-second compressed roastfake_artisan.py also accepts --native (Artisan native event tags) and --port PORT.
- Python 3.12+
- uv package manager
- Security bootstrap completed (
run_goprowrapper exists) ANTHROPIC_API_KEYin~/.config/code-projects/gopro/.env
cd ~/CodeProjects/gopro
uv venv .venv --seed
uv add open-gopro anthropic numpy pillow websocketsPlug in the GoPro via USB-C, power it on, then:
run_gopro gopro.py status- GoPro Hero 13 Black — stays powered via USB, no battery concerns
- USB-C cable to roaster machine
- Hottop KN-8828B-2K+ with Artisan 4.0
In Artisan: Config > Ports > WebSocket tab
| Field | Value |
|---|---|
| Host | 127.0.0.1 |
| Port | 8765 |
| Path | WebSocket |
Configure button WebSocket Command actions for ON, START, CHARGE, DRY, FCs, FCe, COOL END (sends DROP), and OFF (triggers .alog linking). See CLAUDE.md for the full button mapping.
Deploy to the roaster machine via rsync:
./deploy.sh # Quick: .py files only (~1s)
./deploy.sh --full # Full: all files + reinstall depsOn the roaster, run from the project directory with the full wrapper path:
cd ~/CodeProjects/gopro
~/.local/bin/run_gopro gopro.py sentinel start --bean "Ethiopia Yirgacheffe"{
"session_id": "2026-02-28_1518",
"bean_name": "Ethiopia Yirgacheffe",
"roast_uuid": "a1b2c3d4-...",
"batch_nr": 42,
"artisan_events": {"charge": 0.0, "dry": 270.5, "fcs": 450.2, "drop": 570.8},
"observations": [
{
"elapsed_seconds": 1.5,
"phase": "drying",
"type": "vision",
"image_file": "captures/sentinel_20260228_151800.jpg",
"color_assessment": "Pale green, raw unroasted beans",
"development_score": 1,
"uniformity": "Consistent color across all visible beans"
}
]
}The roast_uuid and batch_nr fields are extracted from the .alog file when Artisan's OFF button is pressed. These enable deterministic matching between sentinel logs and roast logs in the analysis pipeline.
For code-level details, SDK API notes, and tuning parameters, see CLAUDE.md.