Rewrite AI-sounding text into natural, human writing by removing common LLM patterns while preserving meaning and tone.
npx skills add https://github.com/besoeasy/open-skills --skill humanizer
Edit text so it sounds like a real person wrote it: clearer rhythm, stronger specificity, less filler, and no chatbot artifacts. Keep the original meaning, facts, and intent.
name matches folder name exactly (humanizer)rg (ripgrep) for pattern detectionnode (v18+) for scripted rewrite pipelinesInstall options:
# Ubuntu/Debian
sudo apt-get install -y ripgrep nodejs npm
# macOS
brew install ripgrep node
Use this flow for single passages:
Bash (pattern scan):
cat input.txt \
| rg -n -i "\b(additionally|crucial|pivotal|underscores|highlighting|fostering|landscape|testament|vibrant)\b|\b(i hope this helps|let me know if|great question)\b|—|[“”]"
Node.js (simple rule-based humanizer):
function humanizeText(text) {
const replacements = [
[/\bIn order to\b/g, "To"],
[/\bDue to the fact that\b/g, "Because"],
[/\bAt this point in time\b/g, "Now"],
[/\bIt is important to note that\b/g, ""],
[/\bI hope this helps!?\b/gi, ""],
[/\bLet me know if you'd like.*$/gim, ""],
[/\bserves as\b/g, "is"],
[/\bstands as\b/g, "is"],
[/\bboasts\b/g, "has"],
[/—/g, ","],
[/[“”]/g, '"']
];
let output = text;
for (const [pattern, to] of replacements) {
output = output.replace(pattern, to);
}
return output
.replace(/\s{2,}/g, " ")
.replace(/\n{3,}/g, "\n\n")
.trim();
}
// Usage:
// const fs = require('node:fs');
// const input = fs.readFileSync('input.txt', 'utf8');
// console.log(humanizeText(input));
Use this for long drafts and production outputs:
is/are/has) over inflated alternativesBash (batch rewrite starter):
#!/usr/bin/env bash
set -euo pipefail
in_file="${1:-input.txt}"
out_file="${2:-output.txt}"
sed -E \
-e 's/\bIn order to\b/To/g' \
-e 's/\bDue to the fact that\b/Because/g' \
-e 's/\bAt this point in time\b/Now/g' \
-e 's/\bserves as\b/is/g' \
-e 's/\bstands as\b/is/g' \
-e 's/\bboasts\b/has/g' \
-e 's/[“”]/"/g' \
-e 's/—/,/g' \
"$in_file" > "$out_file"
echo "Rewritten text saved to: $out_file"
Node.js (pipeline with validation):
import fs from "node:fs/promises";
const bannedPatterns = [
/\bI hope this helps\b/i,
/\bLet me know if you'd like\b/i,
/\bGreat question\b/i,
/\bAdditionally\b/g,
/\bcrucial|pivotal|vibrant|testament\b/g
];
function rewrite(text) {
return text
.replace(/\bIn order to\b/g, "To")
.replace(/\bDue to the fact that\b/g, "Because")
.replace(/\bAt this point in time\b/g, "Now")
.replace(/\bserves as\b/g, "is")
.replace(/\bstands as\b/g, "is")
.replace(/\bboasts\b/g, "has")
.replace(/—/g, ",")
.replace(/[“”]/g, '"')
.replace(/\s{2,}/g, " ")
.trim();
}
function validate(text) {
const hits = bannedPatterns.flatMap((pattern) => {
const m = text.match(pattern);
return m ? [pattern.toString()] : [];
});
return { ok: hits.length === 0, hits };
}
async function main() {
const inputPath = process.argv[2] || "input.txt";
const outputPath = process.argv[3] || "output.txt";
const input = await fs.readFile(inputPath, "utf8");
const output = rewrite(input);
const report = validate(output);
await fs.writeFile(outputPath, output, "utf8");
if (!report.ok) {
console.error("Warning: possible AI patterns remain:", report.hits);
process.exitCode = 2;
}
console.log(`Saved: ${outputPath}`);
}
main().catch((err) => {
console.error(err.message);
process.exit(1);
});
Scan and remove these classes when they appear:
-ing chainsserves as, stands as instead of is)not just X, but Y)10. Rule-of-three overuse
11. Excessive synonym cycling
12. False ranges (from X to Y without meaningful scale)
13. Em-dash overuse
14. Mechanical boldface emphasis
15. Inline-header bullet artifacts
16. Title Case heading overuse where sentence case fits
17. Emoji decoration in formal content
18. Curly quotes when straight quotes are expected
19. Chatbot collaboration artifacts
20. Knowledge-cutoff disclaimers left in final copy
21. Sycophantic/servile tone
22. Filler phrase bloat
23. Excessive hedging
24. Generic upbeat conclusions with no substance
Return:
rewritten_text (string, required): final humanized draftchanges (array of strings, optional): 3-8 concise bullets on major editswarnings (array of strings, optional): unresolved vagueness or missing source detailsExample:
{
"rewritten_text": "The policy may affect outcomes, especially in smaller teams.",
"changes": [
"Removed filler phrase: 'It is important to note that'",
"Replaced vague hedge 'could potentially possibly' with 'may'"
],
"warnings": [
"Claim about impact scale remains unsourced in original text"
]
}
Error shape:
{
"error": "input_too_short",
"message": "Need at least one full sentence to humanize reliably.",
"fix": "Provide a longer passage or combine short fragments into a paragraph."
}
You have the humanizer skill. When the user asks to make text sound natural:
1) Read the full draft and detect AI writing patterns.
2) Rewrite to preserve meaning, facts, and intended tone.
3) Prefer specific, concrete language over vague significance claims.
4) Remove chatbot artifacts, filler, and over-hedging.
5) Use simple constructions (is/are/has) where they read better.
6) Vary sentence rhythm so the text sounds spoken by a real person.
7) Return the rewritten text. Optionally add a brief bullet summary of key changes.
Never invent facts. If a claim is vague and no source is provided, keep it conservative.
Rewrite feels too flat
Meaning drifted from original
Output still sounds AI-generated
Use this quick gate before returning output:
I hope this helps, Let me know if)warnings for unresolved ambiguitiesGuide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementing any feature or bugfix, before writing implementation code
Use when you have a spec or requirements for a multi-step task, before touching code
Use when creating new skills, editing existing skills, or verifying skills work before deployment
Use when writing or improving README files. Not all READMEs are the same — provides templates and guidance matched to your audience and project type.
| Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, negative parallelisms, and excessive conjunctive phrases.
Official Opentrons Protocol API for OT-2 and Flex robots. Use when writing protocols specifically for Opentrons hardware with full access to Protocol API v2 features. Best for production Opentrons protocols, official API compatibility. For multi-vendor automation or broader equipment control use pylabrobot.
Take besoeasy/humanizer from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference brew, apt.
Without those the skill loads but fails at the first command.