Style
A writing register, and why the app you are in picks it.
Off, Verbatim, Clean, Formal — four rungs of one dial. Speechfy chooses between them by where the words are going, because a destination is a fact and a mood is a guess.
You already have registers. You use several a day without naming any of them: the message to your partner, the line in the team channel, the mail to a client, the command you type into a terminal. Your opinion does not change between those. Your grammar, your contractions and your greetings do.
A register is not a tone and it is not a personality. It is how much distance there is between what left your mouth and what appears on the page. That is a single quantity, and it is the one thing a dictation app has to get right, because getting it wrong is not a slightly worse sentence — it is a message that does not sound like you.
Four rungs, in the order of how much they change
- Off
- Your words, untouched. Nothing is sent to the model. Hesitations come out and every other character is yours.
- Verbatim
- Punctuation only. The model runs, but only for fillers, punctuation and capitals. Your wording is kept.
- Clean
- Grammar and punctuation. Agreement, tense and run-on sentences are fixed. Nothing is made more formal than you said it.
- Formal
- No contractions, full sentences. Contractions are written out, slang is replaced, and one idea goes in each sentence.
They are ordered, and the order is the only thing separating them. That is deliberate: the picker should read as a dial rather than as a menu, because a menu invites you to look for the one that matches your mood and there is no such one. There are four amounts.
Two controls was the first thing tried here — a tone on one axis and an amount of cleanup on the other — and it did not survive contact with a live preview. Four tones times three amounts is twelve cells over about three real outcomes, and a preview that actually runs shows you eight of them coming back identical. A control that does nothing is worse than a missing control, because you spend a week believing you have set something.
Every register is written as an operation, not an adjective
This is the constraint the whole feature rests on, and it was measured rather than chosen.
Handed the same transcript and asked for “neutral”, “warm”, “direct” and “formal”, the result is four indistinguishable sentences — and the “formal” one keeps both its contraction and its “Hey”. Adjectives do not land. Rephrase the same four as things to do to the words — expand the contractions, fix the agreement, finish the sentences — and the same request separates reproducibly, byte for byte, run after run.
So the registers are not moods with names. They are short lists of operations, and they are these:
- Verbatim
- Change as little as possible: only remove fillers and fix punctuation and casing. Preserve wording exactly.
- Clean
- Fix grammar: agreement, tense and word order. Write it as complete sentences. Keep the speaker’s contractions; add no greeting, sign-off or courtesy they did not say.
- Formal
- Expand every contraction in full: “can’t” becomes “cannot”, “I’ll” becomes “I will”. Replace slang and clipped words with their ordinary written forms. One idea per sentence. Keep any greeting the speaker actually said and add none.
Read those closely and you can see where each one was rewritten after
being caught. “Keep the speaker’s contractions” is in
Clean because an earlier version quietly raised everybody’s
formality. “Add no greeting they did not say” is there because
the version without it invented one. And Formal spells out two worked
examples — can't to cannot,
I'll to I will — because
“write formally” on its own left both of them exactly where
they were.
Formal also asks for greetings to be kept as spoken rather than stripped, which looks like a missing feature and is not. The base rules that travel with every dictation say never add content and never summarise, and those outrank a register — so a register told to delete your “Hey” keeps it anyway, in every run. Better to ask for the thing that happens than to ship an instruction that is ignored.
What that does to one sentence
so i pushed the fix but it dont work on staging works fine local ill look again tomorrow
So I pushed the fix, but it dont work on staging. Works fine local. I’ll look again tomorrow.
So I pushed the fix, but it doesn’t work on staging. It works fine locally. I’ll look again tomorrow.
I pushed the fix, but it does not work on staging. It works correctly on my local machine. I will look at it again tomorrow.
You do not have to take that on trust, which is the point of shipping it as a room rather than as a settings row. Speechfy runs your own last dictation through all four and shows you the four answers side by side, so the choice is made by reading rather than by guessing what a word like “Clean” might mean. Any register added later has to earn its card the same way: if its output matches its neighbour’s on a real sentence, it is a control that does nothing and it does not ship.
The destination is the signal
Four registers is not the interesting half. The interesting half is who chooses.
Asking you the first time was rejected outright. The whole product is: hold the key, speak, the text appears. A dialogue on top of the app you were mid-sentence in, at the exact moment your words should be landing, is that promise breaking — and you would pick whatever dismisses it fastest, which is worse information than a default would have been.
Learning it from what you have already dictated was rejected too, and for a sharper reason. Your history holds the polished text, produced by whichever register was in force at the time. Anything that learns from it learns that every app wants the register it already had, and every dictation you accept confirms it further. A classifier whose training data is its own output is not a classifier.
What is left is the thing that was true before you said a word: the app your cursor is in. Speechfy resolves it in four steps, stopping at the first that answers.
- A placement you made by hand. Never overruled by anything below.
- Speechfy’s shipped table of apps.
- One piece of macOS metadata, checked before it was trusted: whether the app declares itself a developer tool.
- Everywhere else.
Step three is one value and not the whole field, and that was read off a real Mac rather than assumed. Chrome carries no category at all, and neither do several other everyday apps. Terminal is filed under utilities while iTerm is filed under productivity — the same job, two buckets. And productivity holds Mail, Safari, Firefox, Notion, TextEdit, iTerm and Digital Color Meter together, so it cannot tell an email client from a browser from a terminal. Developer tools is the one bucket that means something, so it is the one bucket Speechfy reads.
Six destinations, not forty apps
Nobody configures forty apps. So the unit is not the app, it is the kind of place text lands in, and there are six of them.
- Terminals & editors · Off
- The model never sees a command line unless you send it there.
- People you know · Verbatim
- The apps you write to them in.
- Colleagues · Clean
- Where the writing is work.
- Things that get read later · Formal
- Mail and documents.
- Everywhere else · Clean
- Browsers, and every app with no placement yet.
- Notes · Clean
- Dictation into Speechfy itself.
The tabs are named for where the text is going rather than for the mood it goes in, and that is not a cosmetic choice. The destination is what the feature actually keys off — an app, not a state of mind — so naming it that way makes the label true. It also makes the control read as an instruction: move this to Colleagues is something you can do, where a category name is something you have to interpret.
Two of those rows have a story.
The browser stays in Everywhere else, and it is the honest hard case. A browser tab is webmail and it is a terminal and it is a bug report, and the only thing that could tell them apart is the URL, which is a different product with a different privacy answer. It is listed rather than left to the fallback, so you can at least see where your browser sits and move it.
Notes defaults to Clean, and that reverses an earlier decision. The original argument was that a note is your own draft so the words should be left alone, which is right about rewriting — and it also switched off the ability to turn a spoken list into a written one, because that permission is bound to the register. The result was that saying “rice, beans, meat, coffee” into a note produced a sentence, on the one screen in the entire product where a list is most obviously what you meant. A note is where people think in lists. Verbatim is one click away for anyone who disagrees.
The app names itself once, and then gets out of the way
There is a last instruction Speechfy can send with a dictation: the text will be inserted into X; match what is idiomatic there. It is useful, and it is dangerous, because it beats the register sitting above it.
- Formal, with the app named
- …I’ve got…
- Formal, with it withheld
- …I have…
So the app name only travels when there is nothing for it to overrule — that is, when Speechfy has never seen the app before and has no stated preference for it. The moment a register has been resolved, by your hand or by the shipped table, the app name is withheld. Otherwise the register you chose would be silently overruled by whichever window happened to be frontmost, which is the exact bug the whole feature exists to fix.
That is the shape of the thing: the destination picks the register, once, and then stops having opinions.
What you actually do about any of this
Ideally nothing. The shipped table is a preference until you disagree with it, and the six defaults were chosen so that the common case is already right: your terminal is left alone, your friends get your own words, your mail gets finished sentences.
When you do disagree, it is one move — open the Style room, read four versions of a sentence you actually dictated, and pick the one that sounds like you. Once, per kind of place. Not per message, and never in the half-second when you are trying to say something.