
Platforms can stamp an AI label, scan a caption, or ban an account. That still leaves a separate problem: the draft can read like a template even when nothing flags it. We wrote about that split in AI labels, detectors, and bans. This post is the writing catalog and the code path behind Humanizer.
I can usually spot a lazy generated draft in a few seconds. Uniform 18-word sentences. A pep-talk last line. “This budget isn’t a number. It’s a statement of intent.” You have seen that paragraph in Slack. Your audience has too.
We do not score your post against a commercial classifier. We rewrite habits that show up again and again in machine-written social copy, then you read the result. The catalogs and the two rewrite paths live in the public ai-humanize folder.
What a detector is actually doing
Writing classifiers are pattern matchers. They learned a pile of “this looks generated” habits and a pile of “this looks written by a person” habits. Those piles overlap. A lot.
People write stiff copy. Models write loose copy. Short posts barely give a classifier anything to work with. Ask “AI or not?” on a one-liner and the two circles sit on top of each other.
Prompt for a style and the “generated look” moves. Ask for Simplified Technical English and you get IKEA-manual sentences: clear, flat, not great for a launch thread. Ask for a founder voice and the tells change again. Infinite styles, fuzzy boundary.
That is why a detector score is a weak product promise. One punctuation swap can flip a result. We still care about the tells, because readers notice them even when a bot does not. LinkedIn comment sections are full of this. You can feel it without a degree in NLP.
The useful question is smaller: which habits make a social post sound like workslop, and can we strip those without inventing a fake personality?
The tells we keep seeing
These are the constructions that give a draft away fastest. We encoded them as data, not as a 2,000-word prompt. The regexes and phrase lists are in tells.ts. Instant-kill leaks sit in smokingGuns.ts.
Structure and rhythm
Low burstiness is the quiet one. Every sentence 15 to 20 words. Paragraphs the same height. Force a spread: one sentence of six words or fewer, one of 25 or more. Uneven paragraphs. At most one single-line paragraph used on purpose, not as a design system.
Fractal summaries: “In this section we’ll…” then a recap at every heading. Delete them. Signposted closers: “In conclusion,” “Overall,” then a restatement plus uplift. Delete those too. End on the last concrete point.
Pep-talk endings: “As we move forward, embracing X will be key.” Gone. Prompt echo: “This essay will explore…” Gone. Listicle in a trenchcoat: “The first reason is… The second reason is…” Merge into a flowing argument. Uniform staccato: “X is A. X is B. X is C.” Combine or vary the frames.
Punctuation and formatting
Em dashes are the famous tell. Generated copy sprays them. People use a couple. We target almost none. In the local rewrite, an em dash becomes a period or a comma depending on what follows.
Bold-first bullets (“Security: …”) almost never show up in a caption someone typed. Emoji bullets (the decorative checkmarks and brains) get stripped. Title Case headings and colon-split titles (“The Power of X: Why Y Works”) read like a slide. Sentence case is enough.
Oxford commas 100% of the time can sound edited. Dropping one in a casual register is fine. Markdown residue is worse: leftover bold markers, heading hashes, or markdown links in a place that will not render markdown. We strip that in the local path before anyone pastes it into LinkedIn.
Voice
If the first three sentences evoke nothing visible, the draft is floating. Inject a thing, a place, a number, a name. “A client” and “a tool” and “a city” are how models dodge proper nouns. Name the tool. Invented people in examples cluster on Emily and Sarah. Do not add those.
Uniform positivity is another giveaway. Everything upbeat, everything certain. Let something be annoying or unfinished. Both-sidesing every claim with its counterpoint is the same habit in a suit. Commit.
Suspiciously tidy anecdotes serve the argument with no leftover. Real stories have a tangent. Register scrubbing (no contractions, no slang the voice would use) makes a founder sound like a white paper. Restore the contractions the person would actually say.
Negative parallelism deserves its own line. “It’s not X, it’s Y.” Models love it. We flatten it. Sometimes that one change is the whole joke.
Words we almost never want
The lexicon is in lexicon.ts. Tier-1 means do not use this in a social post unless you have a boring literal reason.
Verbs we bounce: delve, leverage, underscore, harness, foster, navigate (the figurative kind), utilize, facilitate, streamline, bolster, illuminate, showcase, embark, elevate, empower, unleash, unlock (figurative), uncover, optimize, garner, resonate, revolutionize, shed light on, synthesize, elucidate, transcend, reimagine, intertwine, grapple with, espouse, exemplify, underpin.
Nouns: tapestry, landscape (figurative), realm, ecosystem (figurative), paradigm, synergy, testament, beacon, journey (figurative), interplay, intricacies, symphony (figurative), kaleidoscope, roadmap (figurative), endeavor, myriad, plethora, advancements, trajectory (figurative).
Adjectives and adverbs: pivotal, crucial, seamless, robust, vibrant, intricate, meticulous, nuanced, cutting-edge, transformative, game-changing, groundbreaking, unparalleled, invaluable, multifaceted, commendable, indelible, poignant, profound, relentless, tireless, unwavering, unyielding, timeless, ever-evolving, fast-paced.
Stock openers and closers: in today’s fast-paced world, it’s important to note, plays a crucial role, stands as a testament, navigate the complexities of, in conclusion, in summary, at its core, that being said, a key takeaway, paving the way for, valuable insights, here’s the kicker, dive into, let’s unpack, furthermore, moreover, additionally (at the start of a sentence).
Narrative clichés belong in fiction homework, not a product update: couldn’t help but feel, heart pounding, a sense of X washed over, found solace, the human spirit, little did we know, a stark reminder, nestled between, bustling, enigmatic, captivating.
Tier-2 is allowed alone. Comprehensive, significant, essential, critical, innovative, framework, challenges, opportunities. Stack three of those in one sentence and you are back in slide-deck land. The catalog caps how many may sit together.
The swap table in swapTable.ts maps flagged phrases to plainer wording, or drops them. “Utilize” becomes “use”. Some stock openers just vanish.
Leaks that should never ship
Smoking guns are not style. They are residue from a chat window.
Bracket placeholders such as insert-example or your-company. Self-talk: “as an AI language model,” knowledge-cutoff notes. Tracking params: utm_source=chatgpt.com on a URL you meant to share. Email sign-offs on a social post: “Best regards.” Performative wrap-ups: “Hope this helps,” “let me know if you need anything else.” Lorem ipsum. We strip those first, before the nicer swaps.
Be careful with curly quotes pasted into plain text, semicolons where a period would do, and the same idea restated three times in new clothes. Performative helpfulness (“I hope this clarifies things!”) is a cousin of the email sign-off.
What we refuse to do while “fixing” it
Those rules live in rewriteConstraints.ts.
Do not swap every word for a weirder synonym. We can tell. Do not scatter random typos. Errors have to read as casualness, and only where the register allows them. Do not scrub personality along with the tells. A flat, tell-free caption is still machine-shaped.
Do not invent names, dates, prices, stats, or quotes. Do not shrink every long sentence. People write long sentences. They just do not write only 18-word ones.
Markers that help, used sparingly: contractions; a number with texture ($43, 11 months, 4:30am, v2); a named brand or street; a parenthetical aside with attitude; “I think” or “honestly” once; a sentence starting with And, But, or Because; one single-sentence paragraph; a mild complaint; a dropped Oxford comma in casual copy; a question the reader was actually asking; a plain “is” where a model would write “serves as.” The cue list is in humanMarkers.ts.
Catalogs, not a giant prompt
We do not keep the essay in a drawer. Tells, swaps, and never-use words sit in those TypeScript files. Tests import the same object the Rewriter context builder uses. Add a verb in the lexicon. Do not rewrite the prompt by hand.
The bundle is writingGuide.ts. sharedContext.ts serializes it into a compact instruction block for Chrome’s on-device Rewriter: tier-1 never-use terms, the swap table, smoking-gun phrases, burstiness targets, and the “do not” list.
There is a Simplified Technical English overlay in config. It is off by default. Human and Roughen stay the only user-facing modes. STE is a hammer for docs, not for a product tweet.
Human vs Roughen
Human is the default. Same facts, same CTA, less stock phrasing. Keep it a social post.
Roughen is meaner. More spoken. Contractions. Room to drop a coverage opener like “Moreover,”. If the on-device model invents a name, date, or price, we flag it so you can swap a real one. Local Roughen never invents those. It only contracts and tidies.
Rewriter sessions are keyed by mode. Shared context is immutable per session, so flipping Human to Roughen throws the old session away. That wiring is in Humanize.presenter.svelte.ts.
Why it is free, and why there is no token cap
OpenQuok does not bill Humanizer by the word. There is no workspace token bucket to drain. The on-device rewrite runs in Chrome, on your machine, using the built-in Writing Assistance APIs.
Humanizer’s model path is the Rewriter API: take the draft you already have, revise tone and rhythm, stream the result. New copy from a blank prompt in the signed-in composer uses the partner Writer API. Same origin trial, same on-device foundation model. Chrome’s docs are blunt about the privacy bit: after the first download, using the model does not send the text to Google or to us.
That is why we can leave the public tool ungated. We are not paying a cloud LLM per rewrite. You pay once in disk and a first download on an unmetered connection. Chrome asks for a lot of free space on the profile volume, a capable GPU or a beefy CPU, and a current desktop Chrome. Android and iOS are out. If Rewriter is missing, Humanizer still runs the local catalog cleanup. That path is also free. It is just dumber.
Unlimited here means we do not meter API tokens. It does not mean every laptop can download the on-device model, or that the origin trial will look the same next year. Soft opt-in exists so we do not surprise you with a huge fetch. After that, rewrite as often as the machine will let you.
Two rewrite paths
The public page is a mocked composer. Sample channel chips, character limits, local media. No OAuth from that origin. You can rewrite and copy with no account. Sign in only when you want real channels and a schedule. The free rewrite has to work if you dismiss the lock dialog.
On a supported Chromium browser, Humanizer can download an on-device Rewriter model. Soft opt-in first. We do not surprise you with a huge fetch. Streaming replace goes into the composer body. That is not a metered OpenQuok endpoint.
If Rewriter is missing, the page still does something. applyLocalHumanizeRewrite runs the catalogs in a fixed order: smoking guns, markdown, emoji bullets, dashes, negative parallelism, swap table, tier-1 lexicon, pep-talk last sentence. Deterministic. Fast. A bit dumber than a model. Fine for a Friday caption.
After either path, auditTells.ts counts hits on the source and the rewrite. That is a habit counter. Not a courtroom, and not a detector score.
Live channels from the public catalog get /tools/humanizer/{slug} from the same route files as the generic tool. LinkedIn-shaped drafts: LinkedIn Humanizer. X-shaped drafts: X Humanizer. The channel page preselects that mock chip and tightens FAQ copy. 404 if the slug is not live. Hub blurbs live in publicHumanizeChannelConfig.ts.
When you connect a real account later, that is workspace work on Channels, not the public mock.
What we will not claim
We will not say this fools a commercial detector. Detectors disagree with each other. Humans write robotic text. Models write natural text. The overlap is the whole problem, which is why AI labels, detectors, and bans treats disclosure and readable voice as different jobs.
What Humanizer is good at: killing the tells you already notice in Slack. What you still have to do: put a real number in, name the tool, leave one annoying unresolved edge, read it out loud once.
If the rewrite still sounds like a slide deck, the draft was a slide deck. Run it again, or write the first sentence yourself and only humanize the rest.