Voice, dictation, and memory
Listen to agents, talk to them, and inspect what they remember.
Spoken replies
Voice is set per bot: open the bot's settings, choose Voice & alerts, pick a Voice engine and a voice, then use the speaker control on a response. Auto-speak can read new replies as they arrive. Five engines are available:
- ElevenLabs — cloud voices, needs an API key.
- Fish Audio — cloud voices from the Fish Audio library, needs its own API key.
- Grok (xAI) — uses the xAI API key saved in Settings → Connections, and detects the spoken language from the text.
- Built-in Mac voices — the voices already installed on macOS, no key.
- Chatterbox (local) — an open-source, MIT-licensed engine reached through an OpenAI-compatible server you configure. With a server on your own machine there is no cloud call; the address can also point at any HTTP(S) server you choose.
The harness rewrites code-heavy Markdown into speech-friendly text before synthesis. Keys remain on the harness and never reach the renderer.
Fish Audio
- Create a key in Fish Audio API Keys.
- In the bot's settings under Voice & alerts, choose Fish Audio, paste the key, and save it.
- Pick one of the voices returned by your Fish Audio account, then use Try before enabling spoken replies.
Fish Audio and ElevenLabs keys are stored separately, so switching engines does not replace the other provider's credential. The picker combines popular public voices with voices owned by your Fish Audio account. Only use a voice when you have permission to do so.
Chatterbox (local)
Brainwrite speaks through any OpenAI-compatible server that runs Chatterbox behind POST /v1/audio/speech — for example LocalAI with a Chatterbox model installed, or a small wrapper service around pip install chatterbox-tts.
- Start your Chatterbox server locally and note its address, for example
http://127.0.0.1:4123. - In the bot's settings under Voice & alerts, pick Chatterbox (local) as the voice engine, paste the server address, and set the model id your server expects (the default is
chatterbox-turbo). - Pick a voice. Voice ids come from the server's
/v1/modelslisting when it has one, or/v1/audio/voiceswhen it doesn't; otherwise a Default entry uses the server's built-in voice.
There is no API key. Brainwrite sends the text to the configured server address, so synthesis stays on your machine only when that server is local. Per-agent voice overrides work the same as with the other engines, and a dead or unreachable server is reported as a clear error instead of a hang.
Voice notes
An agent can send a voice note: a short spoken message it writes itself, synthesized with the configured voice engine and attached to its reply when the turn ends. The same text becomes the note's visible caption and transcript, so the conversation stays readable — and searchable — without playing anything. Notes are limited to 1000 characters, and the same limit is enforced again at synthesis.
A note posted to a shared room works the same way: the agent records the note, then attaches it to its room post, where the room members can play it inline.
Voice notes can be turned off per agent. The switch sits under Voice & alerts in the bot's settings; while it is off, the agent is not offered the voice-note tool at all, even with a voice configured.
The audio itself is an mp3 file in the attachments directory on your computer, with a generated name and owner-only permissions. It counts against the same 512 MiB attachment quota as images and documents.
Call mode
On macOS, call mode combines native on-device speech recognition with the configured voice. It is deliberately half-duplex: the microphone pauses while the bot speaks to prevent the app from transcribing its own audio.
Tool progress and approval requests can be narrated during a call so long-running work does not sound disconnected.
Dictation
The composer microphone uses Apple's on-device speech recognition, so dictation never leaves your Mac.
Memory
Each bot can keep plain-text memory that you can inspect, correct, or delete. Memory is not a hidden remote profile; it lives with the local Brainwrite data.