Everyone can now spot machine text on sight, the em-dashes, the "you're absolutely right", the invented technical terms nobody at any job ever used. I write a lot with agents, and I did not want my published words to smell like that. So I built hyphos, a small open tool that learns how I actually write, from my own words, and rewrites AI drafts to sound like me. This is the build log, including the parts that went wrong.
The corpus came first. My raw material was every message I've ever typed into my coding agents, plus a decade of sent email. Extracting "what I typed" turned out to be the real work. The first pass over my agent transcripts produced 1.27 million words, which sounded great until I measured where they lived, 91 percent sat in messages too long for anyone to have typed. Pasted logs, quoted docs, other people's text. Nobody types 1500-word prompts. So the filtering is mechanical and merciless, machine-shaped lines stripped out of every message, lengths capped at what a human plausibly types, and any message carrying a machine tell inside supposedly-mine text thrown away whole, 606,000 words in that last cut alone. I am left with 80,470 words that behave like typing, and that number I trust.
Email had a nastier lesson. I assumed a Sent export contains only my mail. Measured, 45 percent of it was other people's messages, whole threads riding along. If you ever build on personal data, enforce authorship structurally, don't assume it. A From filter and some multilingual quote-stripping later, 84,000 English words that are provably mine, with the Greek kept aside as rhythm signal only. The whole funnel, in numbers:
agent transcripts 1,270,000 words extracted
91 % in messages too long to have been typed
606,000 thrown away whole for a machine tell
80,470 left, and they behave like typing
sent email 45 % of the export was other people's mail
84,000 English words that are provably mine
Then the part I'd been waiting for, the fingerprints. Per register, because I don't have one voice, the me that instructs an agent is not the me that emails a stranger. Sentence lengths, punctuation habits, casing, openers, contraction rates. One number stopped me though. In my pre-2023 email, written before AI assistance existed, I used an em-dash exactly zero times in thirty thousand words. Not rarely. Never. The internet's favourite AI tell is, in my own measured history, a construction I simply don't make. That single statistic became a hard rule, any em-dash in "my" text gets rewritten out mechanically, no model discretion involved.
- The model handles meaning and register, the rules handle the fingerprint.
That's the design insight I'd defend most, by the way. Style instructions decay, models drift back to their priors within a few replies, everyone has watched it happen. So the quirks that can be enforced deterministically are enforced after the model, by boring code that cannot be argued with.
my typing, provably mine ──▶ fingerprint per register
(sentence length, commas, casing, openers)
│
AI draft ──▶ model rewrite ──▶ rules: the fingerprint, enforced
(meaning, by code (em-dash out, quirks kept)
register) │
▼
score: register distance + model-isms
And the score. Every output gets a number for how much it statistically resembles my register, plus a count of model-isms found. I'll be honest about where that stands, the model-ism counter works today, the stylometric half is underpowered on short texts and I've marked it low-confidence below 250 words rather than pretend otherwise. The calibration that gives the number meaning is a blind test, the tool shows me snippets, some mine, some machine, and my own failure to tell them apart is the target metric. When I can't beat a coin flip against my own rewrites, the tool works.
The first round is in, actually. Twelve snippets, six mine, six the engine's, shuffled, key sealed until I answered. I scored six of twelve. Exactly a coin flip. Three engine texts passed as mine, and stranger, I disowned three things I genuinely wrote, one of them with full confidence. What gave the generated ones away, when anything did, was the topic, not the tone, and topics are outside the tool's job on purpose. Small sample, one register, so I'm not framing this as proof. But as a first measurement it is uncomfortably encouraging.
hyphos is open source, local-first, and your writing never leaves your machine. Whether it convinces you is something you can measure yourself, which is rather the point.