Chinese Text Humanizer
op7418/Humanizer-zh
Edits Chinese articles, comments and documents to remove filler, repetition and template phrasing while keeping the facts, the level of certainty and the author's voice.
Audits prose for invisible Unicode characters and rewrites it while keeping facts, citations, code and required disclosures unchanged and the writer's voice intact.
$ npx skills add guillaumemeyer/watermarks-remover --skill clean-user-facing-text -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install guillaumemeyer/watermarks-remover clean-user-facing-text --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/guillaumemeyer/watermarks-remover.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/clean-user-facing-text .claude/skills/clean-user-facing-text && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "clean-user-facing-text" agent skill from https://github.com/guillaumemeyer/watermarks-remover/tree/main/skills/clean-user-facing-text into .claude/skills/clean-user-facing-text/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clean-user-facing-text", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/guillaumemeyer/watermarks-remover/tree/main/skills/clean-user-facing-textType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add guillaumemeyer/watermarks-remover --skill clean-user-facing-text -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install guillaumemeyer/watermarks-remover clean-user-facing-text --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/guillaumemeyer/watermarks-remover.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/clean-user-facing-text .agents/skills/clean-user-facing-text && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "clean-user-facing-text" agent skill from https://github.com/guillaumemeyer/watermarks-remover/tree/main/skills/clean-user-facing-text into .agents/skills/clean-user-facing-text/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clean-user-facing-text", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add guillaumemeyer/watermarks-remover --skill clean-user-facing-text -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install guillaumemeyer/watermarks-remover clean-user-facing-text --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/guillaumemeyer/watermarks-remover.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/clean-user-facing-text .cursor/skills/clean-user-facing-text && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "clean-user-facing-text" agent skill from https://github.com/guillaumemeyer/watermarks-remover/tree/main/skills/clean-user-facing-text into .cursor/skills/clean-user-facing-text/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clean-user-facing-text", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/guillaumemeyer/watermarks-remover.git --path skills/clean-user-facing-text--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add guillaumemeyer/watermarks-remover --skill clean-user-facing-text -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install guillaumemeyer/watermarks-remover clean-user-facing-text --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/guillaumemeyer/watermarks-remover.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/clean-user-facing-text .gemini/skills/clean-user-facing-text && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "clean-user-facing-text" agent skill from https://github.com/guillaumemeyer/watermarks-remover/tree/main/skills/clean-user-facing-text into .gemini/skills/clean-user-facing-text/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clean-user-facing-text", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install guillaumemeyer/watermarks-remover clean-user-facing-textInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add guillaumemeyer/watermarks-remover --skill clean-user-facing-text -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/guillaumemeyer/watermarks-remover.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/clean-user-facing-text .github/skills/clean-user-facing-text && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "clean-user-facing-text" agent skill from https://github.com/guillaumemeyer/watermarks-remover/tree/main/skills/clean-user-facing-text into .github/skills/clean-user-facing-text/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clean-user-facing-text", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add guillaumemeyer/watermarks-remover --skill clean-user-facing-text -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install guillaumemeyer/watermarks-remover clean-user-facing-text --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/guillaumemeyer/watermarks-remover.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/clean-user-facing-text .opencode/skills/clean-user-facing-text && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "clean-user-facing-text" agent skill from https://github.com/guillaumemeyer/watermarks-remover/tree/main/skills/clean-user-facing-text into .opencode/skills/clean-user-facing-text/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clean-user-facing-text", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
clean-user-facing-textAudits prose for invisible Unicode characters and rewrites it while keeping facts, citations, code and required disclosures unchanged and the writer's voice intact.
The skill is a final hygiene pass for text that you own or are authorized to process, such as articles, manuscripts, reports, documentation, emails, product copy, UI text, Markdown or HTML prose. Its first layer is deterministic: scripts inspect the text for suspicious invisible Unicode and clean_text.py strips it before any rewriting, so the rewrite works on marker-free text. Reducing statistical, watermark-style patterns is described as best-effort, and the skill says never to claim that a rewrite proves human authorship or cannot be detected.
Before rewriting, the agent sets aside non-prose spans such as code, commands, paths, URLs, identifiers, API names, exact values, formulas, citations and verbatim quotes, and keeps every claim, fact, number and name. If a fact is missing it flags the gap rather than inventing one. A stylometry scoring script measures the text first, and the agent rewrites only when the density tier is high; low and medium tiers are verified and left alone. A detect-only audit mode lists flagged spans without changing anything. Voice samples are used only when you own them, no other named person's style is imitated, and no fake first person, invented specifics or added stance are introduced.
Reference notes cover detectors, responsible use, watermark notes and writing in your own voice. The skill is not for code-only tasks or for hiding authorship that should be disclosed, and it preserves required academic, legal, platform and regulatory disclosures.
10 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit c5297e9. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 5 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
pythonFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
User-Facing Text Cleanup loads about 3.5k tokens when it runs, and up to ~6.6k if it reads all its reference files. Until then it costs about 162 tokens; SKILL.md has 1,782 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from guillaumemeyer/watermarks-remover at commit c5297e9, republished under its MIT licence (© guillaumemeyer). 1,782 words, ~3,472 tokens.
.claude/skills/clean-user-facing-text/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.Apply a final text-hygiene pass to prose the user owns or is authorized to process. Treat Unicode cleanup as deterministic and statistical-watermark reduction as best-effort; never claim that a rewrite proves human authorship or is undetectable. Preserve required academic, legal, platform, and regulatory disclosures.
Identify the prose that readers will see.
Protect non-prose spans:
Preserve every claim, fact, number, name, citation, and requirement. Never invent a detail, name, number, quote, or source to make the prose easier to write or more varied: if a fact is missing, flag the gap rather than fill it. The rewrite may sharpen, compress, or reorder, but it may not add or remove claims.
Measure before. Inspect and score the input with the vendored zero-LLM stylometry estimator (see Scoring) and record the score. Read the report's density_tier: rewrite only when it is high; for low or medium, verify the text and otherwise leave the text unchanged. For a flag-only audit that never rewrites, use --audit:
PYTHON "$SCRIPTS/inspect_text.py" --stylometry --json INPUT
PYTHON "$SCRIPTS/inspect_text.py" --audit INPUT # detect-only: lists flagged spans, no rewriteEstablish the writing brief before changing prose:
Layer A — strip artifacts first. For text artifacts or supplied text files, run the deterministic Unicode pass before rewriting, so the rewrite operates on clean, marker-free text:
PYTHON "$SCRIPTS/clean_text.py" INPUT -o OUTPUT --stats --no-normalize-spacesLayer B — rewrite once. Rewrite the remaining prose once, applying the detector levers (see Detector levers) in order:
Layer A again. Run the deterministic Unicode pass on the rewritten result to catch any artifacts the rewrite introduced (smart quotes, em dashes, homoglyphs):
PYTHON "$SCRIPTS/clean_text.py" OUTPUT -o FINAL --stats --no-normalize-spacesMeasure after. Score the rewritten text the same way. Report scores and confidence levels when available; otherwise report status: insufficient_length. A lower after-score means the measurable signals moved; it is not a verdict from any detector, and it never overrides the fact and voice rules above.
Return only the polished result unless the user asks for an audit or explanation.
For practical guidance on preserving a writer's voice and removing formulaic prose,
read references/writing-in-your-voice.md whenever the user asks to retain or adjust voice.
For what detectors really measure and which claims are legitimate, read references/detectors.md.
scripts/inspect_text.py --stylometry (or the standalone scripts/score_stylometry.py,
which also accepts --explain) runs the zero-LLM estimator vendored from the service
pipeline: sentence-length burstiness (coefficient of variation), weighted AI-cadence
phrase density per 100 words, lexical diversity (MATTR), and a dampened composite
score from 0 to 1. Exit code 1 means the score is at or above the threshold
(default 0.65). The report also carries a density_tier (low / medium /
high, or uncalibrated when not scored) that re-labels where the score sits
so the rewrite pass engages only for high. inspect_text.py --audit produces
the same scoring plus the detect-only flagged-span list but never rewrites.
Under 30 words the estimator reports status: insufficient_length instead of a
score. Nothing here calls the network; the skill stays self-contained.
Limits: the estimator is calibrated for the statistical detector family (perplexity and burstiness style signals). It is not the output of trained neural classifiers such as GPTZero, Turnitin, Originality, or Pangram, it does not detect secret-key watermarks, and it says nothing about authenticity. A low after-score means the measured signals moved; it does not prove the text reads as human or that any particular detector would accept it. When the user asks for an audit, report the numbers as a gauge, not as a verdict (see Reporting).
Resolve SCRIPTS to this skill's scripts/ directory.
Use the available Python 3 launcher for the platform. Replace PYTHON below
with python3 on most macOS/Linux systems, py on Windows, or another verified
Python 3 command.
This skill is self-contained and runs its vendored scripts directly; it has no service or network dependency. Deterministic Layer A cleaning below is invoked by script, intentionally, so the skill works where the HTTP service is absent.
Inspect first when editing an existing file (include --stylometry to record
the before score):
PYTHON "$SCRIPTS/inspect_text.py" --stylometry --json INPUT
PYTHON "$SCRIPTS/clean_text.py" INPUT -o OUTPUT --stats --no-normalize-spaces
PYTHON "$SCRIPTS/inspect_text.py" --stylometry --json OUTPUTUse - for stdin. Prefer a new *.cleaned.* output unless the user explicitly requests in-place editing.
Use --no-normalize-spaces by default so NBSP, narrow no-break spaces, figure spaces, and CJK ideographic spaces retain their layout semantics. Normalize spaces only when the user requests it.
Do not use --aggressive-homoglyphs, --nfkc, or --strip-emoji-glue unless the user requests aggressive normalization and accepts possible changes to multilingual text, emoji, directionality, or typography.
The scripts support plain text, source text, Markdown, and HTML source as text. For mixed Markdown or HTML, inspect hit positions first. If a hit falls inside protected code, attributes, or another non-prose span, do not run whole-file cleanup; clean only the prose segments or leave that hit unchanged. Do not pass binary containers such as PDF, DOCX, images, or archives.
For a chat-only response that is not written to a file, perform the rewrite workflow directly. Do not claim that the chat response received a deterministic post-send Unicode filter.
Statistical detectors score probability patterns: AI prose is too predictable (low
perplexity), too even (low burstiness), and too full of stock phrases. The levers
below target those signals, most effective first. Levers 1, 2, and 6 are
deterministic or near-deterministic; 3 to 5 are aims, not guarantees. Engage the
rewrite levers only when the measure-before density_tier is high; for low
or medium, the measurable AI-density signals are weak, so verify and otherwise
leave the text unchanged. The pass ordering below follows the pattern
catalogs in references/detectors.md.
clean_text.py) before anything else: invisible characters and homoglyphs are
mechanical markers that hurt with every detector family and are cheap to remove.references/writing-in-your-voice.md). Never invent a fact to raise
variance; a lower score with a fabricated detail is still a failed rewrite.Honest caveat: these levers are aimed at statistical detectors. Trained neural
classifiers are adversarially trained against paraphrase-style edits (see
references/detectors.md); against those, the only robust lever is matching a real
human distribution, and even that cannot be guaranteed.
Presets tune how hard to apply the levers and how much personality to allow. They never override the fact rules (fiction excepted, see step 3 above) and they are not guarantees of any detector result.
| Preset | Personality | Rhythm and phrasing | What to eliminate |
|---|---|---|---|
| General prose (default) | Author's voice first, no injected stance | Mild variation, natural connectors | Stock AI vocabulary, uniform cadence |
| Essay / blog | Stance, asides, mixed feelings welcome | Strong length variation, uneven rhythm | Significance hype, aphorism formulas, rule of three |
| Technical / documentation | Neutral, precise | Moderate variation, short declaratives | Promo language, em dashes, bolded mini-headers; keep code and identifiers intact |
| Academic / professional | Formal, evidence-first | Restrained variation, controlled hedging | Over-claiming verbs, novelty padding, citation dumps; keep required discipline |
| Business / product copy | Plain claims, concrete value | Direct sentences | "Seamless", "empower", vague benefits, rule of three, required disclaimers kept |
| Fiction | Invented detail allowed | Variation to fit the narrator | Uniform cadence, editorial clichés; preserve dialect and quirks |
For procedures, runbooks, errors, and other engineer-facing text, the user may request a plain-language sub-mode: short common words, one instruction per sentence, imperative verbs for steps, one meaning per term, and no marketing adjectives or unbounded hedging. This sub-mode is a clarity floor, not a new personality: it strips voice deliberately, keeps every claim and requirement, and is not a detector-evasion tool. Use the voice-preserving presets above for essays, posts, and personal prose instead.
When prose and code are mixed, rewrite prose only. Never rename variables, alter string literals, reformat code, or change executable output as part of this skill. If a Markdown or HTML file contains executable snippets, preserve those spans byte-for-byte whenever practical.
When the user asks for an audit, distinguish:
For technical background, read references/watermark-notes.md. For misuse or disclosure questions, read references/responsible-use.md.
© guillaumemeyer, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 9 other files (scripts, references) in skills/clean-user-facing-text of guillaumemeyer/watermarks-remover.
Open the folder on GitHubat commit c5297e9
User-Facing Text Cleanup next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| User-Facing Text Cleanup this skillguillaumemeyer/watermarks-remover | 24k | — | ~3.5k | Automated safety check: Pass | MIT | |
| Chinese Text Humanizerop7418/Humanizer-zh | 19k | — | ~2k | Automated safety check: Pass | MIT | |
| Natural Japanese Business Writingcoji/natural-japanese | 1.9k | — | ~2.1k | Automated safety check: Pass | MIT | |
| Zero Slop Prose Editoriflytek/skillhub | 5.2k | — | ~1.5k | Automated safety check: Pass | MIT | |
| Web Novel AI-Trace Removerzenstory-ai/oh-story-claudecode | 7.4k | 1 repos | ~2.6k | Automated safety check: Pass | MIT | |
| Korean AI-Text Humanizerepoko77-ai/im-not-ai | 5.9k | — | ~4.5k | Automated safety check: Pass | MIT |
op7418/Humanizer-zh
Edits Chinese articles, comments and documents to remove filler, repetition and template phrasing while keeping the facts, the level of certainty and the author's voice.
coji/natural-japanese
Writes and edits Japanese business documents so they read clearly and naturally, removes AI-sounding phrasing and can score how AI-like a text reads.
iflytek/skillhub
Audits and rewrites formulaic, AI-sounding prose while keeping facts, voice and format, using a local Python scorer and inspect-only, rewrite or embedded-gate modes.
zenstory-ai/oh-story-claudecode
Rewrites AI-sounding Chinese web novel text so it reads naturally, changing as little as possible and keeping plot, names and numbers intact.
epoko77-ai/im-not-ai
Rewrites Korean text written by AI so it reads like a human wrote it, detecting translationese and other AI patterns while leaving the content untouched.
smixs/humanizer-ru
Edits Russian text to remove signs of AI generation, bureaucratic phrasing and filler while keeping facts, with a lint script and a detect-only mode.
guillaumemeyer/watermarks-remover
Strips AI provenance marks from text and files: invisible Unicode, statistical text watermarks via rewriting, and C2PA, EXIF or XMP metadata across common formats.
Categories
Audits prose for invisible Unicode characters and rewrites it while keeping facts, citations, code and required disclosures unchanged and the writer's voice intact. The skill is a final hygiene pass for text that you own or are authorized to process, such as articles, manuscripts, reports, documentation, emails, product copy, UI text, Markdown or HTML prose.py strips it before any rewriting, so the rewrite works on marker-free text.
User-Facing Text Cleanup fits situations like: finalizing an article, report or manuscript before publishing; checking prose for hidden or suspicious Unicode characters; polishing product copy or UI text without changing its meaning; running a detect-only audit that flags spans but changes nothing.
Run `npx skills add guillaumemeyer/watermarks-remover --skill clean-user-facing-text -a claude-code`. Or copy the skill folder (skills/clean-user-facing-text in guillaumemeyer/watermarks-remover) into .claude/skills/clean-user-facing-text in your project. Claude Code loads it when a task matches its description.
Run `npx skills add guillaumemeyer/watermarks-remover --skill clean-user-facing-text -a codex`. Or copy the skill folder (skills/clean-user-facing-text in guillaumemeyer/watermarks-remover) into .agents/skills/clean-user-facing-text in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add guillaumemeyer/watermarks-remover --skill clean-user-facing-text -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/clean-user-facing-text, .gemini/skills/clean-user-facing-text, .github/skills/clean-user-facing-text and .opencode/skills/clean-user-facing-text in your project.
Going by SKILL.md and its folder, User-Facing Text Cleanup needs Python for the scripts in its folder and the command-line tools its instructions call (python). Our summary lists: Python, to run the bundled inspection and cleaning scripts.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
User-Facing Text Cleanup is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with User-Facing Text Cleanup: Chinese Text Humanizer (op7418/Humanizer-zh, 19k stars), Natural Japanese Business Writing (coji/natural-japanese, 1.9k stars), Zero Slop Prose Editor (iflytek/skillhub, 5.2k stars) and Web Novel AI-Trace Remover (zenstory-ai/oh-story-claudecode, 7.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
guillaumemeyer (a GitHub user) maintains it in guillaumemeyer/watermarks-remover, which has 23,730 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 9, 2026.
Source: guillaumemeyer/watermarks-remover on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.