Skip to content

Voice input

Dictate into the prompt document with the 🎤 button in the composer's control row. It works three ways and picks automatically — in this order.

1. Live dictation, if the webview has it

If the webview provides speech recognition (SpeechRecognition / webkitSpeechRecognition), C2 uses it directly. Click the mic, talk, and each finished phrase lands in your document. The button pulses while listening; click again to stop.

macOS has no speech API in WKWebView, so the desktop app never takes this route there.

2. A transcriber you named

Otherwise C2 records audio and hands it to a command of your choosing — an explicit choice always wins over the built-in route below:

sh
export CODETWO_TRANSCRIBE_CMD='whisper-cli -m /absolute/path/to/ggml-base.bin -f {file} -l auto -nt -np'
  • {file} is replaced with the recorded audio path (properly shell-quoted). It is always a 16 kHz mono WAV — the app resamples whatever the webview recorded, so whisper.cpp reads it straight off.
  • Native whisper.cpp commands require -m with a real model path. C2 does not infer one merely because whisper-cli is installed: its built-in default is cwd-relative and often missing.
  • The only contract is: print the transcript to stdout. Any wrapper script works.

3. macOS's own recognizer — nothing to install

With no command configured, the Mac app hands the recording to the system speech recognizer. This needs no install, no model download, and no configuration.

It runs on-device only. If macOS can't recognise your language locally, C2 says dictation is unavailable rather than quietly uploading your audio to Apple. Note that on-device models ship per language and region: en_SG and en_GB often have none while en_US does, so C2 falls back to another region of the same language before giving up.

The first dictation raises two macOS prompts — microphone and speech recognition. Both are remembered.

If the mic button says nothing is available

  • Speech recognition declined? Re-enable C2 under System Settings → Privacy & Security → Speech Recognition (and Microphone).
  • No on-device model for your language? Install one via System Settings → Keyboard → Dictation (add the language, which downloads the offline asset), or configure route 2 instead.
  • Launched from Finder and using route 2? macOS gives a double-clicked app a bare PATH. C2 adds /opt/homebrew/bin, /usr/local/bin, /opt/local/bin, ~/.local/bin, and ~/.cargo/bin back on startup. Anywhere else, use absolute paths for both the transcriber and its model.
  • CODETWO_TRANSCRIBE_CMD set in your shell profile? A GUI app doesn't read that. Launch C2 from a terminal, or rely on route 3.
  • Running only the Vite renderer? It has no native host, so route 3 is unavailable. Use bun run dev or script/dev/run.sh to run the bundled Electrobun app.

Privacy

C2 ships no speech model and calls no hosted API. Route 2 sends audio only to the local command you configured; route 3 is pinned to on-device recognition, so nothing is uploaded. If no route is available the button says so rather than silently doing nothing.

Apache-2.0 licensed.