Skip to content

ssamba1/untell

untell — the open-source AI humanizer that closes the loop: rewrites AI text against live detector scores while keeping meaning, citations and facts intact

untell — the open-source AI humanizer that closes the loop

Iteratively rewrite AI-generated text against live AI-detector scores until it reads human — while keeping your meaning, citations, and facts intact.

A closed-loop, detector-feedback AI humanizer, shipped as a Claude Code skill and a Python CLI. Free. Open source. Honest about what it can and can't do.

CI License: MIT Python 3.9+ Claude Code skill Zero-dependency lite tier PRs welcome Live site good first issues

Optimize against real detectors — with the detector in the loop, not blind guessing. Out of the box it beats the free web checkers (ZeroGPT, live-proven 100%→0%). To actually beat GPTZero · Originality.ai · Turnitin-class · Copyleaks, you wire their API into the loop (key-gated, paid) — the bundled local proxies alone do not predict those, and we say so plainly rather than fake a "99% human." Why this is the most complete open humanizer →


TL;DR

Most "AI humanizers" do one blind paraphrase pass and plateau at 60–80% detector bypass. This one runs a loop: it scores your text against an ensemble of real AI detectors, rewrites using each detector's score as feedback (targeting the exact sentences that read as AI), and re-scores — repeating until the hardest detector stops flagging it and a semantic-similarity gate confirms the meaning is unchanged.

That iterative, detector-feedback approach is the strongest training-free technique in the published literature (arXiv 2506.07001: −88% TPR@1%FPR, transfers across detectors, preserves meaning) — and no shipping tool, open or commercial, actually does it. This repo does.

Measured live:  a formulaic AI paragraph went  100% → 0% AI on ZeroGPT  in one loop.
                a stickier one went             100% → 35% → 0%          once the loop
                used per-sentence feedback to target only the flagged spans.
# Zero dependencies. Works right now, in Claude Code:
/untell  <paste your AI-sounding text or a file path>

⚡ Quick start

Try it free, no install: paste text into the in-browser AI detector for an instant AI-tell score (runs locally, nothing uploaded).

Install the Claude Code skill — one line:

# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/ssamba1/untell/main/install.sh | sh
# Windows PowerShell
irm https://raw.githubusercontent.com/ssamba1/untell/main/install.ps1 | iex

Then in Claude Code: /untell <your text or a file path>. Claude is the rewriter; the bundled scripts score the text and lock your facts. Zero dependencies (lite tier).

Or install as a Claude Code plugin (marketplace):

/plugin marketplace add ssamba1/untell
/plugin install untell@untell

As a Python package (pip install untell lands with the first PyPI release — from source today):

git clone https://github.com/ssamba1/untell && cd untell
pip install -e ".[full]"                          # real detector ensemble on CPU
untell-loop "Your AI-sounding paragraph here."    # rewrite until it passes
untell-score "text" --tier full --threshold 0.3   # just score it
untell-verify --file draft.txt                    # honest pass/fail per detector
Manual / MCP install
# Manual skill copy:
git clone https://github.com/ssamba1/untell && cp -r untell/untell ~/.claude/skills/untell

# MCP server (Claude Desktop & any MCP client) — exposes score/sentences/untell/verify/scrub as tools:
pip install -e ".[mcp]" && untell-mcp     # (pip install "untell[mcp]" once on PyPI)

How it works

/untell <text|file>
  preserve-lock citations / numbers / quotes / URLs / entities   (scripts/preserve.py)
  scrub hidden watermark / zero-width / homoglyph characters from the input
  repeat up to N times:
    score = scripts/score.py <text>          # ensemble of detectors -> {detector: P(AI), max}
    sentences = scripts/sentences.py <text>  # which sentences read as AI (target only these)
    sim   = scripts/quality.py <orig> <text> # semantic similarity, must stay >= 0.76
    if max(score) < threshold and sim ok: stop
    Claude rewrites the flagged sentences using the per-detector scores as feedback
      (raise burstiness + perplexity, vary sentence architecture, kill clichés/formulaic
       transitions, diversify vocab — while keeping meaning + every locked span)
  restore locked spans -> humanized text + a before/after detector table

