Prove what the machine wrote.
Invisible, key-verifiable watermarks for AI text.
The mark hides not in the letters, but in the split-second choices behind them. Undetectable to read. Undeniable with a key.
No quality loss
The mark rides ties between equally-good words. No extra tokens, no added latency.
Key-verifiable
A wrong key sees nothing. Identifies the model — never a person. Carries no user data.
Drop-in
A tiny WebAssembly module. Ten lines in Node or the browser — nothing to compile.
Where do you stamp a sentence?
From August 2026, the EU AI Act asks providers to mark AI-generated text. But a paragraph has no corner for a seal, and metadata dies on the first copy-paste. A visible tag ruins the writing; a hidden character is deleted by the first edit.
The mark has to live where edits can't reach and eyes can't see: inside the choices the model was already making.
Almost every word is a coin toss.
A model writes one word at a time, and at most steps several next words are equally good.
“…the weather is cold and overcast grey sugary”
overcast or grey — you'd never notice which landed. sugary was never in the running. The watermark only plays inside that harmless tie.
Swap the dice for the digits of π.
Normally the model settles a tie with a private roll of the dice — gone instantly. Watermarking keeps the odds identical but changes where the randomness comes from: a secret key plus the words just before decide the winner.
Like playing Monopoly with the digits of π instead of rolling — just as random, yet provable if you know π.
Reading the signature back.
Anyone with the key re-walks the text and asks at each tie: is this the word the key would have chosen? Human writing agrees by luck; watermarked writing agrees again and again — until coincidence is ruled out.
What it honestly can't do.
Short or factual text carries almost no mark. “Newton's masterwork was the Principia…” has one right next word — no tie to hide in. Give the detector length.
A wrong key sees nothing. The mark holds no trace of you. It answers one question: was a keyed model likely involved?
And it is not a way to hide that AI was used. This toolkit only writes and checks marks — never strips them.
Three schemes. One line to switch.
gumbel
Shifts the model's word-odds by zero. Provably distortion-free.
tournament
The SynthID method — a stronger mark for a whisper of bias.
tournament_nd
Unbiased on average. The middle path.
Ten lines. Nothing to compile.
// npm install @claude-flow/watermark const { Watermarker, detect } = require('@claude-flow/watermark'); const wm = new Watermarker({ key: 'my-secret', scheme: 'gumbel' }); const out = tokens.map(() => cand[wm.step(cand, probs)]); detect(out, { key: 'my-secret', scheme: 'gumbel' }).isWatermarked(1e-6); // true
Browser: import … from '@claude-flow/watermark/web' · Rust: cargo add ruflo-watermark