I paid for Wispr Flow for five months.
Every month, the same charge, for voice-to-text on my iPhone.
And it's a good product. The editing layer is genuinely impressive: it strips filler words, fixes grammar, adapts to how you write. No complaints about what it does.
My problem was where it does it, and what happens to my voice after.
The replacement I landed on is my own: a voice keyboard called Diction that runs on hardware I control. The Wispr Flow alternative I wanted didn't exist yet, so I built it. Grab it there if you're impatient. The rest of this is why I bothered.
The setting nobody turns on
Wispr has a setting called Privacy Mode. It's off by default.
Turn it on, and here is their promise, word for word:
"none of your dictation data (audio, transcripts, edits) is used by Wispr or any third party to evaluate, train, or improve AI models."
Leave it off, which is how it ships, and that same data "may be used to improve Flow's features."
So unless you go digging in settings for the toggle, your voice can become training data. That's not a leak or a scandal. It's the documented default.
And Wispr is not a small operation. It raised $30 million last year. By recent reports, it's now raising at around a $2 billion valuation.
A company at that scale has real reasons to want more voice data. By default, your voice is part of the supply.
So I looked at what I already had.
A home server. Docker Compose, Tailscale, the usual homelab stack my partner has learned not to ask about. A Whisper container already running for other things, so the transcription engine was just sitting there.
I only lacked one thing: a way to talk to it from my phone.
So I built one.
That is the whole interaction. Tap the mic, say the sentence, the words land in whatever field you were in. No app to open, no copy-paste, no dictation window that steals focus.
What the switch actually looked like
The server side was the easy part. I already had the transcription container. I wrote a small Go gateway to handle WebSocket streaming from the phone, and wrapped both in a compose file:
services:
whisper-large-turbo:
image: fedirz/faster-whisper-server:latest-cuda
container_name: diction-whisper-large-turbo
restart: unless-stopped
volumes:
- whisper-models:/root/.cache/huggingface
environment:
WHISPER__MODEL: deepdml/faster-whisper-large-v3-turbo-ct2
WHISPER__INFERENCE_DEVICE: cuda
WHISPER__COMPUTE_TYPE: float16
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
gateway:
image: ghcr.io/omachala/diction-gateway:latest
platform: linux/amd64
container_name: diction-gateway
restart: unless-stopped
ports:
- "8080:8080"
depends_on:
- whisper-large-turbo
environment:
DEFAULT_MODEL: large-v3-turbo
volumes:
whisper-models:
docker compose up -d, point the app at http://your-server:8080, and you're dictating.
Roughly how it feels the first time your own server talks back. First boot pulls about 1.6GB of model weights into the volume, then it's instant on every start after. If you want the long version, with European-language models, GPU tuning, and multi-model setups, I wrote a full setup guide. And if you already run a speech server, you don't have to start over: you can put the gateway in front of the one you have.
The hard part was the iOS keyboard. Extensions run in a sandbox with a 48MB memory ceiling, no mic access without Full Access, and a text proxy that behaves differently in every app. Keyboard extensions are where iOS developers go to suffer. That took months, not hours, and a fair bit of my remaining patience.
The result is Diction, a voice keyboard you add and switch to like any other keyboard.
Run it your way
This is the part Wispr can't match, because their model only works one way: your audio goes to their cloud. Diction gives you three modes, and you pick per your own comfort level.
- On-device. The speech model runs on your iPhone. Nothing leaves the phone, and it works with no internet at all. The models are small, from about 140MB to 630MB, so they fit and run without draining the battery.
- Self-hosted. Point the app at your own server, the setup above. Your audio stays on your network. You can verify that, because the server code is open source. There's nothing to take on faith.
- Cloud. If you don't want to run anything, there's a hosted option too. Fast and accurate, zero setup.
Same app, same keyboard. Switch any time.
Where I actually use it
Voice-to-text is useless if you don't end up talking to your phone. Before the switch, Wispr sat on my Home Screen and I used it for the same three things every day. After the switch, usage tripled. Not because the keyboard is magical, but because I stopped rationing it to stay under a word cap. A typical day now:
- Long messages in Telegram and Signal. The group chats where I'd normally send a voice note I'd rather send as text. A four-sentence reply takes eight seconds including the thinking. Tapping the same thing out on glass is a minute of typos.
- Notes while walking. Ideas arrive on the move, and typing them means stopping. Mic button, sentence, back in the pocket.
- Email replies. Most of mine are a rough draft dictated, then a handful of keyboard edits. Faster than thumbing out three paragraphs, and the cleanup pass tidies the filler before I even see it.
- Search and address bars. Anywhere with a text input, which on iOS is basically everywhere.
-
Prompting Claude Code over SSH. My terminal runs on the same home server. The keyboard dictates straight into an SSH session, and voice prompts land in
claudewithout a laptop in sight.
None of this is a corner case. It's mundane iPhone usage. The only thing that changed is volume. On Wispr's free tier I'd hit 1,000 words by Wednesday. On my own server there's no counter running.
What it actually costs
I won't pretend self-hosting is free. You need a machine that stays on, a home server, a spare mini PC, a GPU box like mine, plus about ten minutes with Docker. And a GPU that's powered on all day is not free to run. I worked it out once for mine: the electricity alone costs more per month than Diction's own cloud plan, which is $4.99 a month billed annually. I had been calling self-hosting free for a year. My electricity bill had been quietly disagreeing. For most people, self-hosting only really wins on cost if the machine is already on for other things anyway, the way mine is.
So I run the self-hosted mode because I like owning the pipeline, not because it's the cheapest path. If you're deciding purely on cost, the private cloud option usually comes out ahead, and it stays private the way Wispr doesn't: your audio isn't used to train anyone's models. And if you want zero cost and zero setup, on-device mode just runs on the phone, no server and no subscription.
What's better
My audio stays on my network, or on my phone, and never becomes anyone's training data. That's the whole reason I started.
No word limits. Wispr's free tier caps the iPhone at 1,000 words a week. Self-hosted, there's no cap, no subscription, no catch.
Latency on a local network is excellent. On the GPU box in the compose above, the large turbo model comes back near instant, with no round trip to a data center on the other side of the country. No GPU? The small model on a plain CPU still lands in two to four seconds.
The cleanup holds up too. Every transcription gets an optional pass that leans on your profile, the tone you set per app, and your own dictionary, so it fixes filler and punctuation the way you'd write it. You can even point it at a local LLM so that step stays on your hardware too. Wispr rewrites harder. Diction stays closer to the words you actually said. I used to file that under a weakness. These days I prefer it.
The part I didn't expect to care about
I made it mine. Diction ships with a set of themes, light and dark, quiet and loud, and I flip between them depending on my mood and the app I'm in.
It's a small thing. But it's the kind of small thing you only get when the tool belongs to you instead of to a company that picked one look for everyone.
Why I'm not switching back
I thought I'd be giving something up. I wasn't. The words land clean, the cleanup fits how I write, and my voice never leaves the network it started on. That last part is the one thing Wispr can't offer at any price, and it turned out I didn't have to trade quality to get it.
If you've been hunting for a Wispr Flow alternative that keeps your voice on your own hardware, this is the one I use every day.
If you already run Docker at home and the idea of your voice quietly training someone else's models bothers you, the setup takes about ten minutes.
Come build it with me
The gateway is open source, and I work on it in the open, alongside a handful of people who hack on it with me. If you're an engineer, take this as an open invitation. Clone the repo, run your own models, wire in your own backend, make it yours. And if you improve something, or add the thing you always wished it had, send a pull request. I read every one, and Diction gets better every time someone does.
Diction on the App Store · Source on GitHub · diction.one
Cover photo by Karthik Balakrishnan on Unsplash.





Top comments (1)
Update: since I first posted this, a lot of people have reached out, here and over email, with questions and ideas I hadn't considered. I've folded the best of them in, and I keep this post current as the project moves, so what you're reading is up to date.
If you have an idea, a problem, or just a question, email support@diction.one or open a GitHub issue. Both land with me, and the next reader gets a better version because of it