{"id":50503220,"url":"https://github.com/puneethkotha/humanizer-workbench","last_synced_at":"2026-06-19T07:00:40.222Z","repository":{"id":345464294,"uuid":"1185972173","full_name":"puneethkotha/humanizer-workbench","owner":"puneethkotha","description":"AI humanizer: CLI tool and Claude Code skill for rewriting AI-generated text into natural human writing.","archived":false,"fork":false,"pushed_at":"2026-03-19T07:31:07.000Z","size":68,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-19T23:20:35.232Z","etag":null,"topics":["ai","ai-humanizer","ai-writing","anthropic","claude-code","cli-tool","humanizer","llm","nlp","python","rewrite-ai-text","text-humanizer","text-rewriting","writing-assistant","writing-tools"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/puneethkotha.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-19T06:03:21.000Z","updated_at":"2026-03-19T07:31:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/puneethkotha/humanizer-workbench","commit_stats":null,"previous_names":["puneethkotha/humanizer-workbench"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/puneethkotha/humanizer-workbench","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puneethkotha%2Fhumanizer-workbench","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puneethkotha%2Fhumanizer-workbench/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puneethkotha%2Fhumanizer-workbench/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puneethkotha%2Fhumanizer-workbench/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/puneethkotha","download_url":"https://codeload.github.com/puneethkotha/humanizer-workbench/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puneethkotha%2Fhumanizer-workbench/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34520432,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ai-humanizer","ai-writing","anthropic","claude-code","cli-tool","humanizer","llm","nlp","python","rewrite-ai-text","text-humanizer","text-rewriting","writing-assistant","writing-tools"],"created_at":"2026-06-02T13:30:32.505Z","updated_at":"2026-06-19T07:00:40.216Z","avatar_url":"https://github.com/puneethkotha.png","language":"Python","funding_links":[],"categories":["Apps, CLIs \u0026 Workbenches"],"sub_categories":["Taste Skill install example"],"readme":"# humanizer-workbench\n\nA CLI tool and Claude Code skill for rewriting AI-generated text into natural, human-quality writing.\n\nEvery LLM reaches for the same words. This removes them.\n\n---\n\nAI-generated text has a recognizable fingerprint. Not because it's wrong (often it isn't), but because every language model reaches for the same vocabulary at rates no human writer reproduces: leverage, tapestry, seamless, nuanced, comprehensive. The same sentence rhythm. Paragraph lengths that never vary. Filler openers like \"it is worth noting that.\"\n\nhumanizer-workbench detects those patterns and rewrites through a staged pipeline: identify what's AI-like, rewrite for style, refine for rhythm, audit the result. The stages are separate because each requires a different prompt to do its job well.\n\nUse it as a CLI tool for batch processing and scripts, or as a Claude Code skill for interactive rewriting inside Claude Code sessions.\n\n---\n\n## Quick example\n\n**Input:**\n\n```\nIt is worth noting that this comprehensive approach leverages robust documentation\nstrategies to facilitate seamless onboarding for engineering teams. Furthermore,\nproactive knowledge transfer empowers developers to optimize their workflows and\nachieve unprecedented productivity outcomes.\n```\n\n**Output** (`--style professional --intensity medium`):\n\n```\nGood documentation cuts onboarding time. Engineers who can find answers without\ninterrupting teammates get productive faster, and the teams they join stay focused\nlonger. Most documentation failures are about findability, not volume.\n```\n\n**AI-likeness score:** 72/100 → 8/100\n\n---\n\n## CLI tool and Claude Code skill\n\n| Interface | Use case |\n|-----------|----------|\n| CLI | Batch processing, pipelines, file-to-file transforms |\n| Claude Code skill | Interactive sessions in Claude Code, editing inline |\n\nBoth use the same detection logic and scoring system.\n\n---\n\n## Installation\n\n### CLI\n\nRequires Python 3.11+ and an Anthropic API key.\n\n```bash\npip install humanizer-workbench\nexport ANTHROPIC_API_KEY=sk-ant-...\n```\n\nFrom source:\n\n```bash\ngit clone https://github.com/puneethkotha/humanizer-workbench\ncd humanizer-workbench\npip install -e \".[dev]\"\n```\n\n### Claude Code skill usage\n\n```bash\nmkdir -p ~/.claude/skills\ngit clone https://github.com/puneethkotha/humanizer-workbench ~/.claude/skills/humanizer-workbench\n```\n\nIn a Claude Code session:\n\n```\n/humanizer-workbench\n```\n\nOr naturally:\n\n```\nUse humanizer-workbench to rewrite this in a founder voice.\n```\n\n---\n\n## Using the CLI\n\n```bash\n# Default: professional style, medium intensity\nhumanizer input.txt\n\n# Change style and intensity\nhumanizer input.txt --style founder --intensity aggressive\n\n# See exactly what changed and how scores moved\nhumanizer input.txt --diff --score\n\n# Write to a file\nhumanizer input.txt --style technical --output result.txt\n\n# Analyze without rewriting\nhumanizer-detect input.txt\n```\n\n**Python API:**\n\n```python\nfrom humanizer import HumanizerEngine, Intensity, StyleName\n\nengine = HumanizerEngine()\n\nresult = engine.humanize(\n    text=\"It is worth noting that this comprehensive approach...\",\n    style=StyleName.PROFESSIONAL,\n    intensity=Intensity.MEDIUM,\n)\n\nprint(result.output)\nprint(f\"{result.before_score:.0f} → {result.after_score:.0f}\")\n```\n\n---\n\n## CLI reference\n\n```\nhumanizer [OPTIONS] INPUT_FILE\n\n  INPUT_FILE    Plain text file. Use '-' to read from stdin.\n\nOptions:\n  -s, --style      [casual|professional|technical|founder|academic|storytelling]\n                   Default: professional\n  -i, --intensity  [light|medium|aggressive]\n                   Default: medium\n  --diff           Show a before/after diff\n  --score          Show AI-likeness scores before and after\n  --explain        Summarize the key changes made\n  -o, --output     Write output to a file instead of stdout\n  --api-key        Anthropic API key (or set ANTHROPIC_API_KEY)\n```\n\n```\nhumanizer-detect INPUT_FILE\n\n  Scans for AI patterns and scores the text without rewriting it.\n  Shows component scores, detected vocabulary, filler phrases, and structural flags.\n```\n\n---\n\n## Style presets\n\nThe styles produce meaningfully different output: different structure, vocabulary, and voice, not just different prompt framing.\n\n| Style | Voice | What changes |\n|-------|-------|--------------|\n| `casual` | Conversational, first-person | Contractions, shorter sentences, no corporate language |\n| `professional` | Peer-to-peer, direct | Conclusions before explanations, active voice, specific over vague |\n| `technical` | Dense, expert-to-expert | No hand-holding, quantified claims, tradeoffs named |\n| `founder` | Personal, opinionated | First-person, stories before abstractions, specific dates and failures |\n| `academic` | Analytical, measured | Evidence-backed claims, hedges only where the evidence warrants |\n| `storytelling` | Scene-first, varied pace | Shows over tells, deliberate sentence length variation |\n\n---\n\n## Intensity levels\n\n| Level | Stages | What it does |\n|-------|--------|--------------|\n| `light` | REWRITE | Removes AI vocabulary and filler phrases. Structure mostly preserved. |\n| `medium` | REWRITE → REFINE | Rewrites for style, then improves rhythm. Default. |\n| `aggressive` | REWRITE → REFINE → AUDIT | Full transformation. AUDIT reads output fresh and catches what's still wrong. |\n\n---\n\n## AI-likeness score\n\nThe score (0–100) combines five signals. Higher means more AI-like.\n\n| Signal | Max | Measures |\n|--------|-----|----------|\n| AI vocabulary density | 30 | Ratio of flagged words to total words |\n| Filler phrase density | 25 | Distinct filler phrases found |\n| Sentence length uniformity | 20 | Inverted std dev of sentence lengths |\n| Structural patterns | 15 | Em dash count, list density, opener patterns |\n| AI sentence openers | 10 | Formulaic starters in the first five sentences |\n\nGrade labels: **Very AI-like** (≥75) · **Moderately AI-like** (≥50) · **Slightly AI-like** (≥25) · **Mostly human** (\u003c25)\n\nThe score is a diagnostic tool. The tool does not refuse to output text because the score is too high. That call belongs to the user.\n\n---\n\n## How it works\n\nTwo detectors scan the input before any transformation. The lexical detector checks against ~50 AI-characteristic vocabulary words and ~30 filler phrases. The structural detector checks sentence length variance, paragraph uniformity, em dash frequency, and opener patterns. Detection results are injected into the rewrite prompt so the model knows exactly what to fix.\n\nThe transformer calls the Anthropic API with a distinct prompt per stage. The REWRITE prompt carries the style voice, vocabulary guidance, intensity instructions, and the specific patterns found. REFINE targets rhythm only. AUDIT is a short, fresh read. It doesn't carry the full style context forward, just enough to catch what's still wrong.\n\nStage temperatures are tuned separately: 0.7 for REWRITE, 0.45 for REFINE, 0.3 for AUDIT. Lower temperature on the later stages preserves what the earlier passes got right.\n\n---\n\n## Architecture\n\n```\nsrc/humanizer/\n    core/\n        models.py       # All data types\n        engine.py       # Orchestrator\n        pipeline.py     # Stage sequences per intensity level\n    detectors/\n        lexical.py      # Vocabulary and filler phrase detection\n        structural.py   # Rhythm, formatting, and opener detection\n    styles/\n        presets.py      # The six built-in styles\n    transformers/\n        llm.py          # Anthropic API transformer with stage-specific prompts\n    scoring/\n        scorer.py       # Five-component heuristic scorer\n    cli/\n        main.py         # Click CLI\n```\n\nThe engine depends on `BaseDetector`, `BaseTransformer`, and `AIScorer`, not their implementations. Adding a new detector or transformer backend requires no engine changes.\n\nFull architecture notes: [docs/architecture.md](docs/architecture.md)\n\n---\n\n## Design notes\n\n**Separate stages for separate goals.** One prompt doing detection, rewriting, and rhythm editing produces mediocre results at all three. Keeping them separate lets each prompt be precise about what it's trying to do.\n\n**Styles are behavioral.** The `founder` style writes in first person and leads with what went wrong. The `professional` style leads with conclusions. The `academic` style hedges only where the evidence is genuinely ambiguous. These differences live in structured `StylePreset` dataclasses with explicit voice, vocabulary, and structural guidance, not in prompt strings.\n\n**No unnecessary dependencies.** Sentence splitting uses regex. Three runtime dependencies: `anthropic`, `click`, `rich`.\n\n**The scorer guides, it doesn't gate.** The score is shown as a before/after delta. The tool does not refuse to output text because the score is too high. That call belongs to the user.\n\n---\n\n## Limitations\n\n**The heuristics are not domain-universal.** The vocabulary list was calibrated against general AI output. Technical or academic writing may score higher than warranted because those domains legitimately use some flagged terms. Run `humanizer-detect` first to see which signals are firing.\n\n**Quality degrades above ~1500 words.** The transformer processes the full text in one call. Above that threshold, you'll get a warning and less consistent output. Chunking is on the roadmap.\n\n**Detection is statistical, not semantic.** \"Leverage\" flagged in a piece about physical mechanics is a false positive. The detector doesn't understand context.\n\n**No cross-section consistency.** Rewriting a long document in sections may produce stylistic drift between them.\n\n**Improvement is not guaranteed on clean text.** Run `humanizer-detect` first if you're not sure whether a piece needs work.\n\n---\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for setup and guidelines.\n\n```bash\npip install -e \".[dev]\"\n\n# Unit tests — no API key required\npytest tests/ -m \"not integration\"\n\n# Integration tests — requires ANTHROPIC_API_KEY\npytest tests/ -m integration\n\nruff check src/ tests/\n```\n\nThe most useful contributions right now: expanding the detection vocabulary list, improving scoring calibration against labeled examples, and adding chunking support for long documents.\n\n---\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpuneethkotha%2Fhumanizer-workbench","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpuneethkotha%2Fhumanizer-workbench","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpuneethkotha%2Fhumanizer-workbench/lists"}