Ask a language model to "write this the way I would" and you get an average of everyone who has ever written a polite email. The model has no idea who you are, so it reaches for the median, and the median sounds like a press release.
The fix is not a better prompt. It is giving the model something specific to work from.
The rule
Count what can be counted. Ask the model only for what cannot.
We measure thirteen things about how you write. Ten of them are arithmetic and involve no model at all:
- your most common greetings, with the recipient's name normalised out
- your most common sign-offs
- how often you open with a greeting at all
- how often you close with one
- your median reply length in words, ignoring the greeting and sign-off
- your emoji rate
- your exclamation-mark rate
- your contraction rate
- your bullet rate
- your typical number of paragraphs
None of that requires intelligence. It requires counting. And because it is counting, it is exact, it costs nothing, it is trivially testable, and it survives us swapping the underlying model — which we have done twice.
Only three things genuinely need a model: how formal you are on a scale of one to five, up to four recurring quirks, and which language you write in. Those get one small call against the first handful of your messages. If that call fails, the counted ten still save.
Never assert from one sighting
The second rule matters more than the first. A habit has to hold across 60% of your mail before Parrot treats it as yours. Sign one email "Cheers," and nothing happens. Sign most of them that way and it becomes a fact about you.
This sounds conservative because it is. The failure mode for a system like this is not being slow to learn — it is confidently telling the model something wrong about you and then writing every reply that way.
Your edits are better data than your archive
Your sent mail tells us how you write in general. Your edits tell us what Parrot is getting wrong right now, which is far more useful.
When you change a draft before sending, we diff what we wrote against what you sent. The diff is entirely mechanical — no model reads it. It can see twelve things: greeting added or removed, sign-off added or removed, emoji added or removed, exclamations added or removed, contractions added or removed, and whether you made it materially shorter or longer.
Those twelve come in six opposing pairs, and this is the part we are proudest of: when Parrot observes one side of a pair, it deletes the other. Not decays it, not down-weights it — deletes it. If you spent a month trimming our drafts and then start expanding them, "keeps it short" is removed the moment "goes longer" is seen.
The alternative is an instruction list that slowly accumulates contradictions until the model is being told to be brief and expansive in the same breath. We would rather forget something true than hold two things that cannot both be.
A signal also has to be seen twice before it changes anything. Once is an accident. Twice is a preference.
Where it goes
The finished profile is handed to three places — drafting, suggested replies, and tone rewrites — with an explicit precedence written into the prompt: what you have told us directly beats what your edits taught us, which beats what we measured, which beats the examples.
And the summary you read in Settings is generated from the same function that builds the prompt. There is no friendly description sitting in front of a different hidden truth. What it says is what the model is told, word for word.

