- TypeScript 45.3%
- C++ 30%
- Python 15.1%
- OpenSCAD 8.5%
- Shell 1.1%
spec/ble-gatt.md — BLE profile (service/control/capture-event/button-event/audio chars) + button-combo grammar: 1-tap arm, 2-tap mark, 3-tap summon, long=pair, vlong=power. Documents platform quick-launch (Android full-screen-intent, iOS time-sensitive notif + Action Button/Back Tap/Shortcuts) honestly — no zero-touch foreground from a peripheral. firmware: buttons.h pure-logic combo detector + host test (test/test_buttons.cpp) — all pass (single/double/triple tap, long, vlong, debounce). Wired into main.cpp loop; emits BLE button-event (stub) so the 3-tap summon foregrounds the phone app. phone-app/ — Expo/React Native companion skeleton: src/rmicBle.ts (real ble-plx client: scan/connect/subscribe capture+button events, control writes) + App.tsx (record toggle, gateway-forward capture-events to /api/rmic/capture, live capture list, summon-to-front). Phone alone can be the whole rmic; with a recorder paired it's screen + uplink. README repo layout updated (enclosure, ble-gatt, phone-app, relay). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| docs | ||
| firmware | ||
| hardware | ||
| phone-app | ||
| relay | ||
| server | ||
| spec | ||
| .gitignore | ||
| LICENSE.md | ||
| README.md | ||
rmic — sovereign mesh-native AI recorder
Open-source answer to Plaud NotePin / Note Pro. A wearable voice recorder that you own end-to-end: audio is content-addressed, mesh-indexed, self-transcribed, and lands as a governed holon in the JMJMJ / rspace graph. Works off-grid. No vendor, no cloud, no subscription.
Why
Plaud's hardware is deliberately dumb. The value — and the recurring fee — lives in
their cloud transcription + summarization. You don't own the loop. rmic moves the
whole loop onto your own infra (Netcup/RunPod Whisper + funion/LiteLLM) and your own
mesh (Reticulum / MeshCore / LoRa).
The key idea: three radios = a tiered sync hierarchy
The radios aren't alternatives. Each is matched to bandwidth / power / availability.
| Radio | Role | Payload | When |
|---|---|---|---|
| BLE | always-on link to phone | control + opportunistic audio chunks | phone nearby |
| WiFi | bulk dump | raw Opus audio → CAS store | home/office, charging |
| LoRa / Reticulum | infra-free reach | tiny capture-event holon (metadata + snippet + CAS hash) | off-grid, no phone, no internet |
A 10-min conversation won't fit down LoRa. But a capture-event holon (timestamp, geohash, speaker count, ~200-byte on-device transcript snippet, CAS hash of the full audio waiting at home) absolutely does. The mesh carries the index; the audio reconciles later over WiFi. This is the holonserve bandwidth-discipline pattern applied to memory capture. It's the thing Plaud structurally cannot do.
Two hardware tracks
- Track A — prototype (weeks). Heltec WiFi LoRa 32 (ESP32-S3 + SX1262 + battery,
already your first mesh node) + I2S MEMS mic. Proves the full mesh → rspace pipeline
end-to-end. See
firmware/track-a-heltec/. - Track B — wearable (custom PCB). nRF52840 (BLE + ultra-low-power, Omi-proven)
+ SX1262 LoRa + dual MEMS + QSPI flash. The real NotePin competitor. See
hardware/kicad/+firmware/track-b-nrf52840/.
On-device pipeline
mic → VAD (gate silence) → Opus encode → flash ring buffer
├─ tiny on-device transcript (optional wakeword/tinywhisper)
├─ BLE: stream chunks to phone when present
├─ WiFi: bulk push Opus → rspace CAS on charge
└─ LoRa: emit capture-event holon to Reticulum mesh
rspace / JMJMJ integration
Each recording becomes a first-class holon, reusing substrate already shipped:
- CAS store — audio blob content-addressed (jmjmj-store-cas)
- PROV-O — provenance: who/where/when, device identity (TASK-HIGH.38)
- Transcription — self-hosted Whisper (Netcup/RunPod); summarization via funion/LiteLLM. Content never leaves the boundary.
- ForgeFed / F3 — capture-holons federate across spaces
- ValueFlows — recordings as economic/attention events (doc-004)
- Justitia signing — device signs each capture → tamper-evident provenance
Repo layout
firmware/track-a-heltec/ ESP32-S3 prototype firmware (PlatformIO/Arduino) + button-combo detector
firmware/track-b-nrf52840/ nRF52840 wearable firmware (Zephyr) skeleton
hardware/kicad/ KiCad project + NETLIST.md (authoritative schematic)
hardware/bom/ Track A + Track B BOM + device-series cost/perf
hardware/enclosure/ OpenSCAD device mockups + renders
spec/capture-event-holon.md LoRa/WiFi wire format + holon schema
spec/ble-gatt.md BLE profile + button-combo grammar (phone control/summon)
phone-app/ React Native companion: BLE pair, gateway, transcription, summon
server/ rspace ingest (TypeScript) — CBOR verify, CAS, Whisper+LiteLLM
relay/ gateway bridge: Reticulum + serial modes → ingest
docs/ design notes
Status
Early build. Nothing deployed yet, but the core is real and tested:
- Firmware pipeline (
firmware/track-a-heltec/): I2S dual-MEMS → energy VAD (hysteresis) → 20ms framing → Opus → LittleFS ring buffer → signed capture-event over LoRa → WiFi bulk push. - Holon codec (
holon.cpp): hand-rolled deterministic CBOR + Ed25519 signing + SHA-256 blob hash. - Ingest server (
server/): decodes the CBOR frame, re-derives the signed bytes, verifies the signature, reconciles the audio blob.bun test/roundtrip.tspasses end-to-end (142-byte frame, tamper rejection, hash quarantine, holon state flip) — firmware CBOR ↔ server decode is byte-compatible. - Enclosure renders (
hardware/enclosure/): OpenSCAD mockups of all four variants.
Next build: order BOM-A, flash firmware, close the device→mesh→rspace loop on real hardware.
License
Dual: software under Apache-2.0, hardware under CERN-OHL-S v2. See LICENSE.md.