Three design choices make it work where blind paraphrasers fail:

  1. It drives the max across detectors, not the average — a rewrite only wins when the hardest detector is satisfied (genuine multi-detector evasion).
  2. Every rewrite is gated on a 0.76 semantic-similarity bar (the P-SP threshold from the watermark-removal literature) — it refuses the meaning-mangling that wrecks other tools' output.
  3. Citations, numbers, quotes, URLs and named entities are locked byte-for-byte via preserve-lock, so your APA/IEEE/MLA references and your facts survive the rewrite untouched.

🏆 Why this is the best open-source AI humanizer

We surveyed ~110 open-source humanizer repos (GitHub topics, papers-with-code, the research SOTA) as part of building this project. That deep-research survey (humanizer-research-report.md) concluded, verbatim:

"There is no open-source repo that combines (a) a real evasion approach validated against multiple live detectors, (b) a quality/meaning-preservation verifier, (c) an iterative detector-feedback loop at inference time, and (d) a user-installable package."

This is the repo that has all four. Here it is against the strongest open competitors:

Capability untell (this repo) lynote (1.4k★) patina (196★) StealthHumanizer (58★) harshaneel (51★) Aboudjem (97★) StealthRL (research)
Inference-time detector-feedback loop ◑ own score ◑ multi-pass ◑ manual ◑ train-time
Real detectors in the loop (not an internal score) ◑ Binoculars only ✅ ensemble
Commercial adapters (Originality/GPTZero/Turnitin-class) ✅ 6
Semantic meaning gate + citation lock claim ◑ rollback ◑ keyword heuristic ✅ BERTScore
Per-sentence targeting
Live bypass proof (real score shown) ✅ ZeroGPT 100→0 ◑ Binoculars GIF ✅ paper
Packaged install (pip and Claude skill) ✅ both web app ✅ skill ✅ skill ❌ research
CI on real models
Runs without a GPU
License MIT MIT MIT MIT MIT MIT MIT

Stars are not capability. lynote (1.4k★) is an unvalidated translation chain with no loop or verifier; the highest-starred repos win on SEO, not architecture. The full, evidenced breakdown — including the one place we're honestly not #1 (StealthRL's GPU-trained RL policy is a stronger raw attack model, though it's a training framework, not a usable tool) — is in docs/why-best-open-repo.md and the ~110-repo capability audit in docs/competitive-gap-plan.md.


Tiers

The scripts auto-detect what's installed and degrade gracefully — the score JSON reports which tier actually ran, so you always know how much to trust the number.

Tier Install Detectors Notes
lite (default — nothing to install) perplexity + burstiness heuristic; token-overlap quality Stdlib only, instant, weak — a demo signal, not an evasion claim.
full pip install -e ".[full]" + RoBERTa-OpenAI, HC3-RoBERTa, MAGE, Fast-DetectGPT, GPT-2 perplexity; MiniLM cosine quality Real proxy signal on CPU. Downloads models on first run.
+ RADAR UNTELL_ENABLE_RADAR=1 (opt-in) + RADAR — the paraphrase-robust detector, the hardest open one to fool ⚠️ TrustSafeAI/RADAR-Vicuna-7B is non-commercial licensed — research/eval only.
heavy pip install -e ".[heavy]" + Binoculars (2×Falcon-7B) Strongest proxy; GPU recommended. Eval only.
commercial pip install -e ".[commercial]" + your keys + Originality.ai, GPTZero, Winston, Sapling, ZeroGPT, Copyleaks The real checkers. Key-gated; nothing runs or bills unless you set a key.
untell-score "Your text here" --tier full --threshold 0.3
echo "piped text" | untell-score

Passing the real commercial detectors

Local detectors are proxies. To optimize for the checkers people actually care about — GPTZero, Originality.ai, Turnitin-class, Copyleaks, ZeroGPT, Winston, Sapling — wire the real APIs. Each is key-gated; nothing runs or bills unless you set its key.

pip install -e ".[commercial]"
export GPTZERO_API_KEY=...      ORIGINALITY_API_KEY=...   WINSTON_API_KEY=...
export SAPLING_API_KEY=...      ZEROGPT_API_KEY=...       COPYLEAKS_EMAIL=...  COPYLEAKS_API_KEY=...

