EU AI Act ready · SynthID-Text method

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.

npm install
SynthID-Text · Nature 2024 Rust + WASM · Node + browser 37 KB · MIT ~10M tok/s detection
SCROLL

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.

01 · THE QUESTION

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.

02 · THE OPENING

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.

generation — the shortlist appears, the key picks a tied word, the line grows
03 · THE TRICK

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 π.

identical odds, two sources — the die lands anew; the key lands the same, every time
04 · THE PROOF

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.

detection — the meter falls from “could be chance” to “≈ 1 in a billion”
05 · THE LIMITS

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.

06 · IN YOUR HANDS

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

loading WebAssembly module…