Sovereign mesh-native AI voice recorder (open Plaud/NotePin alt) wired into JMJMJ/rspace via BLE/WiFi/LoRa
  • TypeScript 45.3%
  • C++ 30%
  • Python 15.1%
  • OpenSCAD 8.5%
  • Shell 1.1%
Find a file
Jeff Emmett edb585bfdd rmic: phone companion app + button-combo control (tested)
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>
2026-05-29 05:13:47 -07:00
docs rmic: gateway relay + transcription wiring (both tested) 2026-05-29 04:45:31 -07:00
firmware rmic: phone companion app + button-combo control (tested) 2026-05-29 05:13:47 -07:00
hardware rmic: real capture pipeline + verified ingest + device renders 2026-05-29 04:28:54 -07:00
phone-app rmic: phone companion app + button-combo control (tested) 2026-05-29 05:13:47 -07:00
relay rmic: gateway relay + transcription wiring (both tested) 2026-05-29 04:45:31 -07:00
server rmic: gateway relay + transcription wiring (both tested) 2026-05-29 04:45:31 -07:00
spec rmic: phone companion app + button-combo control (tested) 2026-05-29 05:13:47 -07:00
.gitignore rmic: gateway relay + transcription wiring (both tested) 2026-05-29 04:45:31 -07:00
LICENSE.md rmic: sovereign mesh-native AI recorder — scaffold 2026-05-29 04:06:11 -07:00
README.md rmic: phone companion app + button-combo control (tested) 2026-05-29 05:13:47 -07:00

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.ts passes 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.