# ADR-0038: Voice Functionality Extracted to the omni-voice Repository

## Status

✅ Accepted (2026-06-13)

Supersedes [ADR-0031](adr-0031.md), [ADR-0032](adr-0032.md),
[ADR-0033](adr-0033.md), [ADR-0034](adr-0034.md), [ADR-0035](adr-0035.md), and
[ADR-0037](adr-0037.md), whose decisions now live in
[rust-works/omni-voice](https://github.com/rust-works/omni-voice). Those records
remain in this repository as historical context.

## Context

Starting with issue #800, omni-dev grew a `voice` command tree — microphone
capture, ASR transcription, speaker embedding/enrolment, reflection, and session
review (`omni-dev voice capture | transcribe | reflect | review | enroll |
install-model`). The supporting decisions are recorded in ADR-0031 through
ADR-0035 and ADR-0037.

That functionality pulled a large, specialised dependency stack into omni-dev's
build — `cpal` (with the Linux `libasound2-dev` system requirement), `candle-*`,
`tract-onnx`, `tokenizers`, `hf-hub`, `rubato`, `hound`, `rustfft`, and others.
None of it is used by omni-dev's core mission (git commit-message analysis and
amendment, Atlassian/Datadog integration, the browser bridge, transcript
fetching). The voice stack inflated compile times, the dependency surface
(audit/policy review, the ALSA system dependency in CI), and the release binary
size for every user, the vast majority of whom never invoke a voice command.

omni-dev is also published to crates.io under a 10 MiB upload cap; the voice test
fixtures (~10 MB of WAV audio) had to be explicitly excluded to stay under it.

The voice capability is valuable on its own and has a distinct lifecycle, model
ecosystem, and platform-support matrix. It warrants a dedicated home rather than
riding inside a general-purpose developer toolkit.

## Decision

We will extract all voice / audio / speech-to-text functionality out of omni-dev
into the dedicated [rust-works/omni-voice](https://github.com/rust-works/omni-voice)
repository, and **remove** it from omni-dev entirely:

- The `voice` command tree, all `src/voice/` and `src/cli/voice/` modules, their
  tests, snapshots, and audio fixtures.
- The voice-only dependencies (`cpal`, `rubato`, `hound`, `signal-hook`,
  `ringbuf`, `ulid`, `candle-core`, `candle-nn`, `candle-transformers`, `hf-hub`,
  `tokenizers`, `byteorder`, `tract-onnx`, `rustfft`).
- The voice-only CI steps (the `libasound2-dev` / ALSA-headers installs that
  existed solely for `cpal`).

ADR-0031, ADR-0032, ADR-0033, ADR-0034, ADR-0035, and ADR-0037 are marked
`Superseded by` this ADR. They remain in the repository as a historical record;
the decisions they describe continue to apply within omni-voice.

This is a **breaking change** to the omni-dev CLI: `omni-dev voice …` no longer
exists. Users who need voice functionality should use omni-voice.

## Consequences

- omni-dev's dependency tree and release-binary size shrink measurably (the
  candle/tract/cpal stack is gone), compile times improve, and the dependency
  audit/policy surface narrows.
- CI no longer needs the Linux ALSA system dependency; release and publish jobs
  are simpler.
- The ~10 MB voice audio fixtures leave the repository and the crates.io exclude
  list, easing the upload-size budget.
- `omni-dev voice …` is removed — a breaking change announced in `CHANGELOG.md`
  with a pointer to omni-voice.
- Voice decisions are no longer split across two concerns inside one repo; each
  project's ADR set reflects only the decisions it owns. The extraction decision
  is recorded in both repositories (this ADR here; a counterpart in omni-voice).
- ADR-0036 (Confused-Deputy Browser Bridge) is unaffected and remains Accepted —
  it is unrelated to voice.