untell-loop  "text" --tier commercial      # rewrite until EVERY configured checker passes
untell-verify "text" --threshold 0.30      # pass/fail per checker + overall verdict (exit 0 = all pass)
untell-prove "Your AI text" --margin 0.10  # verify → loop → re-verify: one before/after table

untell-verify exits 0 only when every configured checker scores under the threshold. untell-prove runs the whole thing end-to-end so you get an honest before/after AI% per checker. (Each --tier commercial iteration calls every checker, so it costs API credits — cap with --max-iters.)

Free ways to test without paying

pip install -e ".[browser]" && playwright install chromium
untell-verify --browser zerogpt "text"     # drives the free ZeroGPT web UI — no API key, $0
untell-loop   "text" --browser zerogpt      # iterate against the LIVE ZeroGPT detector until it clears

The --browser path drives a real headless browser through a free web checker and reads the % score. ZeroGPT ships built-in (confirmed working live). Most other free detectors are now bot-gated (reCAPTCHA / login-redirect / iframe widgets) — see docs/free-detector-probes.md. Add your own site with zero code — it's just CSS selectors in a JSON file (examples/browser_sites.example.json).

⚠️ Browser checking is slow, fragile, and ToS-caveated — for occasional checks on your own text, not the hot loop. The reliable multi-detector path is the key-gated commercial tier.


❓ FAQ

Is there a free AI humanizer that actually works?

Yes — the lite tier installs with zero dependencies and the --browser zerogpt path optimizes against a real detector for $0. "Actually works," honestly: the loop reliably clears the free web detectors (ZeroGPT live-measured 100%→0%), and the full/commercial tiers optimize against the harder ones. No tool — this one included — can promise it passes every commercial detector forever; the ones that claim "99% human" are lying. This repo tells you the real per-detector score instead.

Does it bypass GPTZero / ZeroGPT / Turnitin / Originality.ai?

It optimizes and verifies against them. ZeroGPT is built into the free browser path and live-proven. GPTZero, Originality.ai, Turnitin-class, Copyleaks, Winston and Sapling are wired as key-gated commercial adapters — the loop drives the max across every checker you configure below threshold. Originality.ai is genuinely the hardest (the research literature and public benchmarks consistently rank it the toughest to evade); we don't claim to beat it without your API key to prove it. Honesty is the point.

Will it ruin my meaning, citations, or numbers?

No — that's the core differentiator. A semantic-similarity gate rejects any rewrite that drifts too far from the original meaning, and preserve-lock freezes citations, numbers, quotes, URLs and named entities byte-for-byte. Other humanizers are known to inject grammar errors and even reverse facts when they paraphrase blindly; this one refuses meaning-breaking rewrites by design. Good for academic / legal / ESL writing.

How is this different from Undetectable.ai / QuillBot / WriteHuman?

Those are closed SaaS that do a single blind pass and report a fake binary "human/AI." This is open source, runs a closed detector-feedback loop, optimizes against multiple real detectors at once, gates on meaning preservation, and gives you an honest, reproducible per-detector score instead of a marketing claim. It's a research/defensive tool you can read, audit, and run yourself.

Is this against the rules / ethical?

AI detectors are noisy proxies — they falsely flag non-native English writers at high rates (~61% in some Stanford-cited studies). This exists as a research harness and a defense against false positives, not an academic-dishonesty aid. Don't use it to misrepresent authorship where that's prohibited. See the caveats below — we mean them.


Eval harness (research)

