Your coding agent, out loud, in Neovim
The agent narrates before it edits, points at the lines it will change, asks when a decision is yours, and listens when you press F5. Everything pair adds runs on your Mac.
$ brew tap fabioaraujo121/tap
$ brew trust fabioaraujo121/tap # Homebrew asks this once of any third-party tap
$ brew install --cask pair
$ pair doctor --fix # downloads the whisper model (1.6 GB)
$ pair doctor --mic # one second of recording so macOS asks for microphone access
- macOS 14+
- tmux
- Neovim
- Claude Code
- Codex
Then, in a repository: pair init, then pair. How it works
The session
Claude is asking you · press F5 to answer 0:08
waiting for your answer
you 10:14
add email validation
claude 10:14
Adding a format check to User so a bad address fails before it is saved.
app/models/user.rb +2 −1
claude asks 10:15
Also reject duplicate addresses? That takes a unique index, so a migration too. I would add it.
How it works
A turn, out loud
F5, say what you want
The microphone is closed until you press F5. It records until you pause, or until a second F5. The speech is transcribed on your Mac and typed into the agent as the prompt.
narrate, show, then edit
The agent says what it will change and why; Neovim jumps to the lines. After the edit, the change is drawn inside the file, added lines highlighted, removed lines in place.
ask, then wait for F5
When a decision is ambiguous, the agent asks aloud and waits. Press F5 and answer.
F6 cuts the agent mid-sentence and opens the microphone for you. F7 shows the agent's own pane, otherwise hidden; it appears by itself when the agent waits for a permission or a trust dialog. Hand edits between turns are diffed and passed to the agent at its next prompt, so it never overwrites them unknowingly.
What runs where
Runs on your Mac
- Listening is whisper.cpp, speaking is macOS
sayor Kokoro, recording is sox. All on your Mac; the whisper model is 1.6 GB and Apple Silicon is recommended. - The microphone opens only when you press F5, and closes when you pause or press it again.
- The agent's own conversation still goes to its provider, Claude Code to Anthropic and Codex to OpenAI, as it does without pair. pair sends nothing anywhere. Turn Wi-Fi off and press F5: the transcript still arrives; only the agent's reply waits for the network.
- Downloads are pinned and SHA-256 verified.
- The source is private for now. The releases, their checksums and the Homebrew cask are public.
Claude Code and Codex
Agents
Pick one
Claude Code by default; pair init --agent codex picks Codex CLI. A session remembers its agent.
How it connects
pair uses the agent's hooks (before and after edits, at prompts, at the end of a turn, at permission prompts) and gives it three MCP tools, narrate, show and ask. An instructions block in CLAUDE.md or AGENTS.md tells it how to pair. No fork of the agent, no daemon, no cloud.
Sessions
Each session is its own. It can be named, listed, continued with the agent's conversation resumed, read back, or replayed with the narrations spoken again.
Questions
FAQ
Why macOS only?
It speaks through macOS say and gets the microphone through macOS's own permission prompt; nothing in it is portable yet. macOS 14 or later, Apple Silicon recommended. No Windows or Linux build.
Do I need to configure Neovim?
No. Without a config of your own, pair brings a theme, the tree and the keys; with yours, it changes nothing. Neovim 0.10 or later.
Does my voice leave the Mac?
No. sox records and whisper.cpp transcribes, on your Mac. Only the transcript reaches the agent, as text. pair sends nothing anywhere.
Which agents and models?
Claude Code, the default, and Codex CLI, with whatever model each uses. Voices are macOS say or Kokoro (54 voices, English and Brazilian Portuguese among them); listening is whisper.cpp large-v3-turbo.
What does it cost?
Nothing. pair is free and the release is MIT-licensed. The agent's own plan is separate, as it is without pair.
Get it
Install
$ brew tap fabioaraujo121/tap
$ brew trust fabioaraujo121/tap # Homebrew asks this once of any third-party tap
$ brew install --cask pair
$ pair doctor --fix # downloads the whisper model (1.6 GB)
$ pair doctor --mic # one second of recording so macOS asks for microphone access
Then, in a repository:
$ pair init # or: pair init --agent codex
$ pair