__ __ _ _ ____ __ __ _ _ ____
| \/ | | | | _ \| \/ | | | | _ \
| |\/| | | | | |_) | |\/| | | | | |_) |
| | | | |_| | _ <| | | | |_| | _ <
|_| |_|\___/|_| \_\_| |_|\___/|_| \_\
Voice belongs everywhere.
Murmur is an open-source voice modality layer and reference app for devices, applications, and agents. It gives software a consistent way to discover voice sources, capture audio, produce transcripts and structured intent, and route approved actions—without coupling every product to one wearable, model vendor, or cloud.
Omi is Murmur's flagship wearable connector and the first real hardware integration. It is a major part of the project, but not its boundary. Murmur is designed to accept voice from AI wearables, the phone microphone, headsets, computers, servers, network streams, and future hardware through adapters behind one source-neutral contract.
Note
Murmur is early-stage. The versioned protocol, conformance fixtures, and initial Dart, TypeScript, Python, and Rust SDK models are in place. The Flutter reference app can discover nearby Omi wearables, connect or disconnect over Bluetooth Low Energy, and show the live connection state. Audio streaming, the capture coordinator, provider adapters, and additional connectors remain active roadmap work—not finished features.
Voice is more than a recorder screen. It is an input modality that applications should be able to consume as predictably as touch, keyboard, pointer, or gaze. Murmur separates that modality into reusable layers:
- Connect to an available voice source.
- Capture normalized audio frames with explicit session state.
- Transform speech through interchangeable transcription, language, and text-to-speech providers.
- Emit typed events such as partial transcripts, final transcripts, proposed intents, and action results.
- Act through permissioned integrations while treating model output as untrusted input.
An app should not need to understand Omi BLE characteristics to receive speech, and an Omi connector should not need to know which transcription provider or agent consumes its audio.
Voice products are commonly built as closed vertical stacks: one microphone, one app, one cloud, one model, and one subscription. That makes useful hardware hard to extend and forces every app team to rebuild capture, permissions, provider integrations, session state, and safety controls.
Murmur provides an open alternative:
- Voice-source choice — wearables, phones, headsets, computers, and streams connect through adapters.
- Bring your own models — use hosted or local speech, language, and voice providers through small interfaces.
- Embeddable runtime — applications consume normalized voice events instead of device-specific transport details.
- Reference app — the Flutter client proves the same public contracts used by other applications.
- Remote control — approved voice commands can reach paired computers, servers, and automations through a secure protocol.
- Local-first ownership — users control keys, recordings, transcripts, retention, deletion, and export.
- Open connectors — hardware support is inspectable, testable, and reusable by the community.
Murmur is one project with several cooperating surfaces:
| Surface | Purpose | Status |
|---|---|---|
| Protocol | Versioned source, session, audio, transcript, intent, and action contracts | murmur.v1 implemented |
| Conformance suite | Shared fixtures and compatibility behavior across languages | Initial runtime-event suite implemented |
| SDKs | Native Murmur models for Dart, TypeScript, Python, and Rust | Initial models implemented |
| Voice runtime | Race-safe capture, endpointing, provider, and output coordination | Designed; implementation planned |
| Connector contract | A stable way to add wearables, microphones, and network sources | Manifest and protocol implemented |
| Omi connector | BLE discovery, connection, and audio transport for Omi hardware | Connection implemented; audio planned |
| Provider adapters | Transcription, language-model, embedding, and speech output integrations | Planned |
| Flutter packages | Embeddable protocol and native capability APIs for Flutter apps | Package and plugin scaffolded |
| Expo / React Native package | Native iOS and Android bindings plus Expo configuration | Module and config plugin scaffolded |
| Flutter app | Pair sources, configure providers, capture, review, search, and act | Omi connection implemented |
| Omarchy plugin | Voice and wearable state in the Omarchy Quattro bar | Widget and panel scaffolded |
| Remote agent protocol | Permissioned commands and audited results across computers and servers | Design stage |
The protocol is the product boundary. SDKs, connectors, apps, and agents are replaceable implementations. Flutter is the first reference experience, not a requirement for using Murmur.
voice sources and host runtimes
┌──────────┬──────────┬──────────┬──────────┬───────────┐
│ Omi BLE │ phone mic│ headsets │ desktop │ net stream│
└────┬─────┴────┬─────┴────┬─────┴────┬─────┴─────┬─────┘
└───────────┴───────────┼───────────┴───────────┘
▼
connectors + providers
│
▼
Murmur SDK implementation
│
▼
murmur.v1 protocol + conformance fixtures
│
┌────────────────┼────────────────┐
▼ ▼ ▼
Flutter apps Expo/RN apps desktop/agents
│ │ │
└──────────────┼─────────────────┘
│
▼
typed transcripts, intents, and results
Protocol and conformance code does not depend on a particular language, device, provider, UI, or remote transport. Connectors describe their capabilities; consumers decide what to do with the events they support. See docs/architecture.md for the proposed contracts, dependency rules, and package boundaries. The voice runtime design captures the lifecycle, endpointing, provider fallback, offline model-pack, and echo-protection patterns needed by production voice applications and opens them for community development.
The connector model covers multiple source families:
- AI wearables — Omi first, followed by community-supported devices with documented protocols and compatible licenses.
- Phone and tablet microphones — a zero-hardware path for development, accessibility, and everyday use.
- Headsets and microphones — operating-system audio inputs, including wired, Bluetooth, and USB devices where the platform exposes them.
- Desktop and server capture — local agents that publish permissioned audio sessions or voice events.
- Network and recorded sources — test fixtures, files, and authenticated streams for automation and reproducible development.
Not every connector exposes the same controls. Capability discovery keeps battery state, hardware buttons, speaker output, codec selection, and background capture optional instead of leaking device assumptions into the core.
- A protocol-first contract defined with Protocol Buffers and ProtoJSON.
- Shared conformance fixtures that every SDK and transport must pass.
- Small SDKs for Dart, TypeScript, Python, and Rust, with more languages added without changing the protocol.
- Thin Flutter and Expo / React Native native bindings built on the same protocol SDKs instead of separate voice stacks.
- A Flutter reference client for iOS and Android.
- Transport-specific connectors, with Omi-compatible BLE implemented first
through
flutter_reactive_ble. - Direct provider calls where practical, with an optional self-hosted gateway only when platform limitations require one.
- API keys stored using iOS Keychain / Android Keystore-backed secure storage and never committed or synchronized by default.
- A local-first data model with explicit opt-in for cloud synchronization.
- Typed events and structured commands instead of passing untrusted model text directly into tools.
| Area | Choice |
|---|---|
| Canonical contract | Protocol Buffers plus ProtoJSON |
| Compatibility | Language-neutral conformance fixtures |
| SDKs | Dart, TypeScript, Python, and Rust |
| Mobile packages | Flutter plugin and Expo Modules API for React Native |
| Reference mobile app | Flutter, Riverpod, and go_router |
| Initial Bluetooth connector | flutter_reactive_ble behind Murmur contracts |
| Reference local data | Drift and SQLite |
| Reference secret storage | flutter_secure_storage |
| Transports | In-process, WebSocket, gRPC, stdio, local socket, or FFI |
| Desktop shell | Omarchy Quattro bar plugin |
| Remote control | Authenticated agents with an optional relay |
| Backend | None required for local capture and processing |
The repository is a framework-neutral monorepo:
spec/ murmur.v1 protobuf schemas
conformance/ cross-language fixtures
sdks/ Dart, TypeScript, Python, and Rust models
packages/ Flutter and Expo / React Native bindings
connectors/ connector manifests and implementations
apps/flutter/ iOS and Android reference app
agents/ remote-agent boundary
integrations/ desktop and operating-system integrations
Validate the protocol and shared fixtures with:
make check-protocol check-conformanceThe reference app uses the application ID dev.october.murmur. To run it:
Prerequisites:
- Flutter 3.35 or newer
- the iOS or Android toolchain for the platform you want to run
cd apps/flutter
flutter pub get
flutter runRun the Omi connection flow on a physical iOS or Android device: Bluetooth discovery is not available in standard mobile simulators. Wake the Omi, keep it nearby, allow Bluetooth or Nearby devices access when prompted, and tap Scan for Omi. The app currently shows devices advertising Omi's BLE service.
The current milestone stops at a verified BLE connection. It does not yet subscribe to the microphone characteristic, record audio, or send data to a provider.
Before submitting changes:
make checkIndividual make check-* targets are available when a contributor only has the
toolchain for one SDK. CI runs every supported language independently.
The reusable package surfaces live beside the reference app and consume the same versioned protocol models. After the first pub.dev release, Flutter apps install:
flutter pub add murmur_protocol murmur_flutterThe Flutter plugin exposes native capability and permission channels and
re-exports murmur_protocol. Omi discovery remains in the reference app until
the connector extraction is complete.
Expo and React Native mobile apps install:
npm install @october-dev/murmur-protocol @october-dev/murmur-react-nativeExpo apps add the native configuration plugin:
{
"expo": {
"plugins": ["@october-dev/murmur-react-native"]
}
}The native package uses the Expo Modules API on iOS and Android. It requires a
development or production build and does not run in Expo Go. Bare React Native
apps use the same package after installing Expo Modules; they do not need the
managed Expo workflow. The TypeScript protocol remains usable in web projects,
but @october-dev/murmur-react-native is intentionally mobile-only.
The Omarchy Quattro integration is installable from a local checkout:
omarchy plugin add "$PWD/integrations/omarchy" --enableIts current bar widget is read-only and does not execute commands or read API keys. See integrations/omarchy for validation, security, and marketplace packaging notes.
These package names and source layouts are scaffolded but are not published to pub.dev, npm, or the Omarchy marketplace yet.
Transcription and intelligence sit behind provider-neutral adapters. The same voice session can be processed by a user-selected hosted service, a local model, or a self-hosted endpoint without changing the connector.
Provider families include:
- speech-to-text and diarization
- language models and structured intent
- embeddings and search
- text-to-speech and wearable response channels
- user-owned storage or synchronization backends
Murmur does not require users to send recordings to an October-operated service.
Murmur turns voice into a secure remote-management modality. A user can speak through an Omi, phone, headset, or another connector while away from their desk and ask a paired computer or server to check a deployment, start a backup, run an approved automation, or report status.
voice source → Murmur → transcript + structured intent → permission check
│
▼
encrypted relay or tunnel
│
┌─────────────────┴─────────────────┐
▼ ▼
agent on a computer agent on a server
│ │
└──────── result + audit ───────────┘
Remote control is opt-in and not implemented yet. Its design treats model output as untrusted input rather than executing generated shell commands directly. It requires:
- explicitly paired and revocable clients
- encrypted, authenticated communication
- allowlisted tools and structured commands
- confirmation for destructive or sensitive actions
- least-privilege agents on every target machine
- a durable audit log of requests, approvals, results, and failures
Users can self-host the remote agent and relay. A managed relay may be considered later, but it is not required for local voice features.
A voice modality can capture sensitive conversations regardless of whether its microphone is in a wearable, phone, or computer. Murmur makes recording and streaming state explicit and gives users control over collection, providers, retention, deletion, and export. Users are responsible for obtaining consent and following applicable recording and privacy laws.
Before a production release, the project documents its threat model, key storage, data flows, retention defaults, deletion behavior, telemetry, and provider-specific privacy implications.
- Choose Flutter for the cross-platform reference app
- Scaffold the iOS and Android app
- Discover Omi hardware and show its live BLE connection state
- Define the language-neutral
murmur.v1protocol and typed event envelope - Add shared conformance fixtures
- Scaffold Dart, TypeScript, Python, and Rust SDK models
- Make Flutter a reference consumer under
apps/flutter - Scaffold a reusable Flutter plugin on top of
murmur_protocol - Scaffold Expo / React Native native bindings and configuration
- Scaffold an Omarchy Quattro bar widget and panel
- Refactor Omi behind the shared connector interface
- Add a phone-microphone reference connector
- Validate Omi BLE audio streaming and normalize its audio frames
- Add provider-neutral transcription interfaces and a deterministic fake
- Add the capture coordinator with safe cancellation, tail flushing, and warm push-to-talk
- Add provider selection with offline-first fallback
- Add an atomic on-device voice model-pack manager
- Add speech feedback with interruption and echo-loop protection
- Build secure bring-your-own-key configuration
- Ship the capture → transcript → summary reference flow
- Add local history, search, export, retention, and deletion
- Document and test the process for adding more voice connectors
- Design and implement the authenticated remote-agent protocol
- Implement the reusable capture runtime across the first SDKs
- Publish reviewed Dart, Flutter, and npm packages
- Connect and security-review the Omarchy local service bridge
- Identify reusable fixes and contribute them upstream to Omi
BasedHardware/omi is the primary reference for Murmur's first wearable connector. Its open-source Flutter app, firmware, SDKs, and device protocol provide valuable prior art for understanding Omi hardware and BLE audio.
Murmur is an independent community project and is not affiliated with or endorsed by Based Hardware or Omi. We respect upstream licensing, clearly attribute reused work, report relevant findings, and contribute generally useful fixes or documentation back to Omi whenever possible.
The current device detection follows Omi's advertised BLE service and is attributed in THIRD_PARTY_NOTICES.md.
Community tasks live in GitHub Issues.
Issues marked good first issue are deliberately bounded; help wanted issues
benefit from domain or platform experience. Comment on an issue before starting
large work so connector and public-API decisions stay coordinated.
Contributions are especially useful around:
- core voice-session, audio-frame, capability, and event contracts
- Omi protocol behavior and BLE audio
- phone, headset, desktop, network, and wearable connectors
- reliable background capture on iOS and Android
- provider-neutral transcription and AI interfaces
- voice-session races, endpointing, model packs, and engine fallback
- accessible speech feedback and echo-loop prevention
- secure on-device keys and conversation storage
- remote-agent permissions, commands, and auditing
- privacy, consent, accessibility, and data-retention design
Read CONTRIBUTING.md before opening a pull request. To add a voice source, start with the connector authoring guide.
Licensed under the Apache License 2.0.