OpenCode Plugin

Don't wait for the LLM to finish. It hears you.

Every AI tool makes you wait your turn. Wait for the LLM to stop talking. Then correct it. Then restate everything it missed. Interrupt changes that. Speak when you want — the LLM catches what it was saying, pivots with full context, and keeps going. No waiting. No repeating. No turn boundaries.

Walkie-talkie works free with defaults. Pro config is $29 one-time, 3 machines, no subscription.

Without interrupt — model never hears you

you actually make it recursive

model ...prev, curr, and next. You initialise prev as None, curr as head, then...

↪ The model finishes explaining iterative. It never heard "recursive." Now you have to restate everything.

With interrupt — clean mid-sentence pivot

you actually make it recursive

interrupt ctrl+shift+space held · abort + record · whisper transcribed

model Recursive approach: base case when node is None. Recurse on the rest, update the next pointer...

↪ The model pivoted mid-sentence. It knows exactly what it was saying and where to redirect.

Live demo

See it in action.

opencode — walkie-talkie
interrupt✓ walkie-talkie active · hold ctrl+shift+space to talk
⌨️ texthow do I reverse a linked list in Python?
🔊 ttsThere are two main approaches. The iterative method uses three pointers — prev, curr, and next. You initialise prev as None, curr as head, then loop...
⌨️ keyctrl+shift+space held · session aborted · recording started
interruptgeneration aborted · TTS stopped · mic recording
🎙 pttactually make it recursive
whispertranscribed: "actually make it recursive"
⌨️ keyctrl+shift+space released · sending transcript as prompt
🔊 ttsRecursive approach: base case when the node is None or the last node. Recurse on the rest, update the next pointer to point back, then return the new head...
// held ctrl+shift+space · spoke correction · release → model pivoted

What you get

Two tiers. One primitive.

🎤

Free

Walkie-talkie mode

Hold ctrl+shift+space to abort model generation, speak your correction, release to transcribe and redirect. Built on local whisper.cpp — offline, private, no API key needed.

🔊

Free

Streaming TTS

Speaks responses as they arrive via edge-tts neural voices. No waiting for the full response — audio plays the moment a sentence is detected. Built in, no separate plugin needed.

🔒

Free

Privacy-first

All audio processing is local — no audio or conversation data ever leaves your machine. The only outbound call is license validation.

🔧

Pro

Full configuration

Adjust mic threshold, monitor silence duration, TTS estimation rate, timing window, and trigger words. Debug mode for verbose logging.

📋

Pro

Debug logging

See every RMS reading, TTS start/end, and injection decision in real time. Essential for tuning thresholds to your mic and environment.

🔑

Pro

Polar.sh license key

Activates on first run, validates at each startup, 7-day offline grace period. Up to 3 machine activations per license. One-time $29.

~30%

Tokens saved per interrupt — no need to restate context

0

Context restatements needed. The model catches up mid-sentence.

10×

Mic samples per second. Zero impact on OpenCode performance.

How it works

Under the hood.

Walkie-talkie — free

1

Streaming TTS starts playing

Plugin hooks text parts as they arrive from the model, buffers into sentences, generates audio via edge-tts, and plays immediately — no waiting for the full response.

2

Hold ctrl+shift+space to interrupt

Press and hold ctrl+shift+space — generation aborts, TTS stops, mic starts recording via sox. A 300ms release timer resets on each key repeat so the recording stays active while you hold.

3

Speak your correction

Audio is captured to a WAV file at 16kHz mono. Keep holding ctrl+shift+space while you talk — the recording continues until you release.

4

Release → transcribe → send

ctrl+shift+space released → audio is transcribed by local whisper.cpp (or OpenAI API fallback). The transcript is sent as your next message via session.prompt().

5

Model pivots with full context

The model sees your spoken correction as a new user message. It responds directly to what you said — no restarting, no repeating context.

Voice architecture

The
missing
middle layer.

interrupt includes a built-in streaming TTS engine powered by edge-tts. No separate TTS plugin needed — it speaks responses as they arrive. sox is likely already on your machine. No additional dependencies needed.

