
15 May 20266 min readby Michael Cutler
Voice-mimicry without losing the human: notes from Aimpress
Writing in someone else's voice is the easiest part. Writing in their voice without it sounding like a hostage video is the actual job. Notes on the safeguards, the refusals, and the 'would your boss recognise this?' test we use to keep Aimpress posts from going off-brand.
Aimpress is our small writer for LinkedIn and Twitter. You give it an archive of things you've already posted, plus a rough idea of what you'd like to say next, and it drafts something close to your own voice. The premise sounds straightforward right up until you try to ship it. Most of the interesting work has not been in the model, or even in the prompt; it has been in deciding what we let the model do under someone else's name, and what we don't.
Voice has layers.
When people say "write in my voice", they usually mean cadence and vocabulary — the surface texture. Short sentences vs long. Whether you use semicolons. Whether you say "folks" or "everyone". This part is genuinely easy. A modern model can pattern-match it from a few dozen samples, and most readers would not flag the result.
The middle layer is harder. It's topic selection: what this person tends to write about, what they avoid, what feels in-bounds for their public persona. Someone might write five posts a year about hiring and never one about politics; another might be the opposite. The model has to learn the silhouette of the archive, not just the prose.
The deepest layer is the refusal layer: the things a person, by long-established habit, will not say in public. They won't dunk on a competitor. They won't congratulate someone they don't actually know. They won't post at 2am on a Sunday. They won't restate an opinion they retracted in a private apology last year. This layer is the most important and the hardest to capture, because the evidence for it is absence in the training data, and absence is hard to learn from.
Aimpress tries to learn all three. The first is basically free. The third is the actual product.
The hostage-video problem.
The failure mode we kept hitting in early versions had a specific texture. The cadence was right. The phrasing was right. A skim-reader would not pick it out as machine-written. But something about the post felt off in a way colleagues kept describing the same way: it read like the person had been held against their will and forced to write it. Polished, on-tone, deeply embarrassing.
We started calling these hostage-video drafts. They got the surface layer perfectly and the judgement layer hilariously wrong — congratulating someone on a milestone the user wouldn't have noticed; weighing in on a topic the user had visibly stayed out of for years; reaching for an emotional register two clicks warmer than anything the user had ever published. Surface accuracy makes judgement errors more embarrassing, not less, because the post is signed in the person's name and worded in their cadence.
No clever prompt fixes this. The fix is the boring one: more constraint, fewer permissions, and a human in the loop before anything ships.
What we refuse to post, under any prompt.
The refusal list inside Aimpress is longer than the prompt template. A non-exhaustive sample of things we will not draft under a user's name, even when asked:
- Reactions to breaking news. The model does not know what the news means yet. Nor does the user. Drafts about events less than 48 hours old get bounced back.
- Takes on politics, war, or active humanitarian crises. Unless the user's archive has a long, established pattern of writing about a specific issue, we don't generate it. The cost of getting this wrong, in someone else's name, is too high.
- Congratulating named individuals on things we can't verify. "Congrats on the new role" to someone who hasn't actually changed roles is the kind of error that lives forever in a screenshot.
- Posting at unusual hours for that user. If the archive shows weekday mornings, we don't schedule a 2am Sunday draft, even when the queue is empty. Off-pattern timing is itself a tell.
- Restating opinions the user has marked as retracted. Users can flag previous posts as "no longer my view"; those posts stop influencing the voice model from that point on.
- Naming a competitor. Even neutrally. We've yet to see a competitor-mentioning post age well.
A user can override any of these defaults. Almost nobody does. The same logic is why Aimpress does not auto-post: a very early version did, produced our worst failures, and the feature has stayed gone since. Every draft sits in a queue until the user reads it, edits it, approves it. The writer is the user; we are the assistant.
The "would your boss recognise this?" test.
The test we now apply to every draft is the felt-sense check. The question is not "is this well written" or "is it on-topic" — both can be true while the draft is still wrong. The question is: if a long-time colleague of yours read this in their feed without seeing the byline, would they know it was you?
We don't have a model that can answer that reliably. What we have is a stack of cheaper proxies — sentence-length distribution against the archive, vocabulary outliers, emotional-register shifts, topic novelty — that together produce a confidence score. Drafts below the threshold come with a flag that says, in plain words, this doesn't quite sound like you yet, here's why, and the user can edit or regenerate.
The example that made us build this check was our own. An early draft about a colleague's promotion congratulated them in a register a notch too effusive for the user's normal style — slightly too many adjectives, an exclamation mark we wouldn't have used. The words were not wrong. The voice was not the user's. The colleague would have noticed. The user did, before we shipped it, and the check exists because of that draft.
This is no accident, and it pairs with the broader thesis behind the company: products written by small teams who use them daily tend to spot these things. You only add a felt-sense check when you would be personally mortified by the alternative.
What we still get wrong.
A few things we have not solved and may never:
- Humour. Models can write something approximately funny. They cannot yet write something funny the way you are funny. If a post needs to be funny, write it yourself; let Aimpress handle the on-the-nose ones.
- The first post in a new topic. If you have never written about a subject before, we have nothing to mimic. The first one has to come from you. After three or four, the model has something to work with.
- Changes in life context. A user who has just had a child, or left a job, or moved countries, writes differently for a while. The archive lags behind reality. We ask users to tell us when something big has changed.
We have come to think of voice-mimicry not as a generation problem but as a restraint problem. The interesting model behaviour is what it declines to do, not what it produces. If that sounds backwards for a writing product, it might be. It is also the only version we are willing to ship under our customers' names.
If you've found a better answer to any of the above, email us. We'd rather learn from someone else's draft than our own.
Was this useful? Email us a reply →

