Commit Graph

48 Commits

Author SHA1 Message Date
Hermes 4487f0e0a4 fix: seat camera node case preview lid
CI/CD / lint-and-typecheck (pull_request) Successful in 7s
CI/CD / test (pull_request) Successful in 6s
CI/CD / build (pull_request) Failing after 9s
CI/CD / deploy (pull_request) Has been skipped
2026-05-23 11:57:43 +00:00
Hermes 8c8d4e45e5 feat: add camera node case v4 status panel CAD
CI/CD / lint-and-typecheck (pull_request) Successful in 7s
CI/CD / test (pull_request) Successful in 7s
CI/CD / build (pull_request) Failing after 4m49s
CI/CD / deploy (pull_request) Has been skipped
2026-05-23 11:54:18 +00:00
Hermes fe193701ae CUB-230: hub-side deduplication for offline buffering replay
Build (Dev) / build (push) Failing after 10s
CI/CD / lint-and-typecheck (push) Successful in 6s
CI/CD / test (push) Successful in 6s
CI/CD / build (push) Failing after 8s
CI/CD / deploy (push) Has been skipped
- Add dedup check in handleStatus using (camera_id, recorded_at) uniqueness
- Skip insert if duplicate detected - logs replayed entries
- Go mod: updated version to 1.19
2026-05-23 07:40:06 +00:00
overseer 1a8f67a392 Merge pull request 'feat: add v3 hardware case and update hub network' (#6) from agent/hermes/remoterig-hardware-v3-network into dev
Build (Dev) / build (push) Failing after 9s
CI/CD / lint-and-typecheck (push) Successful in 9m29s
CI/CD / test (push) Successful in 9m27s
CI/CD / build (push) Failing after 4m50s
CI/CD / deploy (push) Has been skipped
Reviewed-on: #6
2026-05-22 19:43:40 -04:00
Hermes 4c4368a79f fix: make tripod case dovetail connector fit
CI/CD / lint-and-typecheck (pull_request) Successful in 7s
CI/CD / test (pull_request) Successful in 7s
CI/CD / build (pull_request) Failing after 8s
CI/CD / deploy (pull_request) Has been skipped
2026-05-22 17:15:23 -04:00
Hermes 0e2e94a4cf docs: align hardware and MQTT architecture notes
CI/CD / lint-and-typecheck (pull_request) Successful in 7s
CI/CD / test (pull_request) Successful in 10m3s
CI/CD / build (pull_request) Failing after 4m58s
CI/CD / deploy (pull_request) Has been skipped
2026-05-22 17:08:11 -04:00
Hermes c5cbeabd92 feat: add v3 hardware case and update hub network
CI/CD / lint-and-typecheck (pull_request) Failing after 14m12s
CI/CD / test (pull_request) Has been cancelled
CI/CD / build (pull_request) Has been cancelled
CI/CD / deploy (pull_request) Has been cancelled
2026-05-22 16:58:11 -04:00
Hermes f4bf37d6a3 feat: add interactive 3D case viewer (Three.js)
Build (Dev) / build (push) Failing after 0s
CI/CD / lint-and-typecheck (push) Failing after 0s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
CI/CD / deploy (push) Has been skipped
Rotatable 3D render of the tripod-mounted dual-ESP case:
- Case body with rounded corners and lid
- Stacked ESP32 + ESP8266 boards inside
- LED indicator, USB port, ventilation slots
- Tripod pole with C-clamp mount
- USB cables, screws, chip details
- Drag to rotate, scroll to zoom
- Open in any browser
2026-05-22 01:06:59 +00:00
Hermes 893574ee79 feat: redesigned case — tripod-clip box for dual ESPs, USB power bank
Build (Dev) / build (push) Failing after 1s
CI/CD / lint-and-typecheck (push) Failing after 0s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
CI/CD / deploy (push) Has been skipped
Replaced GoPro-sleeve case design with simpler stand-mounted box:
- Case clips to tripod leg/stand pole (20-35mm diameter)
- No camera sleeve needed — case sits on the stand
- Powered by standard USB power bank (off-the-shelf)
- Holds ESP8266 + ESP32 stacked with UART wiring
- Cable ports for USB in/out, LED window, ventilation

Simplified BOM: ~1/node (down from 4), no buck converters needed
2026-05-22 01:03:53 +00:00
Hermes b3d4226b1c feat: dual-board architecture — ESP8266 camera bridge + ESP32 MQTT bridge
Build (Dev) / build (push) Failing after 1s
CI/CD / lint-and-typecheck (push) Failing after 0s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
CI/CD / deploy (push) Has been skipped
Complete rewrite of firmware into two dedicated boards per camera node:

ESP8266 (Camera Bridge):
- Connects ONLY to GoPro AP — polls status, sends over UART
- Zero network switching, zero MQTT
- HTTP GET /bacpac/SH for status, start/stop
- JSON-per-line UART protocol to ESP32

ESP32 (MQTT Bridge):
- Connects ONLY to travel router — MQTT to Pi hub
- Reads status from ESP8266 over UART2 (RX16/TX17)
- Auto-registration, heartbeat, command forwarding
- Zero camera communication

UART Protocol: JSON-per-line at 115200 8N1
  ESP8266→ESP32: status/ack/pong/error
  ESP32→ESP8266: cmd (start_recording/stop_recording/ping)

Hardware updates:
- BOM now includes both boards (~4/node)
- 3D case has stacked dual-board compartment
- UART wire channel between board recesses
- Shared 3.3V power rail for both boards
2026-05-22 00:49:06 +00:00
Hermes 324402f268 feat: add ESP8266 support + Akaso camera compatibility config
CI/CD / lint-and-typecheck (push) Failing after 0s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
Build (Dev) / build (push) Failing after 8s
CI/CD / deploy (push) Has been skipped
- Unified firmware for ESP32 (dual-STA) and ESP8266 (time-shared STA)
- ESP8266: alternates between GoPro AP and travel router per poll cycle
- PlatformIO dual-target: esp32dev + esp8266dev (d1_mini)
- camera_ip config field for Akaso/non-GoPro cameras
- LittleFS support for ESP8266 (replaces SPIFFS)
- Camera compatibility table (GoPro H3/H4, Akaso)
- LED polarity handled per-platform (ESP8266 active-low)

ESP8266 time-sharing adds ~4s latency per 30s cycle — invisible at poll rate.
2026-05-22 00:28:48 +00:00
Hermes 37c5362216 merge: resolve conflicts with main (take dev versions)
Build (Dev) / build (push) Failing after 1s
CI/CD / lint-and-typecheck (push) Failing after 1s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
CI/CD / deploy (push) Has been skipped
CI/CD / test (pull_request) Successful in 8s
CI/CD / build (pull_request) Failing after 11s
CI/CD / deploy (pull_request) Has been skipped
CI/CD / lint-and-typecheck (pull_request) Successful in 10s
Conflicts in cmd/server/main.go, go.mod, internal/db/db.go
— main had older/simpler versions from PR #4 (README)
— dev has full codebase with MQTT, SSE, embed
2026-05-22 00:03:39 +00:00
overseer d9c06b28fd Merge pull request 'CUB-208: Add README with project overview and setup instructions' (#4) from hermes/cub-208-readme into main
Reviewed-on: #4
2026-05-21 17:56:07 -04:00
Hermes d419dfe519 feat: add PlatformIO ESP32 firmware with dual-STA + MQTT + GoPro control
CI/CD / lint-and-typecheck (pull_request) Failing after 2s
CI/CD / test (pull_request) Has been skipped
CI/CD / build (pull_request) Has been skipped
CI/CD / deploy (pull_request) Failing after 12m6s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
CI/CD / deploy (push) Has been skipped
Build (Dev) / build (push) Failing after 14s
CI/CD / lint-and-typecheck (push) Failing after 0s
firmware/
├── platformio.ini     — ESP32 (esp32dev), PubSubClient + ArduinoJson
├── src/main.cpp       — Full camera node firmware (360 lines)
│   ├── SPIFFS config persistence
│   ├── Dual Wi-Fi STA (travel router + GoPro AP)
│   ├── GoPro Hero 3 HTTP API (start/stop/status)
│   ├── 60-byte binary status blob parser
│   ├── MQTT per contract (status QoS1, heartbeat QoS1, announce QoS2)
│   ├── Command subscription (start/stop/reboot)
│   ├── Auto-registration (announce → hub assigns cam-NNN)
│   ├── Heartbeat every 60s, status every 30s
│   ├── LED status indicator
│   └── Exponential backoff reconnection
├── data/config.json   — Default SPIFFS config template
└── README.md          — Quick start, config reference, troubleshooting
2026-05-21 21:54:05 +00:00
Hermes e4324e626f feat: add 3D printable case design (OpenSCAD) and hardware assembly guide
- GoPro Hero 3 sleeve with lens/screen/USB cutouts
- ESP32 D1 Mini electronics compartment (vented)
- LiPo battery compartment with velcro strap slots
- Bill of materials (~0 per camera node)
- Wiring diagram (LiPo → dual buck converters → ESP32 + GoPro)
- Field deployment workflow

OpenSCAD model in hardware/case/remoterig-case.scad
Assembly guide in hardware/README.md
2026-05-21 21:50:26 +00:00
Hermes 5bc327e909 feat: add Pi provisioning, systemd service, and deploy scripts
Build (Dev) / build (push) Failing after 1s
CI/CD / lint-and-typecheck (push) Failing after 0s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
CI/CD / deploy (push) Has been skipped
2026-05-21 21:42:43 +00:00
Hermes 6b6b66ab89 feat: embed React frontend in Go binary with SPA fallback 2026-05-21 21:39:07 +00:00
Hermes 74d6130dd5 deploy(dev): rename OpenClaw to RemoteRig, add config.yaml deployment
- BINARY_NAME: openclaw → remoterig
- DEPLOY_PATH: /opt/openclaw/openclaw → /opt/remoterig/remoterig
- SERVICE: openclaw → remoterig
- Deploy tmp path: /tmp/openclaw-deploy → /tmp/remoterig-deploy
- Add config.yaml deployment step: copies config.yaml alongside binary on dev host if present in repo
- Backup/rollback logic preserved (keeps last 3 backups)
- Failure notification path updated to /tmp/remoterig-deploy-failure.txt
2026-05-21 21:38:48 +00:00
Hermes a90a1d567e build(dev): switch to ARM64 cross-compile for Pi Zero 2 W deployment
- Rename BINARY_NAME from openclaw to remoterig
- Cross-compile with GOOS=linux GOARCH=arm64 for Raspberry Pi Zero 2 W
- Build React frontend at repo root (npm ci && npm run build) producing dist/
- Remove old web/ working-directory and explicit embed step (handled by go:embed)
- Repository dispatch event_type unchanged: dev-build-success
2026-05-21 21:38:39 +00:00
Hermes 607aea514b feat: harden SSE endpoint with typed events and Last-Event-ID
Build (Dev) / build (push) Failing after 0s
CI/CD / lint-and-typecheck (push) Failing after 1s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
CI/CD / deploy (push) Has been skipped
- Added monotonic event ID (Last-Event-ID) for reconnection support
- Events now emit typed: 'event: camera_status' for client-side filtering
- Initial connection event sends 'event: connected' with ID
- Reconnection acknowledgment via Last-Event-ID header
- CORS preflight (OPTIONS) handler
- Access-Control-Allow-Headers: Last-Event-ID
- Initial heartbeat shortened to 15s for faster detect (30s for steady)

Closes CUB-233.
2026-05-21 21:18:24 +00:00
Hermes f200cd9782 feat: add MQTT subscriber for ESP32 camera status ingestion
Implements MQTT subscriber (internal/mqtt/subscriber.go) that:
- Connects to Mosquitto broker with auto-reconnect
- Subscribes to remoterig/cameras/+/status, +/heartbeat, +/announce
- Parses and validates incoming messages per MQTT contract
- Inserts status_logs with duplicate prevention
- Auto-detects recording state changes and manages recording_events
- Broadcasts camera status changes via SSE hub
- Camera auto-registration via announce (MAC-based, sequential cam-NNN)
- Heartbeat watchdog marks cameras offline after 120s silence
- Wired into main.go with graceful degradation (warns if broker unreachable)

Dependency: github.com/eclipse/paho.mqtt.golang v1.5.0

Closes CUB-232.
2026-05-21 21:16:08 +00:00
Hermes ce188086cb docs: update CONTEXT.md with closed-network architecture and current state
Build (Dev) / build (push) Failing after 1s
CI/CD / lint-and-typecheck (push) Failing after 0s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
CI/CD / deploy (push) Has been skipped
- Replaced architecture diagram with travel router LAN design
- Added MQTT contract reference
- Updated issue status table with agent assignments
- Revised known limitations to reflect actual gaps
- Added network config section (subnet, static IP)
- Removed CUB-182 (canceled duplicate)

Post-sync: 13 done, 15 backlog, 1 in review, 1 canceled.
2026-05-21 21:11:33 +00:00
Hermes df212796d2 docs: add MQTT message format contract with closed-network architecture
Defines topic hierarchy, payload schemas, QoS levels, heartbeat
protocol, camera auto-discovery via announce topic, offline
buffering strategy, and command/response flow for start/stop.

Architecture: travel router subnet (192.168.4.x), Pi Zero 2 W
runs Mosquitto + Go backend, ESP32s dual-STA to GoPro AP +
travel router. No internet dependency.

Closes CUB-238.
2026-05-21 21:08:38 +00:00
overseer 861aedd6d8 CUB-208: Add README with project overview and setup instructions 2026-05-21 17:47:29 +00:00
Otto 02fa6e4d4f docs: add comprehensive project context file (CONTEXT.md) for agent reference
CI/CD / lint-and-typecheck (push) Failing after 0s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
CI/CD / deploy (push) Has been skipped
Build (Dev) / build (push) Failing after 35s
2026-05-21 13:19:26 -04:00
overseer 07ecff3b5f Merge pull request 'CUB-196: CameraCard component with live SSE status display' (#3) from agent/hermes/CUB-196-cameracard into dev
Build (Dev) / build (push) Failing after 1s
CI/CD / lint-and-typecheck (push) Failing after 0s
CI/CD / test (push) Has been skipped
CI/CD / build (push) Has been skipped
CI/CD / deploy (push) Has been skipped
Reviewed-on: #3
2026-05-21 10:26:55 -04:00
Hermes 1854a1cb2b ci: add Gitea Actions pipeline (lint, typecheck, test, build, deploy)
CI/CD / lint-and-typecheck (pull_request) Failing after 0s
CI/CD / test (pull_request) Has been skipped
CI/CD / build (pull_request) Has been skipped
CI/CD / deploy (pull_request) Has been skipped
2026-05-21 14:16:44 +00:00
overseer fcc5feb1be Merge branch 'dev' into agent/hermes/CUB-196-cameracard 2026-05-21 10:10:39 -04:00
overseer cf3df557dd Merge pull request 'CUB-195: add useSSE hook and Zustand camera store for live SSE events' (#2) from agent/rex/CUB-195-react-sse-hook into dev
Reviewed-on: #2
2026-05-21 10:10:32 -04:00
Hermes db4663380b CUB-196: fix future timestamps, negative battery clamp, boundary tests
Grimm review fixes:
- formatRelativeTime: guard future timestamps (clock skew) → 'unknown'
- battery display: clamp negative values to 0%
- formatTimeLeft: floor fractional seconds
- Tests: +4 (future timestamp, negative battery, 15%/50% boundaries)
2026-05-21 14:07:57 +00:00
Rex 08d5ceb792 CUB-196: remove unused vi import from test 2026-05-21 12:07:52 +00:00
Rex 047241005b CUB-196: add CameraCard unit tests (vitest + testing-library, 16 tests) 2026-05-21 12:07:05 +00:00
Rex ad813cd206 CUB-196: wire CameraCard into App grid with SSE live updates 2026-05-21 12:03:17 +00:00
rex-bot 4ab7d41329 CUB-196: add accessibility and edge case fixes for CameraCard 2026-05-21 11:59:40 +00:00
rex-bot e82208f897 CUB-196: add CameraCard component with battery bar, recording indicator, online status 2026-05-21 11:51:40 +00:00
rex-bot fa0956c6fd CUB-195: add useSSE hook and Zustand camera store for live SSE events 2026-05-20 22:56:46 +00:00
overseer 5bbfc11597 Merge commit '5793617be3154877fa10e4f46b7608de86fa54ca' into dev 2026-05-19 07:36:48 -04:00
overseer 5793617be3 CUB-194: scaffold Vite + React + TypeScript + Tailwind frontend
otto/review PR approved by Otto - frontend scaffold verified clean
ci/build Build + type-check + lint verified clean
- Initialize Vite project with React + TypeScript + Tailwind CSS
- Dark theme dashboard design (rig-dark palette, rig-accent colors)
- Minimal App with RemoteRig header + 'Dashboard coming soon' placeholder
- Directory structure: components, hooks, services, types, utils
- TypeScript types for Camera, CameraFeed, SystemHealth, StreamConfig
- Custom hooks: useCameraStatus, useSystemHealth (with mock data)
- API service layer with proxy config for /api → localhost:8080
- eslint, postcss, autoprefixer configured
- lucide-react icons integrated (Camera icon)
- .env.example, .gitignore, tsconfig basepaths configured
- Build + type-check + lint verified clean
2026-05-19 07:31:52 -04:00
overseer 111cce4c84 CUB-187+188+191+193: Recording handlers, status ingestion, SSE endpoint
ci/verify Branch verified
2026-05-18 17:52:48 -04:00
overseer 5cc57446e5 CUB-186: Camera list and register API handlers + Chi router wiring 2026-05-18 17:48:58 -04:00
overseer 7a0a76bbd5 CUB-182: Chi router setup with auth middleware and graceful shutdown 2026-05-18 17:47:06 -04:00
overseer c0b2b4cf57 CUB-184: API key auth middleware 2026-05-18 17:45:25 -04:00
overseer e55dae340b CUB-185: Camera/StatusLog/RecordingEvent/Setting Go models 2026-05-18 17:45:10 -04:00
overseer dcd64ee199 CUB-183: SQLite schema migration + DB init 2026-05-18 17:44:50 -04:00
overseer ede6696792 CUB-181: Add yaml.v3 dependency via go mod tidy 2026-05-18 17:43:53 -04:00
overseer ad55e94c9c CUB-181: Scaffold Go module, directory layout, config, and main.go entry point 2026-05-18 17:43:46 -04:00
overseer 69b050b62b CUB-181: Scaffold Go module, directory layout, config, and main.go entry point 2026-05-18 17:41:23 -04:00
overseer 58a5d9e97a first commit 2026-05-18 17:54:13 +00:00