TTS is streamed sentence-by-sentence using edge-tts neural voices. Audio plays the moment a sentence boundary is detected — no waiting for the full response. Hold ctrl+shift+space to interrupt — recording starts, generation aborts, release to transcribe and redirect.
speech-opencodemic → text
interruptyou are here
OpenCode modelfull context
interrupt TTSstreaming speech
↑ monitors
sox mic monitorRMS 10×/sec

Made for the way you work

Pick your workflow.

🎙

Voice users

You speak to OpenCode all day. Walkie-talkie makes conversations feel natural — hold ctrl+shift+space to cut in mid-response, speak your correction, release to redirect the model. No more waiting for it to finish.

🔊

TTS-heavy workflows

You rely on spoken output. When you need to redirect mid-explanation, hold ctrl+shift+space to abort playback, speak over it, and the model responds to your exact words via whisper transcription.

⌨️

Developers

Pair programming with the AI? When the model goes down the wrong path mid-sentence, hold ctrl+shift+space to stop it, speak the correction, release to continue. No wasted back-and-forth retracing steps.

Pricing

Simple. One-time. Yours.

Free

$0

Walkie-talkie with defaults — no license needed

  • Walkie-talkie mode (ctrl+shift+space)
  • Local whisper STT (offline)
  • Streaming TTS (edge-tts)
  • Mic threshold configuration
  • Silence / timing customization
  • Debug logging
Install Free →

Installation

Up in two minutes.

1

Install sox

The voice monitor uses sox for microphone RMS sampling. Install it:

# macOS brew install sox # Ubuntu / Debian sudo apt install sox # Arch sudo pacman -S sox
2

Add the plugins to opencode.json

No npm install needed — OpenCode downloads plugins automatically. Add these entries to opencode.json in your project root or ~/.config/opencode/opencode.json:

{ "$schema": "https://opencode.ai/config.json", "plugin": [ "speech-opencode", "opencode-interrupt-plugin", "opencode-interrupt-plugin/tui" ] }

speech-opencode handles mic input. The interrupt plugin provides streaming TTS. The /tui entry adds the ctrl+shift+space walkie-talkie keybinding.

3

Install whisper.cpp for speech-to-text

The walkie-talkie needs local transcription. Save and run this script (clones, builds, downloads ~140MB base model):

#!/usr/bin/env bash # Save as install-whisper.sh && bash install-whisper.sh set -euo pipefail WHISPER_DIR="${WHISPER_DIR:-/tmp/whisper-cpp}" INSTALL_DIR="${INSTALL_DIR:-${HOME}/.local/bin}" MODEL="${MODEL:-base}" MODEL_FILE="ggml-${MODEL}.bin" echo "==> Installing whisper.cpp + ${MODEL} model" git clone --depth 1 https://github.com/ggerganov/whisper.cpp "${WHISPER_DIR}" cmake -S "${WHISPER_DIR}" -B "${WHISPER_DIR}/build" -DBUILD_SHARED_LIBS=OFF cmake --build "${WHISPER_DIR}/build" --config Release -j"$(nproc)" mkdir -p "${INSTALL_DIR}" cp "${WHISPER_DIR}/build/bin/whisper-cli" "${INSTALL_DIR}/whisper" 2>/dev/null \ || cp "${WHISPER_DIR}/build/bin/whisper" "${INSTALL_DIR}/whisper" curl -fSL "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/${MODEL_FILE}" \ -o "${INSTALL_DIR}/${MODEL_FILE}" echo "==> Done. Ensure ${INSTALL_DIR} is on your PATH."

Or set OPENAI_API_KEY in your environment as a fallback.

4

Restart OpenCode & verify

Kill the session and run opencode. OpenCode downloads the plugins from npm and loads them. Free mode activates automatically. Verify with opencode plugin list.

1

Install sox

Same as free tier — required for mic monitoring.

# macOS brew install sox # Ubuntu / Debian sudo apt install sox # Arch sudo pacman -S sox
2

