heyski.io / blog / local first voice coding architecture
Engineering · How the architecture works

Building a local-first voice layer for AI coding agents.

On-device speech in both directions, a shared agent skill, and the honest limits.

EngineeringArchitectureOn-device AIVoice coding
Line drawing of someone talking to a laptop inside a house, the whole voice loop indoors, a crossed-out cloud outside

SKI is a free, on-device voice interface for Claude Code, Codex, Cursor and other coding agents: you talk, it builds, and the agent answers you out loud through local speech-to-text and local text-to-speech.

No audio or code leaves your machine. Here’s the architecture, the setup flow, and where the current limits are.

If you’re running an AI coding agent for hours a day, you’ve probably already hit the same wall we did: the loop is type → wait → forget to check back. Not because the agent is slow, but because typing is slower than thinking, and “waiting” has zero pull on your attention once you tab away.

We built SKI to fix the second half of that loop specifically, not just voice input, but a full bidirectional channel where the agent can also initiate contact with you. This post is a walkthrough of how it’s wired together, not a feature list.

Why voice input alone wasn’t the fix

Most voice coding tools, including the native /voice push-to-talk in Claude Code and Codex’s push-to-talk transcription, solve one direction: you speak, it becomes a prompt. That’s a real improvement (you talk roughly 3× faster than you type), but it leaves the second bottleneck completely untouched: you are still the one polling the terminal to find out when the agent’s done.

The design goal for SKI was closing that loop, not just narrowing the first half of it. Concretely: the agent should be able to speak first, “tests pass, want me to commit?”, and you answer by voice from wherever you are, without switching back to a terminal window.

Architecture: what actually runs where

This is the part that matters most for anyone evaluating whether to trust a voice layer with their code and their voice:

  • Speech-to-text runs entirely on-device. Your spoken input never leaves your machine before it becomes text.
  • Text-to-speech also runs entirely on-device, using one of four local neural voices (Heart, Adam, Emma, George).
  • The agent connection is a skill, not a proxy. SKI doesn’t sit between you and Claude Code’s or Codex’s own model, it installs a shared skill into ~/.agents/skills/ that lets the agent understand voice input and know it can emit spoken output. What you say still goes to that agent’s own LLM exactly as if you’d typed it. SKI is the I/O layer, not a new model in the middle.
  • What does touch the network: account sign-in (email + one-time code), update checks, optional anonymous feature-usage analytics (no audio, code or transcript content, opt-out available), and the one add-on that requires cloud infrastructure by nature, sending your agent into a live Zoom, Meet or Teams call as a participant, via a separate product called AgentCall.

That last point is worth being precise about, because “runs offline” and “has a cloud feature” aren’t actually in tension here: the core voice loop is fully local and works with no network at all; the meeting-bot feature needs a network connection because a bot joining a live video call has to run somewhere that isn’t your laptop.

YOUR MACHINE speechto text your agentCLI text tospeech you hear it model API text prompt only
Audio never leaves. Speech to text and text to speech both run locally, and the only thing crossing the network is the same text prompt your agent would have sent if you had typed it.

Setup flow

  1. Install: Mac (Apple Silicon, macOS 14.4+) or Windows (x64), from heyski.io.
  2. Onboarding: pick a widget form factor (floating pill, or a notch bar docked under the camera housing on a MacBook), choose a speech model, and let the installer drop the shared skill into your agents. One click.
  3. Connect a project: open your normal agent session inside your project directory and type ski once. The handshake is automatic; a green status dot on the widget confirms the connection.
  4. Talk: hold fn/Globe (Mac) or the widget’s push-to-talk, speak, release. Transcription happens locally and the text is handed to the agent like a normal prompt.
  5. Let it answer: when the agent finishes or hits a decision point, it speaks the result. Reply by voice, no window switch required.

Multi-project support means each connected project can run a different agent and speak in a different voice, so a reply from a background project announces itself (“From api-server: …”) instead of being ambiguous.

Feature surface beyond the core loop

  • Full-duplex barge-in: you can interrupt a spoken reply mid-sentence and still be heard.
  • Approve-before-send (optional, per project), your transcript becomes an editable draft you confirm before the agent sees it.
  • Screenshot-to-agent: a hotkey attaches a screen grab to your next spoken utterance; agents can also request one.
  • Local meeting recorder: captures mic + system audio from any meeting, on-device transcription, speaker-tagged, agent-written summary and action items. Free and unlimited.
  • AgentCall integration: sends the agent into a live call as a speaking participant or silent notetaker. This is the one metered piece; local recording stays free regardless.
  • Silent mode: replies render as text only, for open offices or active calls.

Where the current limits are

  • English only. Additional languages are planned, not shipped.
  • Apple Silicon only on macOS, no Intel Mac builds. Windows is x64.
  • No Linux build yet. Planned; no committed date.
  • Closed source. The app is free, but the source isn’t public, the GitHub repo hosts release binaries, not the codebase.
  • Not general dictation. SKI doesn’t type into arbitrary apps; it’s purpose-built for the agent loop specifically.

Where this sits relative to what’s already in your agent

Claude Code and Codex both ship their own voice input now (/voice in Claude Code, push-to-talk and realtime sessions in Codex). SKI isn’t a replacement for those, it’s a layer that works across whichever agent you’re in on a given day, adds the reply-out-loud half that neither native feature does system-wide, and lets you run several agents and projects at once with per-project voices.

If you only ever use one agent and don’t need it to speak first, the native voice input alone might be enough for you. Worth trying both.

Free for life, no card, unlimited use of the on-device voice loop. We’d genuinely like feedback from anyone running this alongside a real daily workflow: what breaks, what’s missing, what you’d want the agent to say differently.

Related posts

Keep reading.

Curious? Give it a try.

Free for life. Register once — no card. Then just talk.

macOS 14.4+ · Apple Silicon  ·  Windows 11 & 10 · x64