Validates the thesis — closed loop beats single-pass — without a human in the seat (a scripted rewriter stands in for Claude so it's measurable):

pip install -e ".[full,eval]"
python -m eval.benchmark --dataset builtin --n 5                      # zero-download smoke run
python -m eval.benchmark --dataset raid --n 200 --tier full --enable-radar   # adversarial: hardest detector + RAID

The report shows per-detector beat-rates and names the hardest detector to beat (the honest headline). --enable-radar adds the paraphrase-robust RADAR detector (non-commercial — research/eval only). For broader cross-detector benchmarking, IMGTB + the RAID leaderboard are the standard references.


Repo layout

untell/            # THE SKILL (this dir is what you install)
  SKILL.md           # trigger + loop procedure + rewrite rubric
  scripts/           # score · preserve · quality · sentences · run · verify
  detectors/         # base protocol + tiered adapters (7 local + 6 commercial)
  attacks/           # surgical substitution · homoglyph · scrub · back-translation
  references/         # thresholds.md · prompt-rubric.md
eval/                # benchmark harness (research only)
training/            # GPU moat scaffold (RL-against-ensemble / distillation)
tests/               # unit tests (lite runs with zero ML)
docs/                # why-we're-best · competitive audit · detector probes

Development

pip install -e ".[dev]"
ruff check .
pytest -q

CI runs a lite matrix (ruff + pytest, no downloads) across Python 3.9/3.11/3.12 and a full-tier job (Ubuntu, CPU torch + .[full,eval]) that loads the real RoBERTa / Fast-DetectGPT / GPT-2 detectors and runs the torch-gated tests. See CONTRIBUTING.md to get involved and ROADMAP.md for what's next (the GPU RL-against-ensemble moat).


Troubleshooting

Full-tier detectors come back as null, you see failed_detectors, or a "NumPy 2.x" warning. The supervised detectors load torch/transformers; older builds of those were compiled against NumPy 1.x and crash on import when NumPy 2.x is present. untell excludes any detector that fails to load — it never fakes a neutral 0.5 that would silently pin your score — lists it under failed_detectors, and honestly downgrades the reported tier (so a broken full-tier run reports lite, not a fake full). To get the full ensemble back, align the versions, ideally in a fresh venv:

python -m venv .venv && . .venv/Scripts/activate     # (. .venv/bin/activate on macOS/Linux)
pip install -e ".[full]"            # pulls torch/transformers matched to your NumPy
# …or pin NumPy down in an existing env:
pip install "numpy<2"

mage is always null. yaful/MAGE ships a config current huggingface_hub rejects (id2label validation). It's auto-excluded and the rest of the ensemble runs normally — nothing you need to fix.

Full tier feels slow. Each untell-score call loads the models fresh, and the first run downloads ~0.5 GB of weights (cached after that). For a multi-iteration run prefer the single-process headless loop — untell-loop loads the models once — over many one-off score calls. The lite tier and the in-browser demo need no downloads at all.

Honest caveats

  • Proxy ≠ commercial. The local detectors approximate; they aren't Originality.ai / Turnitin. The ensemble is a signal, not a verdict. "Passes all checkers" is unprovable against detectors you don't run.
  • Local proxies do NOT predict GPTZero / Originality. Measured: a rewrite the bundled local ensemble rates low can still score 100% AI on GPTZero, which runs dedicated anti-humanizer ("AI Paraphrasing") detection. A low local max means "passed the weak local proxies," not "undetectable." The only way to optimize for a specific commercial detector is to put it in the loop (--tier commercial + its API key) — and even then GPTZero/Originality are the hardest and nobody beats them reliably.
  • lite is a demo. The zero-install heuristic shows the loop; it's not an evasion claim. The full tier is the honest baseline; Binoculars (GPU) is the strongest proxy.
  • Claude is the rewriter. Output quality and evasion depend on the running model.
  • Ethics. Detector false-positives disproportionately harm non-native writers. This is a research/eval harness and a defense against that — not a plagiarism or academic-dishonesty aid.

Contributing

PRs, detector adapters, and new free-checker selectors are welcome — see CONTRIBUTING.md, the good first issues, and our Code of Conduct. Found a security issue? See SECURITY.md.

If this saved you from a false AI flag — or you just think it's the most honest humanizer on GitHub — a ⭐ helps others find it.

License

MIT. Free to use, modify, and distribute.

About

untell — free, open-source AI humanizer that closes the loop: iteratively rewrites AI text against live detector scores (GPTZero, ZeroGPT, Originality.ai, Turnitin) while preserving meaning, citations & facts. Claude Code skill + CLI. Live-proven 100%→0% on ZeroGPT. MIT.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages