Humanizer
Azure-Samples/interview-coach-agent-framework
Remove signs of AI-generated writing from text. An agent skill from Azure-Samples/interview-coach-agent-framework.
Beta readers for any draft, run by simulating how a real reader experiences it, moment by moment.
$ npx skills add mizchi/explainer --skill first-reader -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mizchi/explainer first-reader --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/mizchi/explainer.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/first-reader .claude/skills/first-reader && 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 "first-reader" agent skill from https://github.com/mizchi/explainer/tree/main/skills/first-reader into .claude/skills/first-reader/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "first-reader", 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/mizchi/explainer/tree/main/skills/first-readerType 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 mizchi/explainer --skill first-reader -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mizchi/explainer first-reader --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mizchi/explainer.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/first-reader .agents/skills/first-reader && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "first-reader" agent skill from https://github.com/mizchi/explainer/tree/main/skills/first-reader into .agents/skills/first-reader/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "first-reader", 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 mizchi/explainer --skill first-reader -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mizchi/explainer first-reader --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mizchi/explainer.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/first-reader .cursor/skills/first-reader && 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 "first-reader" agent skill from https://github.com/mizchi/explainer/tree/main/skills/first-reader into .cursor/skills/first-reader/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "first-reader", 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/mizchi/explainer.git --path skills/first-reader--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 mizchi/explainer --skill first-reader -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mizchi/explainer first-reader --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mizchi/explainer.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/first-reader .gemini/skills/first-reader && 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 "first-reader" agent skill from https://github.com/mizchi/explainer/tree/main/skills/first-reader into .gemini/skills/first-reader/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "first-reader", 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 mizchi/explainer first-readerInstalls 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 mizchi/explainer --skill first-reader -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/mizchi/explainer.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/first-reader .github/skills/first-reader && 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 "first-reader" agent skill from https://github.com/mizchi/explainer/tree/main/skills/first-reader into .github/skills/first-reader/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "first-reader", 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 mizchi/explainer --skill first-reader -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install mizchi/explainer first-reader --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mizchi/explainer.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/first-reader .opencode/skills/first-reader && 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 "first-reader" agent skill from https://github.com/mizchi/explainer/tree/main/skills/first-reader into .opencode/skills/first-reader/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "first-reader", 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.
first-readerBeta readers for any draft, run by simulating how a real reader experiences it, moment by moment.
First Reader is an agent skill from mizchi/explainer. Beta readers for any draft, run by simulating how a real reader experiences it, moment by moment. A skim gate, a no-lookahead timed read producing an attention transcript with quit points, a recall test of what a reader remembers the next day, and a trust ledger of the implied author. Use when the user asks for a beta read, beta readers, test readers, human review, reader review, to read something like a human, to be a first reader, whether a piece holds attention or will actually get read, for a quick read of…
Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 16 other files, including scripts and reference files (for example `README.md`, `references/interview.md` and `references/personas.md`). Compatibility notes: Python 3 stdlib only, offline, no dependencies. feed.py runs a loopback http server on 127.0.0.1 during a read so reader subagents receive the draft one…
It sits in Writing & Content, covering Humanizing AI text. The licence is Apache-2.0.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 578defb. 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 7 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3From 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.
Python 3 stdlib only, offline, no dependencies. feed.py runs a loopback http server on 127.0.0.1 during a read so reader subagents receive the draft one passage at a time; nothing leaves the machine and there is no external network access.
From compatibility in the SKILL.md frontmatter.
First Reader loads about 4.3k tokens when it runs, and up to ~8.2k if it reads all its reference files. Until then it costs about 205 tokens; SKILL.md has 2,566 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 mizchi/explainer at commit 578defb, republished under its Apache-2.0 licence (© mizchi). 2,566 words, ~4,261 tokens.
.claude/skills/first-reader/SKILL.md (or your agent's skills folder). This skill also uses 14 other files; get the full folder from GitHub.Readers before you publish.
Every anti-slop skill audits properties of the text: banned words, sentence shapes, rhythm. This skill occupies the layer none of them touch: the experience of a reader. The people who detect hollow text near-perfectly do not count words; they notice what the text commits to, what it risks, and what it leaves in memory. A human reader is a forager building a gist model under time pressure, running a trust evaluation of the writer in parallel, free to quit at any sentence. This skill reproduces that reader and reports what happened to them.
It produces a reading, not an audit. Run it as the final gate before publishing.
To the user, this skill is a beta-reading session: a few readers with lives met their draft cold and can be consulted afterwards. Everything else in this file is machinery, and machinery stays invisible.
scripts/ask.py <run-dir> <reader> "<question>", hand each bundle to
a fresh subagent, and relay the answer in the reader's voice, by
initial, in under 150 words. Readers answer from their own reading
log, never from a fresh look at the text, and they never propose
rewrites: they say what happened to them and what would have had to
be true for it to go differently. If the log cannot support an
answer, the reader says so.references/interview.md). Never write their experience for them.You see whole documents at once, forget nothing, and never get bored. A human reader has none of those powers, and pretending to read while holding the full text is performance, not measurement. So:
Do not open the draft. From the moment this skill is invoked until the timed reads are complete, never read the draft file or let the user paste it. Only the scripts touch it. If the draft is already in your context (the user pasted it earlier), you are contaminated as a reader: run every reading step through fresh subagents and say so in the report. Your own full-text read happens once, at step 6, after all reader experiments are done.
All scripts are stdlib Python, offline, no dependencies:
python3 scripts/<name>.py. Keep every run's files in a .first-reader/
directory next to the draft, never in a session scratch directory:
scratch gets wiped between sessions, and "again" in a tomorrow session
needs the prior run to compare against. If the draft lives in a git
repo, mention once that .first-reader/ is worth gitignoring.
First decide whether a timed read even models this text's real encounter:
Work silently per the user contract: one line at the start, at most one mid-run message for a dramatic event, then the result. In anything the user does see, plain words only.
Read references/personas.md. If the audience or venue is unknown, ask
the user one question: who is this for and where will it be published?
Then cast two personas, sympathetic and skeptical, each with priors,
situation, patience budget from the table, and a one-sentence stake. If
you cannot write the stake sentence, report that first.
Also ask, if not obvious: what should the reader think, feel, or do after reading? That is the intended gist the recall test will be judged against.
Fold the audience into the one starting line only when it needs
confirming ("Reading it as engineers on HN would"); otherwise just
start. Before casting, look for .first-reader/audience.json beside the
draft (format in references/room.md): it holds the readers this
author already chose, with their initials and one-line lives, so the
same two people read every draft in the project and "S" means the same
person next month. Reuse it unless the user names a different audience;
write it after the first cast. Write manifest.json in the run
directory per references/room.md for your own use. On a repeat review, reuse the
prior manifest's casts and point previous_run at the old run so the
results can be compared honestly.
Have a fresh subagent playing the skeptical persona run
scripts/skim.py <draft> itself and answer from that view alone; if you
must run the script, redirect its output straight to a file you never
open, because the scanner view quotes fragments of the draft and reading
it contaminates you before the timed reads. It answers: what is this
piece, do you commit to a full read, and what single element decided it.
A scanner who cannot say what the piece is, or declines to commit, is the first finding. For most real readers this gate is the whole encounter.
No lookahead is enforced by mechanism, not by asking nicely. Start the feed in the background BEFORE dispatching any reader:
python3 scripts/feed.py serve <draft> --run <run-dir> --readers keen,skeptic \
--persona "keen=<one line>" --persona "skeptic=<one line>" \
--ready-file <run-dir>/feed.jsonThe text now lives only in that process's memory. feed.json holds
addresses, nothing else; read it and give each reader ONLY its own
line. A reader's dispatch prompt contains the persona, export READER_FEED=<reader-address>, and three commands; it never
contains the draft path, the run directory, or the other reader's
address. The reader runs feed.py start, then reads one passage at a
time, logging honestly at each step with
feed.py next --log "needle=<-2..+2> expected... got... <felt notes>".
The needle is the felt reaction: +2 leaning in, 0 neutral, -1 drifting
or doubting, -2 done. Log skimming the moment it starts. When the
persona's patience runs out, quit with
feed.py quit --log "needle=-2 <why the persona stopped>", because
quitting is the single most informative thing a reader does. A reader
who finishes still records one final line the same way; the transcript
labels it FINAL rather than QUIT.
The feed releases the next passage only after a real log lands, never
re-serves anything but the current passage, refuses to advance faster
than a person could read the passage, and writes nothing of the piece
to disk until every reader is finished (feed.py progress --admin <admin-address> shows where they are; feed.py close --admin ...
flushes early if a reader dies). The reader subagent returns nothing
of substance; the artifact is the session. Collect it with
feed.py transcript <run-dir>/<reader> after close.
If subagents are unavailable, use file mode (feed.py start <draft> --session <dir>) yourself under the same rules, before ever opening
the draft, and disclose that one mind played both reader and reviewer
(see Adapting to your environment).
Run scripts/recall.py <session-dir> for the sympathetic persona's
session (and the skeptic's if it finished). Hand the output to a fresh
subagent with no other context. It answers the quiz from the transcript
alone: sayback, pointing, peak, ending, center of gravity, one action.
Judge the answers against the intended gist from step 1. A piece whose one-sentence retelling does not match its thesis, or whose ending nobody remembers, has a finding no line edit can fix. "Nothing survived" is a finding about the piece, not about the reader.
Run scripts/signals.py <draft> --json, but only after the timed reads
are complete: its output quotes draft sentences, so reading it earlier
contaminates you. Read the numbers through the genre: costly signals (checkable numbers, named entities, quotes,
admissions against interest, first-person experience) buy trust; free
signals (hedges everywhere, certainty everywhere, portable sentences that
fit any document) buy nothing. Near-zero variance in epistemic commitment
reads as machine confidence. The counters are floors, not truth: the
admissions detector in particular under-counts (it pattern-matches stock
phrasings and misses lines like "our test data was a fantasy"), so
confirm costly signals in your own step 6 read rather than trusting a
zero.
Only now read the draft in full, once, for two judgments the scripts cannot make: the implied author (describe the person these sentences imply, and quote any seam where that person changes mid-document) and whether the transcripts' complaints are the piece's fault or the cast's.
Write the report exactly as references/report.md specifies: sayback and
meaning first, then the reading transcripts, what survived, the person
behind it, then neutral questions and opinions by permission. Testimony
register throughout, no scores, altitude rule enforced, and the report is
allowed to be happy.
Save the skim gate's answer as <run-dir>/skim.txt and put its verdict
in the annotations (skim). Build the page per references/room.md
(scripts/room.py): the draft with the readers' comments beside each
passage, the skimmer's verdict, the lenses, the strip; no fixes. Publish
it where you can, or write it beside the run and open it. Deliver per
the user contract: the friend's report, then the link. Keep the
Lerman-order report on disk beside the run for anyone who asks.
The readers persist in the run directory. Every later "ask" in the
session goes through scripts/ask.py and a fresh subagent per reader;
never answer for a reader yourself, and never let a reader see the
draft again: their memory is their log.
This skill runs in any SKILL.md-compatible coding agent, but three capabilities vary. Check what you have BEFORE the run starts, adapt silently, and tell the user only what changes for them, in one line.
Subagents. If you can spawn fresh agents (Claude Code's agent tool, or any delegation mechanism), each reader is one. If you cannot, you play the readers yourself, one persona at a time, and the order of operations becomes everything: do NOT read or open the draft file for any reason before the reads; start immediately with the feed script and meet the piece one passage at a time in persona (file mode; served mode is pointless when reader and reviewer share a mind); do the skeptic's read in a later, separate pass from the sympathetic one; run recall by answering the quiz from the transcript alone before ever seeing the full text. This is a weaker experiment than fresh minds, so say so once in the verdict ("I played both readers myself here, so treat the findings as slightly softer") and never pretend otherwise. If the draft is already in your context (you read it earlier in the session, it was pasted, or your harness auto-loaded it), solo mode cannot blind you; do the reads anyway as honest role-passes, and weight the mechanical signals (quit logic, recall-from-log, signals.py) more heavily than the needle.
A place for the page. With artifact publishing (Claude Code on claude.ai), the page is a private link. Without it, it is a local HTML file next to the run, opened for the user. The page is read, not clicked; questions to the readers come to you in chat.
Turn budget. In agents where every script call is a visible tool step, the full run is many steps. Say so up front in the starting line ("this takes a few minutes and a lot of small steps") and never ask permission step by step; batch where your harness allows.
The first time the skill runs in a session, the starting line also teaches the interface in passing, because nothing else will: "Reading it as your audience would, about 5 minutes. When I'm back: where each reader leaned in or left, what stuck with them, and a page with their comments beside your draft. You can ask them follow-ups, and 'again' re-reads after you revise."
© mizchi, Apache-2.0. 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 14 other files (scripts, references) in skills/first-reader of mizchi/explainer.
Open the folder on GitHubat commit 578defb
First Reader 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 |
|---|---|---|---|---|---|---|
| First Reader this skillmizchi/explainer | 421 | — | ~4.3k | Automated safety check: Pass | Apache-2.0 | |
| HumanizerAzure-Samples/interview-coach-agent-framework | 172 | 37 repos | ~5.8k | Automated safety check: Pass | MIT | |
| Avoid AI Writingconorbronsdon/avoid-ai-writing | 4.9k | 3 repos | ~8.1k | Automated safety check: Pass | MIT | |
| User-Facing Text Cleanupguillaumemeyer/watermarks-remover | 24k | — | ~3.5k | Automated safety check: Pass | MIT | |
| Install Anti Sloptrycompai/crm | 11k | 1 repos | ~881 | Automated safety check: Pass | MIT | |
| Stop SlopXe/site | 732 | 8 repos | ~423 | Automated safety check: Pass | MIT |
Azure-Samples/interview-coach-agent-framework
Remove signs of AI-generated writing from text. An agent skill from Azure-Samples/interview-coach-agent-framework.
conorbronsdon/avoid-ai-writing
Audit and rewrite content to remove AI writing patterns ("AI-isms").
guillaumemeyer/watermarks-remover
Audits prose for invisible Unicode characters and rewrites it while keeping facts, citations, code and required disclosures unchanged and the writer's voice intact.
trycompai/crm
Install and configure the anti-slop Oxlint plugin in a local TypeScript or JavaScript repository.
Xe/site
Remove AI writing patterns from prose. An agent skill from Xe/site.
epoko77-ai/im-not-ai
Diagnoses and rewrites Korean text that reads as AI-generated, fixing translationese and mechanical parallelism across 85 patterns in 10 categories, with light to heavy passes.
mizchi/explainer
特定の読み手に向けて、概念・PR・設計を「冗長にならない水準」の速習資料として説明し、図と主張を道具で検証する。読み手のペルソナ(既に知っていること・知らないこと・読み方)を質問と公開情報から作り、その差分だけを書く。図は Mermaid / D2 で描いて事実シートに照らし、本文に引用するコード・出力は再実行して照合し、HTML は vlmkit のゲートに通す。Use when the…
mizchi/explainer
1 本の速習資料では収まらない、章立ての学習資料(<topic-book/01-quickstart.md, 02-….md …)を、読み手のペルソナに合わせて設計・執筆・検証する。章ごとの学習目標と理解度チェックの対応、概念を導入より前に使わない順序、章の読了時間の予算、「未完成なら落ち、答えなら通る」演習、book.json から生成する章の依存図を、verify-book.mjs…
mizchi/explainer
Build a slide deck whose source is text and whose figures are laid out by TALA — one Markdown file with a d2 fence per figure, compiled to a self-contained HTML deck (keyboard nav, overview grid…
Categories
Beta readers for any draft, run by simulating how a real reader experiences it, moment by moment. First Reader is an agent skill from mizchi/explainer. Beta readers for any draft, run by simulating how a real reader experiences it, moment by moment.
First Reader fits situations like: the user asks for a beta read; read something like a human; be a first reader; whether a piece holds attention.
Run `npx skills add mizchi/explainer --skill first-reader -a claude-code`. Or copy the skill folder (skills/first-reader in mizchi/explainer) into .claude/skills/first-reader in your project. Claude Code loads it when a task matches its description.
Run `npx skills add mizchi/explainer --skill first-reader -a codex`. Or copy the skill folder (skills/first-reader in mizchi/explainer) into .agents/skills/first-reader 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 mizchi/explainer --skill first-reader -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/first-reader, .gemini/skills/first-reader, .github/skills/first-reader and .opencode/skills/first-reader in your project.
Going by SKILL.md and its folder, First Reader needs Python for the scripts in its folder and the command-line tools its instructions call (python3). Our summary lists: Python 3. Compatibility (from SKILL.md): Python 3 stdlib only, offline, no dependencies. feed.py runs a loopback http server on 127.0.0.1 during a read so reader subagents receive the draft one passage at a time; nothing leaves the machine and there is no external network access..
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.
First Reader is published under the Apache-2.0 licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k 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 4k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with First Reader: Humanizer (Azure-Samples/interview-coach-agent-framework, 172 stars), Avoid AI Writing (conorbronsdon/avoid-ai-writing, 4.9k stars), User-Facing Text Cleanup (guillaumemeyer/watermarks-remover, 24k stars) and Install Anti Slop (trycompai/crm, 11k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
mizchi (a GitHub user) maintains it in mizchi/explainer, which has 421 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 6, 2026.
Source: mizchi/explainer on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.