Buy a license

Purchase at Polar.sh → You'll receive a license key by email.

3

Add plugins with licenseKey

No npm install needed. Same npm package, just add the licenseKey option and include all three entries:

{ "$schema": "https://opencode.ai/config.json", "plugin": [ "speech-opencode", [["opencode-interrupt-plugin", {"licenseKey": "INTERRUPT-XXXX-XXXX"}]], "opencode-interrupt-plugin/tui" ] }
4

Install whisper.cpp for speech-to-text

The walkie-talkie needs local transcription. Save and run this script (clones, builds, downloads ~140MB base model):

#!/usr/bin/env bash # Save as install-whisper.sh && bash install-whisper.sh set -euo pipefail WHISPER_DIR="${WHISPER_DIR:-/tmp/whisper-cpp}" INSTALL_DIR="${INSTALL_DIR:-${HOME}/.local/bin}" MODEL="${MODEL:-base}" MODEL_FILE="ggml-${MODEL}.bin" echo "==> Installing whisper.cpp + ${MODEL} model" git clone --depth 1 https://github.com/ggerganov/whisper.cpp "${WHISPER_DIR}" cmake -S "${WHISPER_DIR}" -B "${WHISPER_DIR}/build" -DBUILD_SHARED_LIBS=OFF cmake --build "${WHISPER_DIR}/build" --config Release -j"$(nproc)" mkdir -p "${INSTALL_DIR}" cp "${WHISPER_DIR}/build/bin/whisper-cli" "${INSTALL_DIR}/whisper" 2>/dev/null \ || cp "${WHISPER_DIR}/build/bin/whisper" "${INSTALL_DIR}/whisper" curl -fSL "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/${MODEL_FILE}" \ -o "${INSTALL_DIR}/${MODEL_FILE}" echo "==> Done. Ensure ${INSTALL_DIR} is on your PATH."

Or set OPENAI_API_KEY as a fallback.

5

Restart OpenCode & verify

On first boot you'll see license validation and the walkie-talkie binding active. Verify with opencode plugin list.

Pro configuration options

{ "plugin": [[ "opencode-interrupt-plugin", { "licenseKey": "INTERRUPT-XXXX-XXXX", "micThreshold": 0.015, "silenceMs": 200, "debug": true } ]] }
// Config options (pro only): // micThreshold: 0.005–0.1 (default 0.02) — RMS sensitivity // silenceMs: 100–2000 (default 300) — cooldown after voice // correctionTriggers: string[] — extra trigger words // timingWindowMs: 1000–15000 (default 5000) // debug: true | false (default false)

FAQ

Common questions.

Yes — sox is required for the microphone monitor. Install it with brew/apt/pacman.
Register opencode-interrupt-plugin/tui in your opencode.json plugins array. Install whisper.cpp (copy-paste the install script from the install section) or set OPENAI_API_KEY. Restart OpenCode — hold ctrl+shift+space to abort model generation and start recording, speak your correction, release ctrl+shift+space to transcribe and send. The model responds to your spoken correction.
The pro tier has a 7-day offline grace period. After a successful license validation, your activation is cached locally. If you're offline at startup, the plugin uses the cached result and logs a warning. After 7 days without internet validation, it stops loading until you reconnect.
Yes. Each license covers 3 machine activations. If you need to move to a new machine, run the deactivate command on the old one first to free a slot. If you can't access the old machine, email support@camaramagic.com and we'll manually release the activation.
Yes — the plugin hooks into the harness layer, not model-specific APIs. Works with Claude, GPT-4o, local models via Ollama, anything OpenCode supports. TTS is built in using edge-tts neural voices, so no separate TTS plugin is needed.
No. The plugin runs entirely locally. The only outbound request is to the Polar.sh license validation endpoint on startup — it sends your license key and activation ID, nothing else. No conversation content, no audio, no code leaves your machine through this plugin.

Still not sure?

Let Claude, ChatGPT, or Perplexity explain why interrupt might save you tokens and make your OpenCode sessions feel natural.