How we built AI that writes like you
Voice matching in AI is harder than it sounds. Here is the technical approach we took to make xNord drafts sound like the founder, not the model.
The most common feedback we get from new users is some version of: "it actually sounds like me." The second most common is: "how?" This post explains the answer — or at least the parts we can share publicly.
The naive approach does not work
The obvious approach to voice matching is to take a sample of the user's sent emails, dump them into the prompt as examples, and tell the model to "write like this." We tried it. It produces text that is recognisably in the right genre — professional, casual, whatever — but it does not actually sound like a specific person.
The problem is that language models average across training data. If you give them 10 example emails from the same person, they pull out the most prominent stylistic signals — short sentences, no pleasantries, lots of bullet points — but they miss the subtler patterns that actually make someone's writing distinctive.
What we actually extract
Instead of giving the model raw examples, we pre-process the sent email history and extract a structured profile. This profile includes:
Formality level — does this person use full sentences or fragments? Do they use contractions? Do they ever use slang?
Salutation patterns — "Hi" vs "Hello" vs "Hey" vs nothing. Whether they use the recipient's name. Whether they acknowledge the previous email directly or just respond.
Closing patterns — "Best," vs "Thanks," vs "Cheers," vs nothing. Whether they include a signature. Whether the signature is always the same.
Length norms by context — how long do their replies tend to be when responding to a short question? A long explanation? A request for a meeting?
Response time signals — this one is subtle, but the speed at which someone responds to different types of emails tells you something about what they treat as high-priority and what they treat as low.
Thread context depth — do they quote previous messages? Do they number their points? Do they ask multiple questions or one?
The prompt structure
Once we have this profile, we inject it into the system prompt not as raw text but as a structured description. Something like: "This person writes short, direct replies. They always use 'Hi [first name]' as a greeting. They sign off with 'Best,'. They rarely use more than three sentences. They use bullet points when listing more than two items."
This is more effective than giving examples because it forces the model to apply explicit rules rather than pattern-match against examples it may not fully understand.
The feedback loop
The other thing that makes voice matching better over time is the approval signal. Every time a founder sends a draft unchanged, we treat that as positive signal. Every time they significantly edit a draft before sending, we update the profile accordingly.
We do not yet do this in a sophisticated learned-embedding way — we update the profile heuristically based on what they changed. But even this simple signal loop improves match quality measurably over the first two weeks of use.
What we have not solved
Voice matching is better than it was six months ago and worse than it will be in six months. The areas we are still working on: contextual appropriateness (knowing when to be formal even if the founder's default is casual), relationship-specific tone (writing differently to investors than to customer support), and multi-language support for founders whose sent emails include multiple languages.
The goal is not perfect replication — it is reducing the editing burden to the point where reviewing a draft takes 10 seconds instead of writing from scratch taking 5 minutes. For most founders, we are already there on most emails. For edge cases, we are still working on it.