Better Writing

Rewrite anything in the voice of a writer you admire.

Paste an email, a memo, a launch post. Get it back the way Paul Graham would have written it: plain words, short sentences, the point up front. Measured against his real essays, not just claimed.

Your text47 words, 400 max
As Paul Graham
The rewrite streams in here.
Three free rewrites a day. Nothing you type is stored.
Before and after

Same facts. Different writer.

Placeholder samples. Real ones come from the first published eval run and replace these automatically.

emailplaceholder
Input
Hi team, just a quick note to say that we will be moving the weekly sync to Thursdays at 10am starting next week. Please update your calendars accordingly and let me know if there are any conflicts. Thanks!
As Paul Graham
We're moving the weekly sync to Thursdays at 10. It starts next week. If that collides with something, tell me and we'll fix it.
announcementplaceholder
Input
We are thrilled to announce the launch of our new analytics dashboard, which leverages cutting-edge technology to empower teams with actionable insights in real time.
As Paul Graham
We built a new analytics dashboard. The interesting part isn't the charts. It's that you can see what's happening while it's still happening, which changes what you decide to do about it.
apologyplaceholder
Input
We sincerely apologize for the inconvenience caused by yesterday's outage. Our team worked tirelessly to resolve the issue and we have implemented measures to prevent a recurrence.
As Paul Graham
Yesterday we went down for three hours. That was our fault. We found the cause, fixed it, and changed the deploy process so the same mistake can't get through again.
Evals

Indistinguishable is a number, not an adjective.

Every prompt or model change runs a frozen set of 120 inputs through six families of metric. Nothing ships unless all six pass. The current numbers:

pending No published report yet. The first gate run will land here as JSON; the site never computes a number.

Style embedding pending

n/a
Pass: median position >= 0.5 and >= 90% of rewrites above the cross-author floor

Jury 2AFC pending

n/a
Pass: mean jury accuracy <= 0.60 (chance is 0.50); never a single judge

Checklist pending

n/a
Pass: mean >= 8.0 of 10 items

Meaning preserved pending

n/a
Pass: NLI >= 0.80, claim recall >= 0.90, claim precision >= 0.90

AI detection pending

n/a
Pass: >= 95% of rewrites scored human

Length and format pending

n/a
Pass: >= 90% within 25% of input length, 100% format clean

Contamination caveat: PG's essays are in every pretraining set. The rewrite task (new input text, not continuation) limits regurgitation credit, and claim precision catches fabricated PG positions.

Full methodology and every definition: how we measure.

Voices

One voice live. More when they pass.

Paul Graham live

Essays, 1993 to 2024. Holdout essays from 2025 on are never used in prompts or training, so the evals test imitation, not recall.

Serving: prompt v1, model claude-fable-5-1. Voice id pg, X handle @paulg.

More voices coming request

Tell us which writer you'd want, and where to reach you when that voice passes the same gate.

API

One endpoint. Bring a key.

Free keys, fifty rewrites and twenty thousand words a day. Sign in with Google to mint one, then:

curl https://betterwriting.ai/api/v1/rewrite \
  -H "Authorization: Bearer bw_live_..." \
  -H "Content-Type: application/json" \
  -d '{"voice":"pg","text":"We are excited to announce..."}'

Add "stream": true for server-sent events. GET /api/v1/voices lists the roster. Errors come back as {"error","message"} with the usual status codes. Full reference.

Coding agents

Or make your agent write this way.

A Claude Code plugin rewrites every response and every prose file the agent writes, in the voice you pick. No account for the first 15,000 words. Set it up in one line.

claude plugin marketplace add dsiroker/betterwriting-agent && claude plugin install betterwriting@betterwriting-agent

/voice pg
On X

Or just tag the bot.

Reply to any tweet with @betterwriting as @paulg. The bot rewrites the tweet you replied to and answers in the thread, one reply per mention.