Supported Devices • Key Features • How To Use • Protocol Notes • Credits • License
| Brand | Example models | Status |
|---|---|---|
| Sennheiser | MOMENTUM 4 Wireless | ✅ Fully driven (noise dial, EQ, sidetone, wear detection…) |
| Sony | WH-1000X series, WF-1000X series, LinkBuds, INZONE… | ✅ Capability-probed on connect |
| Nothing / CMF | Ear (1)–(3), CMF Buds Pro, Headphone (a)… | ✅ Full controls incl. gestures & fit test |
| Soundcore | Liberty Air 2 Pro, Space One, and more | ✅ ANC, EQ, tap customization, LDAC |
| OPPO / realme / OnePlus (HeyMelody) | Enco Air series, Buds/Nord Buds, realme Buds… | 🧪 Battery, ANC, EQ — built from protocol reverse-engineering, unverified on real hardware |
Note
Every model Sony's own catalog carries is recognized out of the box — its cloud catalog is the model list. Soundcore support targets the A3951 protocol family.
- Works entirely in the browser — Web Serial and Web Bluetooth (BLE GATT), nothing to install, no accounts
- Live capability probing: the UI is built from what your headphones actually report, not from a hardcoded spec sheet
- Per-brand drivers, each speaking the vendor's own protocol:
- Sennheiser (GAIA v3) — noise control with transparency dial, EQ, bass boost, sidetone, wear detection, auto power off, low latency
- Sony (MDR) — noise cancelling / ambient, EQ, auto power off, power off, DSEE upscaling, connection mode
- Nothing / CMF — ANC modes, presets + custom EQ, Advanced EQ, Dirac Opteo, bass enhance, touch assignment, low latency, find my buds, ear tip fit test
- Soundcore (BLE) — battery, ANC scenes & custom transparency, 8-band custom EQ + 29 presets (incl. artist profiles), tap customization with enable/disable, wear detection, voice prompts, LDAC toggle
- HeyMelody (SPP) — the shared OPPO/realme/OnePlus app: device identification via a 137-model catalog, battery, ANC modes, EQ presets with full per-band curves
- Settings snapshots cached locally per device, so last-known state survives reloads
- Frame-level debug console for capturing raw protocol frames (
localStorage["otocontrol:debug-frames"] = "1")
To clone and run this application, you'll need Git, Node.js and a Chromium-based browser (Chrome, Edge, Brave…). From your command line:
# Clone this repository
$ git clone https://github.com/kunalagra/OtoControl
# Go into the repository
$ cd OtoControl
# Install dependencies
$ npm install
# Run the app
$ npm run devThen open the printed localhost URL and hit Connect over serial or Connect over Bluetooth.
Important
Web Serial and Web Bluetooth only work over localhost or HTTPS, and only in Chromium browsers. Your headphones must be paired to the OS as an audio device first.
Note
For Soundcore earbuds over BLE, the buds may need to be advertising: open the case or re-enter pairing range before connecting.
This project speaks vendor protocols that were never published. Everything known lives in docs/PROTOCOL-UNKNOWNS.md — including a list of gaps that take two minutes of your headphones' time to close.
If you own one of these devices: open the built-in debug console, capture the raw hex line for a setting you changed, and contribute it. Readings that come back empty are useful too.
Protocol knowledge stands on these projects (read as reference, never copied):
- OpenSCQ30 — Soundcore A3951 command tables
- SoundcoreManager — framing, test captures, device metadata
- Gadgetbridge — Soundcore wire semantics
- ear-web & BudsLink — Nothing/CMF and Sony MDR specs
- ZenControl — Sennheiser audio modes
- OppoPodsManager and the OppoPods lineage it credits (Leaf-lsgtky, 1812z) — OPPO/realme/OnePlus protocol corroboration
Built with:
- Codegamy - A complete coding & interview platform
- MediCall - An AIO medical platform to connect doctors and patients
- Sikho - Professional learning marketplace
AGPL-3