01 Who
Your habits with that person: how you greet them or don't, how you say yes to them, your emoji with them. A profile is counted from your messages to each person you write to a lot, and the window title picks it.
Say it, or let your agents draft it. What lands in Slack, WhatsApp, email or a doc is what you would have typed there: your words, your habits with that person, your language with them.
WhatsAppPablo
Spanish, one line, no greeting: how you text him.
EmailDana
"Hi Dana," and your sign-off: how you mail her.
Slack#general
Lowercase, "quick one:", a question at the end.
git clone https://github.com/joanreyero/voz ~/Work/voz && uv tool install --editable ~/Work/voz
[Trained on you]
A style guide per place you write, counted from every message of yours, with verbatim examples. Then a profile per person you write to a lot.
styles/slack.md
Short, lowercase, a question at the end. voz counts what can be counted and a model writes the rest from the text itself.
1,840 messages · median 7 words · 92% lowercase opener · 4% end with a full stop · "wdyt?" ×61
## Voice - one thought per message, 7 words median - lowercase opener (92%), no final full stop (96%) - asks for a decision at the end: "wdyt?", "ok?" - never a greeting, never a sign-off ## Examples - quick one: can we ship the fix before the demo? - makes sense, let's do the smaller one first. wdyt?
profiles/whatsapp/pablo.md
With 40+ messages to one person or group, voz also counts how you write to them. The window title picks the profile; the text comes out in the language you use with them.
312 messages · Spanish 95% · median 6 words · no greetings · "jaja" ×44 · 🙏 ×18
## Pablo - language: es 95% · en 5% - length: median 6 words, 88% under 12 - laughter: "jaja" (44) · emoji: 🙏 (18), never at the start - greetings: none; closings: none ## Examples - sí sí cuenta conmigo - te paso la ubicación luego 🙏
styles/email.md
Sent mail from HEY and Gmail, deduplicated into one style. Greetings and closings only when you use them; bullets when you dictate a list.
624 emails · median 48 words · "Hi <name>," 78% · "Thanks," 61% · bullets in 23%
## Voice - opens "Hi <first name>," (78%), closes "Thanks," + name (61%) - 48 words median; the ask in the first two lines - lists become dashes, 2 to 4 items - numbers as digits, dates as "1 March" ## Examples - Thanks for sending this over. Two things: - Can we move the start to 1 March?
styles/docs.md
Paragraphs from the Google Docs you wrote yourself. Co-edited docs are skipped; pasted or generated text is judged out.
2,100 paragraphs · median 34 words · sentence-case headings · "so that" ×88 · no exclamation marks
## Voice - plain sentences, 14 words median, one idea each - the decision first, the reasoning after - "so that" to tie a change to its effect - sentence-case headings; no exclamation marks ## Examples - We moved the check to the client so that failures show up before the upload starts.
styles/agent.md
Your prompts to Claude Code, Codex and Pi, read from the transcripts already on disk. Paths and flags spelled as code, the ask stated once.
3,400 prompts · median 22 words · imperative opener 71% · a path in 54% · no pleasantries
## Voice - imperative, 22 words median: what, where, how to check - paths, flags and identifiers verbatim: tests/refresh.py, -q - the constraint before the task ## Examples - Freeze time with the fixture in conftest.py and run the suite with -q. - Keep the public API; only change the adapter.
Invented guides; yours are counted from your own messages, read straight from the tools, nothing to export. A weekly refresh pulls what is new and relearns a style only when it grew. voz undo <style> puts the previous one back; your ## Overrides survive every relearn.
[Right for where it lands]
When you press the key, voz reads the active window: which app, which conversation, who you are replying to. The text comes out right for that place.
01 Who
Your habits with that person: how you greet them or don't, how you say yes to them, your emoji with them. A profile is counted from your messages to each person you write to a lot, and the window title picks it.
02 Where
Slack gets your Slack, email gets your email, a coding agent gets a prompt with the paths spelled right. One style per app, matched on the window; voz style slack forces one.
03 Which language
If you write to someone in Spanish 90% of the time and dictate in English, the message comes out in Spanish. Say "in English" or "en català" first to force it; the words are dropped from the text.
04 What you meant
Spoken corrections applied, fillers gone, names spelled from your vocabulary, your bullets where you dictated bullets. Nothing you did not say. voz never changes the meaning, it only makes the text yours.
Under the hood: three speech engines hear at once (a cloud model, local whisper, optionally a second cloud model) and where they disagree is where the misheard word is; the screen is OCR'd while you still talk, never while locked, never a password manager. About three seconds after you let go, the text is at your cursor. If the model is down, the transcript is typed and a notification says so. → How it works, step by step
[Yours]
voz has no backend. What leaves your machine goes to the providers you chose, with your own keys. Everything learned stays in plain files in your home.
What leaves the machine, and what never does
Leaves: the audio, to the speech providers you configured; the transcript, screen text and your style, to the language model you configured; your messages, once per learn, to the model that writes the guide. Never leaves: your style files, profiles, message archives and dictation history, plain files under ~/.config/voz and ~/.local/share/voz, readable only by you.
No account, no server, no telemetry
A program on your machine, nothing more. MIT licensed, free, forever.
Your keys, your providers
You pick the speech and language models (Vercel AI Gateway, OpenAI, ElevenLabs) and pay them directly. voz setup --stt local keeps every byte of audio on your machine.
Read-only sources
It never writes to Slack, WhatsApp, HEY, Gmail or Drive. It only reads what you wrote.
Audited by itself
voz doctor fails if styles, sources, profiles or a secret file sit in a git repository that does not ignore them. Files are 0600; the daemon answers only plain local requests, sandboxed under systemd.
[Two ways in]
The writing pass behind the microphone is also a CLI. Anything an agent drafts on your behalf can land in your voice too.
Voice
On Linux today, through Voxtype: it records, voz hears and writes, Voxtype types. voz-ptt gives one key three gestures.
Agents
Pass the style, the destination and what is on screen. Exit code 1 means the model was unavailable and the text came back cleaned but not rewritten.
$ voz write --style slack "rough draft of what to say" $ echo "draft" | voz write --style email --destination "reply to Dana" $ voz write --style email --screen thread.txt "draft" # the microphone's route, from a raw transcript: $ voz process --json <<< "um so the sync is slow"
[Sources]
Live sources are read from the tools you already use, incrementally, with your own login. Exports are read once and frozen. One skill per source.
live, refreshed weekly · once
[Roadmap]
Intentions, not dates. "Now" works today; the rest is the order we mean to build it in.
Now
Next
Later
[At a glance]
[Get started]
Linux with Hyprland, Voxtype 1.1+, tesseract, wtype, Python 3.12+, uv and one Vercel AI Gateway key. On Arch: yay -S voxtype-bin tesseract tesseract-data-eng wtype.
$ git clone https://github.com/joanreyero/voz ~/Work/voz $ uv tool install --editable ~/Work/voz $ mkdir -p ~/.config/voz $ (umask 077; echo 'AI_GATEWAY_API_KEY=vck_...' > ~/.config/voz/secrets.env) $ voxtype setup # once, if Voxtype has no config yet $ voz setup --stt cloud # hooks, voz.service, refresh timer, voz-ptt, three ears $ voz setup --skills # skills for Claude Code, Codex and Pi $ systemctl --user restart voxtype $ voz doctor # every line ✓
Then open a coding agent and say "onboard me into voz". It asks where you write, connects each place, learns, and checks the result with you.