SayIt! Prompts by voice

Designed and built a macOS dictation app for prompts that runs on your Mac or through your own API key.

3 min read

SayIt’s five pill states in an isometric row: recording, processing, Command Mode, paused and pasted

SayIt! is a macOS app for dictation. You press a shortcut, speak, and it fixes your grammar and pastes the text where you were typing. I built it for my own prompts in Cursor, Claude Code and Codex. I like to dictate in Czech, and my prompts are sometimes vague, so it translates them and can turn them into better prompts. I always wanted to build a useful app for the Mac, something that serves me and leaves room to be creative with the features I really want. About ten colleagues and friends now use it every day.

Client
SayIt!
Role
Designer
Team
Solo, ~10 Testers
Timeline
2026 – Current

01

Control, dictate

Press Control+D, speak, press it again. While you dictate, a pill floats above the macOS Dock with a live waveform, then shows the text being processed, then a check when it’s pasted. In the middle of a longer dictation you can pause with Control+P to sort your thoughts, then carry on.

The shortcuts were harder than they look. My first defaults collided with system shortcuts, and the ones the agent suggested were four or five keys at once. I landed on D for dictate and Control for control: “control, dictate”. Command Mode is the same with Shift as the modifier, a modified dictation. They can overlap with other software, and everyone can change them to whatever they want. In my own apps, Slack, Cursor and Codex, there were no conflicts, so I kept them.

02

Prompt or writing

SayIt! checks which app you’re dictating into. In Cursor, Claude Code, Codex, a terminal or an AI app, the text is a prompt: direct, with no greetings, and every @file reference and slash command kept exactly as said. In Slack or Notes it’s writing: natural sentences and proper grammar. The preview shows which one it picked, and you can switch it.

Translation has two routes, and I use both:

Control+T
After dictating, pick a language in the preview and the text is translated before it’s pasted. I dictate in Czech and paste in English.
Command Mode
Select any text, press Control+Shift+D and say what to do with it: translate it, explain it, make it a better prompt. The result replaces your selection after a preview.
The preview pill with the Prompt chip and its translate, paste and discard hints
Command Mode working on a selection, in its teal state

03

On your Mac, or not

SayIt! has three modes:

Fully Local
Everything on your Mac, with no API key and no subscription.
Hybrid
Speech to text on your Mac, refinement through your own key.
Full Cloud
Both through your own keys, with Gemini, Claude or OpenAI for refinement.

Speech to text already runs on-device with Parakeet or Whisper. AI refinement runs through an API key for now; on-device refinement is next.

I put a lot of work into the settings, so they’re clear even for people who aren’t technical. Setting up a local model is one click.

The hardest part was what happened before that click. When someone chose a local model without downloading it and started dictating, the app crashed or froze. Now the flow is covered and the pill says what’s happening: it offers to download the model, shows the progress, and says the first dictation on a new model takes longer while it’s prepared for your Mac.

The local model download pill showing Whisper Large downloading at 64 percent
Transcription settings with Hybrid mode selected and the local Whisper model ready

04

Living in it

I tested SayIt! mostly by using it. When you dictate all day, you fix the hiccups as you meet them. My friends report theirs in a Slack channel, where an AI agent I built in Make catches each report and summarises it into a spec of what to fix.

Some bugs still hide. Custom vocabulary, the words dictation usually gets wrong, didn’t work for weeks before I noticed.

Dan, I’m not touching the keyboard anymore.

- A friend testing SayIt!
My own dictation a month
18+ hours
Time I’d otherwise spend typing
Colleagues and friends using it daily
~10

05

Me and the agents

I decided the whole frontend, the visuals and the UX, and designed every asset in Figma. Claude did the iterations and wrote the code with me, mostly in Cursor and Claude Code. It was my first time working only in the terminal with Claude, and it worked pretty well. Screenshots were the tough part: in the terminal I couldn’t see them the way Cursor, Codex or the Claude app show them. I liked that I still had time to design in Figma and hand that to the agent.

The Figma board with SayIt’s pill states and app assets

If I started again, I’d begin with local models right away, not later. And as with vibe coding in general, you start slow, then it’s 3 a.m. and you’ve built six overthought, overengineered features.

One day I want to make SayIt! public and open source. It’s still too far away for now.

More case studies

Interested in working together? I’d love to hear about your project or team.