Detect and remove signs of AI-generated writing. Makes text sound natural and human.
$ npx -y skills add brandonwise/humanizer --agent claude-code
Detect and remove signs of AI-generated writing. Makes text sound natural and human.
An OpenClaw skill and standalone CLI tool that scans text for 30 AI writing patterns using 500+ vocabulary terms and statistical text analysis (burstiness, type-token ratio, readability metrics) — then provides actionable suggestions to fix them.
Based on Wikipedia:Signs of AI writing, Copyleaks stylistic fingerprint research, and blader/humanizer.
git clone https://github.com/brandonwise/humanizer.git
cp humanizer/SKILL.md ~/.config/openclaw/skills/humanizer.md
git clone https://github.com/brandonwise/humanizer.git
cd humanizer
npm install
# Score some text
echo "This serves as a testament to innovation." | node src/cli.js score
# Full analysis
node src/cli.js analyze -f your-draft.md
# Humanize with auto-fixes
node src/cli.js humanize --autofix -f article.txt
npm install -g .
humanizer score < draft.txt
humanizer analyze -f essay.md
humanizer humanize --autofix < article.txt
The scoring engine combines three signal types:
┌─────────────────────────────────────────────────┐
│ Composite Score (0-100) │
├────────────────────┬────────────────────────────┤
│ Pattern Score │ Uniformity Score │
│ (70% weight) │ (30% weight) │
├────────────────────┼────────────────────────────┤
│ • 30 pattern │ • Burstiness (sentence │
│ detectors │ length variation) │
│ • 500+ vocabulary │ • Type-token ratio │
│ terms (3 tiers) │ • Trigram repetition │
│ • Density scoring │ • Sentence length CoV │
│ • Category breadth │ • Paragraph uniformity │
└────────────────────┴────────────────────────────┘
Pattern score uses density-based detection: weighted hits per 100 words on a logarithmic curve, plus bonuses for breadth (unique patterns) and category diversity.
Uniformity score uses statistical analysis: human text has high burstiness (varied sentence lengths), diverse vocabulary, and low n-gram repetition. AI text is mechanically uniform.
The stats engine computes metrics that differentiate AI from human writing:
| Metric | Human Writing | AI Writing | Why It Matters |
|---|---|---|---|
| Burstiness | 0.5–1.0 | 0.1–0.3 | Humans write in bursts — short sentences, then long ones. AI is metronomic. |
| Type-token ratio | 0.5–0.7 | 0.3–0.5 | Humans use more varied vocabulary. AI cycles through the same words. |
| Sentence CoV | 0.4–0.8 | 0.15–0.35 | Coefficient of variation in sentence length. Low = robotic uniformity. |
| Trigram repetition | < 0.05 | > 0.10 | AI reuses the same 3-word phrases more often. |
| Readability (FK) | Varies | 8–12 | AI tends to write at a consistent grade level. Humans vary. |
# Quick score (0-100, higher = more AI-like)
echo "text" | humanizer score
# Full analysis with pattern matches
humanizer analyze essay.txt
# Full markdown report (pipe to file)
humanizer report article.txt > report.md
# Suggestions grouped by priority
humanizer suggest draft.md
# Statistical analysis only
humanizer stats essay.txt
# Humanization suggestions with guidance
humanizer humanize -f article.txt
# Apply safe auto-fixes
humanizer humanize --autofix -f article.txt
# Scan an entire docs folder, rank risk, and show recurring pattern hotspots
humanizer scan docs --ext md,txt --fail-above 45
# Scan a large repo with reusable defaults + custom ignores
humanizer scan . --config .humanizer.json --ignore-dirs vendor,generated
# Baseline-aware scan: fail only on regressions vs a saved baseline
humanizer scan docs --json > .humanizer-baseline.json
humanizer scan docs --baseline .humanizer-baseline.json --fail-on-regression
# Compare draft revisions and see score delta
humanizer compare --before draft-v1.md --after draft-v2.md
scan) — analyze a whole folder, rank files by risk, surface cross-file pattern hotspots, and optionally fail CI with --fail-above.--baseline) and fail only when files regress.--config) and layer one-off overrides from CLI.--ignore-dirs or disable built-in excludes with --no-default-ignore.--ignore-code) — ignore fenced code blocks and inline code snippets so technical docs do not get false positives from sample code.--ignore-quotes) — ignore markdown/email quote blocks so pasted AI examples, support replies, and forum excerpts do not dominate scores.compare) — compare two versions of text and show exactly which patterns improved or regressed.drive engagement and unlock value when they lack a user, metric, or concrete behavior.-f, --file <path> Read text from file
--json Output as JSON
--verbose, -v Show all matches
--autofix Apply safe fixes (humanize only)
--patterns <ids> Check specific pattern IDs (comma-separated)
--threshold <n> Only show patterns with weight above n
--before <path> Before file for compare command
--after <path> After file for compare command
--ext <list> Extensions for scan (e.g. md,txt,rst)
--min-words <n> Skip files shorter than n words (scan)
--fail-above <n> Exit non-zero if any scanned file score >= n
--baseline <file> Compare scan against prior scan JSON output
--regression-threshold <n> Minimum score delta to flag regression (default: 1)
--fail-on-regression Exit non-zero if baseline regressions are found
--ignore-dirs <list> Extra dirs to ignore when scanning (comma-separated)
--no-default-ignore Disable built-in ignores (.git,node_modules,dist,...)
--ignore-code Ignore fenced/inline code snippets during analysis
--ignore-quotes Ignore markdown/email quote blocks during analysis
--config <file> Load scan defaults from JSON (scan section)
--help, -h Show help
--config)--config reads scan defaults from a JSON file under a top-level scan object.
CLI flags still win when both are provided.
{
"scan": {
"extensions": ["md", "txt"],
"minWords": 30,
"failAbove": 45,
"baseline": ".humanizer-baseline.json",
"regressionThreshold": 3,
"failOnRegression": true,
"ignoreDirs": ["generated", "vendor"],
"includeDefaultIgnore": true,
"ignoreCode": true,
"ignoreQuotes": true
}
}
Then run:
humanizer scan . --config .humanizer.json
# or one-off:
humanizer analyze docs/guide.md --ignore-code
# or ignore pasted quotes/examples too:
humanizer analyze docs/guide.md --ignore-code --ignore-quotes
# or regression-only gate:
humanizer scan docs --baseline .humanizer-baseline.json --fail-on-regression
🟢 0-25 Mostly human-sounding
🟡 26-50 Lightly AI-touched
🟠 51-75 Moderately AI-influenced
🔴 76-100 Heavily AI-generated
const { analyze, score } = require('humanizer');
// Quick score
const s = score('Your text here...');
console.log(s); // 0-100
// Full analysis
const result = analyze(text, {
verbose: true, // Show all matches
patternsToCheck: [7, 19, 22], // Only specific patterns
includeStats: true, // Include statistical analysis
});
console.log(result.score); // 0-100 composite
console.log(result.patternScore); // Pattern-only score
console.log(result.uniformityScore); // Stats-based uniformity score
console.log(result.stats); // { burstiness, typeTokenRatio, ... }
console.log(result.findings); // Detailed pattern matches
console.log(result.categories); // Per-category breakdown
// Humanize
const { humanize, autoFix } = require('humanizer/src/humanizer');
const suggestions = humanize(text, { autofix: true });
console.log(suggestions.critical); // Dead giveaway issues
console.log(suggestions.important); // Noticeable patterns
console.log(suggestions.guidance); // Writing tips
console.log(suggestions.styleTips); // Statistical style advice
console.log(suggestions.autofix.text); // Auto-fixed text
// Stats only
const { computeStats } = require('humanizer/src/stats');
const stats = computeStats(text);
console.log(stats.burstiness); // Sentence variation
console.log(stats.typeTokenRatio); // Vocabulary diversity
| # | Pattern | Category | Weight | Example |
|---|---|---|---|---|
| 1 | Significance inflation | Content | 4 | "marking a pivotal moment in the evolution of..." |
| 2 | Notability name-dropping | Content | 3 | "featured in NYT, BBC, CNN, and Forbes" |
| 3 | Superficial -ing analyses | Content | 4 | "...showcasing... reflecting... highlighting..." |
| 4 | Promotional language | Content | 3 | "nestled", "breathtaking", "stunning" |
| 5 | Vague attributions | Content | 4 | "Experts believe", "Studies show" |
| 6 | Formulaic challenges | Content | 3 | "Despite challenges... continues to thrive" |
| 7 | AI vocabulary | Language | 5 | "Additionally", "delve", "tapestry" (500+ words) |
| 8 | Copula avoidance | Language | 3 | "serves as" instead of "is" |
| 9 | Negative parallelisms | Language | 3 | "It's not just X, it's Y" |
| 10 | Rule of three | Language | 2 | "innovation, inspiration, and insights" |
| 11 | Synonym cycling | Language | 2 | "protagonist... main character... central figure" |
| 12 | False ranges | Language | 2 | "from the Big Bang to dark matter" |
| 13 | Em dash overuse | Style | 2 | Too many — em dashes — in one — piece |
| 14 | Boldface overuse | Style | 2 | Every other word bolded |
| 15 | Inline-header lists | Style | 3 | "- Topic: Topic is..." |
| 16 | Title Case headings | Style | 1 | "## Every Word Capitalized Here" |
| 17 | Emoji overuse | Style | 2 | 🚀💡✅ in professional text |
| 18 | Curly quotes | Style | 1 | \u201Csmart quotes\u201D instead of "straight" |
| 19 | Chatbot artifacts | Comms | 5 | "I hope this helps!", "Let me know if..." |
| 20 | Cutoff disclaimers | Comms | 4 | "As of my last training update..." |
| 21 | Sycophantic tone | Comms | 4 | "Great question!", "You're absolutely right!" |
| 22 | Filler phrases | Filler | 3 | "In order to", "Due to the fact that" |
| 23 | Excessive hedging | Filler | 3 | "could potentially possibly" |
| 24 | Generic conclusions | Filler | 3 | "The future looks bright" |
humanizer is a Claude Code plugin with 1 hand-picked skill, indexed on Flowy in the Writing category. Install it with the command on its page. It includes humanizer. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it