Chinese Technical Writing
leter/zh-tech-writing
Sets writing rules for Chinese technical docs: short plain sentences, consistent typography and a checklist for removing AI-sounding filler.
Rules for writing and reviewing evlog docs, blog posts, READMEs, skills and AGENTS.md files, with separate review and rewrite roles, a house voice and a catalog of AI-sounding tells.
$ npx skills add evloghq/evlog --skill write-evlog-content -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install evloghq/evlog write-evlog-content --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/evloghq/evlog.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/write-evlog-content .claude/skills/write-evlog-content && 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 "write-evlog-content" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/write-evlog-content into .claude/skills/write-evlog-content/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-evlog-content", 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/evloghq/evlog/tree/main/.agents/skills/write-evlog-contentType 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 evloghq/evlog --skill write-evlog-content -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install evloghq/evlog write-evlog-content --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/write-evlog-content .agents/skills/write-evlog-content && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "write-evlog-content" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/write-evlog-content into .agents/skills/write-evlog-content/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-evlog-content", 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 evloghq/evlog --skill write-evlog-content -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install evloghq/evlog write-evlog-content --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/write-evlog-content .cursor/skills/write-evlog-content && 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 "write-evlog-content" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/write-evlog-content into .cursor/skills/write-evlog-content/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-evlog-content", 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/evloghq/evlog.git --path .agents/skills/write-evlog-content--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 evloghq/evlog --skill write-evlog-content -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install evloghq/evlog write-evlog-content --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/write-evlog-content .gemini/skills/write-evlog-content && 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 "write-evlog-content" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/write-evlog-content into .gemini/skills/write-evlog-content/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-evlog-content", 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 evloghq/evlog write-evlog-contentInstalls 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 evloghq/evlog --skill write-evlog-content -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/write-evlog-content .github/skills/write-evlog-content && 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 "write-evlog-content" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/write-evlog-content into .github/skills/write-evlog-content/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-evlog-content", 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 evloghq/evlog --skill write-evlog-content -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install evloghq/evlog write-evlog-content --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/evloghq/evlog.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/write-evlog-content .opencode/skills/write-evlog-content && 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 "write-evlog-content" agent skill from https://github.com/evloghq/evlog/tree/main/.agents/skills/write-evlog-content into .opencode/skills/write-evlog-content/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-evlog-content", 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.
write-evlog-contentRules for writing and reviewing evlog docs, blog posts, READMEs, skills and AGENTS.md files, with separate review and rewrite roles, a house voice and a catalog of AI-sounding tells.
The skill keeps two roles apart. Review produces findings and a verdict and never rewrites or proposes wording, while rewrite changes only what a finding names and cites the rule or tell ID for each change. Reference files hold the voice and its five tests, which load first, atomic rules grouped by surface (blog, docs, landing, machine and universal), an AI-tells list loaded when reviewing, terminology, samples and corrections. Dossiers on other loggers such as consola, logtape, OpenTelemetry, pino and winston are read before any sentence that names a competitor.
It treats the corpus as prose read by people, such as docs, the landing page, blog posts and READMEs, and prose read by agents, such as skills and AGENTS.md files. Punctuation, terminology, accuracy and dead-link rules apply to both, but rhythm rules do not apply to procedures. A content lint script scans the surfaces but excludes this skill's own references, which should be read by a person. Findings on skill files return as a report, not a rewrite. The excerpt is cut off at severity.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 59a105f. 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.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.
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.
evlog Content Writing loads about 2.9k tokens when it runs, and up to ~22k if it reads all its reference files. Until then it costs about 129 tokens; SKILL.md has 1,506 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); files beside SKILL.md are not scanned.
The full file from evloghq/evlog at commit 59a105f, republished under its MIT licence (© evloghq). 1,506 words, ~2,866 tokens.
.claude/skills/write-evlog-content/SKILL.md (or your agent's skills folder). This skill also uses 16 other files; get the full folder from GitHub.Everything needed to draft or judge evlog prose. Two roles use this skill and they must not be merged.
Review produces findings and a verdict. It never rewrites, never softens, never proposes wording. Rewrite applies findings. It touches only what a finding names, and cites the rule or tell id for every change.
Splitting them is what keeps the loop honest. A reviewer that can rewrite talks itself into changes it cannot justify, and a rewriter that can re-judge its own output always passes.
references/
voice.md the voice and the five tests. Load first, always
rules/ atomic rules, one file per surface group
universal.md every surface
docs.md apps/docs/content
blog.md blog posts
landing.md 0.landing.md and other marketing surfaces
machine.md skills and AGENTS.md, the surfaces an agent acts on
ai-tells.md the tell corpus, each tell with its legitimate twin
terminology.md the names evlog gave its own parts (U-15)
landscape/ what pino, winston, consola, and OpenTelemetry actually do (U-12)
surfaces/ what each surface owes its reader
docs.md blog.md landing.md readme.md skill.md agents.md changeset.md
samples.md evlog pages that read right, and why. What the tells must not flag
corrections.md accumulated lessons from rejected rewrites. Grows over timeLoad voice.md first. Then the rule file for the surface, ai-tells.md when reviewing, and the matching surfaces/ file when drafting. Open terminology.md when a U-15 candidate is in play and the relevant landscape/ dossier before writing any sentence that names another logger. Do not load everything.
Everything evlog ships as prose, on both sides of the line:
| Read by | Surfaces | What decides quality |
|---|---|---|
| People | docs pages, the landing, blog posts, the package READMEs, Evi's own docs under apps/evi/docs/ | Whether the reader can act, and whether they believe the page |
| Agents | .agents/skills/, skills/, apps/evi/agent/skills/, the AGENTS.md files | Whether an agent does the right thing having read only this |
The house rules cross the line: punctuation, terminology, accuracy, dead links. Rhythm does not. A skill whose four steps read as four parallel imperatives is a procedure, and the scanner leaves rhythm alone there. See rules/machine.md.
One part of that table is excluded from the scan: this skill's own references/, because they quote the prose they ban, worked pair by worked pair, and scanning them measures the examples. The exclusion lives in scripts/content-lint/lib/surfaces.mjs, and it means the scanner will never tell you those files drifted. Read them yourself.
Evi's own trees used to sit outside the corpus too, so the scanner read everything but them while their prose accumulated em dashes for months. They are in now, and that history is the reason: a written surface the scanner cannot see is one that can drift forever. Findings on a skill surface come back as a report for a person to judge, never as a rewrite of the instructions the pass itself runs on.
critical blocks publishing: a wrong code sample, a phantom API, a claim the source contradicts, a landing promise no page delivers.standard is fixed when the page is touched: voice, rhythm, structure, punctuation.A tell about rhythm is never critical on its own. Epigram density, heading shape, bullet frames, and sentence uniformity describe how prose reads, and prose that reads a certain way has never broken anything.
Correctness takes precedence over the scan score. Verify behavioral claims against the relevant source revision, run examples presented as executable, and check that comparison sources support the exact claim and configuration. Dossiers are research starting points and can be wrong even when recently checked. Search for exceptions to absolute guarantees and check equivalent workloads before drawing benchmark conclusions. A factual fix remains necessary if its style score falls; judge the new candidates before changing the prose again.
Two entries in the tell corpus are not rhythm and do not follow that rule. T-15 is drift: a symbol or entry point the package does not export, which is a fact the source settles and always critical. T-13 is a house rule the maintainer decided, and one occurrence is a finding. They live in ai-tells.md because that is where the scanner's ids are documented, not because they are matters of taste.
Run the scanner first, always:
pnpm content:lint apps/docs/content/2.learn/2.wide-events.md --jsonIt returns per-page metrics, phrase hits, and API-drift findings. With no path it ranks the whole corpus worst-first, which is how a pass picks its target, and --surface narrows it to one kind of page:
pnpm content:lint --top 10
pnpm content:lint --surface skill --top 5
pnpm content:lint --url https://example.com/post --as blog # a page outside the repo
cat draft.md | pnpm content:lint --stdin # prose that is not a file yetSome findings are fixed before anyone reads them. pnpm content:lint <paths> --fix applies the rules whose corrected text follows from the rule itself: a retired entry point, a term with one replacement, a link with a redirect behind it. Punctuation is not among them, so every dash reaches you. It re-scans afterwards and reverts any file that scored worse or that introduced a finding id the page did not have, so a fix that trades one problem for another never lands. Run it before reviewing, so a review spends its attention on what a codemod cannot decide.
Rates are compared per surface. A reference page and a skill file have different natural rhythms, and one median over both flatters whichever is looser. A --url scan drops every evlog-specific check: someone else's entry points, links, and vocabulary are theirs, so what comes back is how the page reads.
Every scan returns two lists. The findings are what tripped a counter. modelChecks is what no counter reached on that page, chosen for its surface and its shape: whether the claims carry a mechanism, whether the opening states a situation, whether a skill's description would route to it, whether the code runs. Answer all of them. A review that only works the findings reviews only what was measurable, and a page can satisfy every count while answering nothing.
Then, in order:
U-14 punctuation, T-13 assistant framing, T-15 a retired entry point) is already decided: one occurrence is a finding. A rhythm (epigram density, uniform sentences, header lock) is a judgment call, and the scanner gives you the rate, not the answer.ai-tells.md ships Reads generated and Reads legitimate. Almost every one has a lawful twin in reference documentation: a required and optional field list is a complement set, three drains listed is a rule of three, uniform sentence length is the register of an API page. Say which side the candidate is nearer. If it is nearer the twin, drop it. If it genuinely sits between, keep it and name what made it survive.samples.md. These are evlog pages that read right. The test that decides most borderline cases: does the line deliver a fact, a number, a mechanism, or a decision? A short closer that lands a measurement is voice. The same closer restating the paragraph is a tell.packages/evlog/src is either a doc that outran a rename or a false hit on prose. Read the source before writing the finding.U-12 candidate means a sentence claims something about pino, winston, consola, or OpenTelemetry with nothing behind it. Open landscape/<tool>.md. If the claim is not in the dossier, it is unverified, and unverified is a finding whether or not the claim is true.Every finding carries a rule id or a tell id, a verbatim excerpt, and one line on what it costs the reader. A finding that cites neither is taste, and taste does not ship.
Output:
## Content review: <path>
**Verdict**: pass | minor | significant | blocked
### Scan
<one line: score, the metrics that are evidence, drift count. Cite a number only when it argues.>
### Critical
- [id] excerpt, then what it breaks.
### Standard
- [id] excerpt, then what it costs.Write _None._ under an empty heading. blocked requires a critical finding. significant means two or more standard findings that compound, or one that reaches the lede or the title.
A rewrite starts from a review, never from a page. Rules:
packages/evlog/src before writing it.:br, frontmatter keys and their order.Content is prose about a system that changes. When the review and the source disagree, the source wins and the finding becomes a doc fix, not a wording fix.
Two fixtures pin what this skill is worth: scripts/content-lint/fixtures/generated.md, saturated on purpose, and written.md, which carries the lawful twins. scripts/content-lint/fixtures.test.mjs fails if the distance between their scores closes, and apps/evi/evals/content/ fails if a reviewer passes the first or finds fault with the second.
A change to the corpus, a rule, or a threshold runs both. A tell that cannot separate those two pages is not measuring anything.
The corpus and the rules are working documents. When a review flags something that should have passed, or the maintainer overrides a rule, the lesson goes in corrections.md the same day. When a tell only ever produces its own false positives on this corpus, delete it from ai-tells.md and from scripts/content-lint/lib/corpus.mjs in the same change. A tell nobody trusts is worse than no tell, because it trains the reviewer to skim the list.
© evloghq, MIT. 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 16 other files (references) in .agents/skills/write-evlog-content of evloghq/evlog.
Open the folder on GitHubat commit 59a105f
evlog Content Writing 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 |
|---|---|---|---|---|---|---|
| evlog Content Writing this skillevloghq/evlog | 1.9k | — | ~2.9k | Automated safety check: Pass | MIT | |
| Chinese Technical Writingleter/zh-tech-writing | 334 | — | ~656 | Automated safety check: Pass | MIT | |
| Declaudingoaustegard/claude-skills | 150 | — | ~5.2k | Automated safety check: Pass | MIT | |
| User-Facing Text Cleanupguillaumemeyer/watermarks-remover | 24k | — | ~3.5k | Automated safety check: Pass | MIT | |
| Chinese Text Humanizerop7418/Humanizer-zh | 19k | — | ~2k | Automated safety check: Pass | MIT | |
| Korean AI-Text Humanizerepoko77-ai/im-not-ai | 5.9k | 1 repos | ~4.5k | Automated safety check: Pass | MIT |
leter/zh-tech-writing
Sets writing rules for Chinese technical docs: short plain sentences, consistent typography and a checklist for removing AI-sounding filler.
oaustegard/claude-skills
Rewrites model-sounding prose into plain technical writing and checks that every claim survives, for PR text, docs, commit messages and similar drafts.
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.
op7418/Humanizer-zh
Edits Chinese articles, comments and documents to remove filler, repetition and template phrasing while keeping the facts, the level of certainty and the author's voice.
epoko77-ai/im-not-ai
Rewrites Korean text written by AI so it reads like a human wrote it, detecting translationese and other AI patterns while leaving the content untouched.
coji/natural-japanese
Writes and edits Japanese business documents so they read clearly and naturally, removes AI-sounding phrasing and can score how AI-like a text reads.
evloghq/evlog
Walks through adding a new built-in evlog drain adapter for an observability platform: source, build config, exports, tests, docs and PR scope.
evloghq/evlog
Guides adding a new built-in enricher to the evlog package, covering the source, tests, docs, README, a related skill and a changeset.
evloghq/evlog
Walks a contributor through adding a new HTTP framework integration to the evlog logging package: middleware source, build entry, exports, tests, example app and docs.
evloghq/evlog
Walks through adding a new rule or framework adapter to `evlog map` in @evlog/cli, from the rule source and registry to types, tests, docs and the published skill.
evloghq/evlog
Produce a before/after visual comparison of an evlog surface (landing, docs, telemetry, playgrounds) and share it as public Blob URLs.
evloghq/evlog
Runs the daily review of evlog's written material: picks the worst-scoring files in one group, rewrites what holds up, and opens a single pull request that reports the changes.
Categories
Rules for writing and reviewing evlog docs, blog posts, READMEs, skills and AGENTS.md files, with separate review and rewrite roles, a house voice and a catalog of AI-sounding tells. The skill keeps two roles apart. Review produces findings and a verdict and never rewrites or proposes wording, while rewrite changes only what a finding names and cites the rule or tell ID for each change.
evlog Content Writing fits situations like: drafting a docs page or blog post in the evlog voice; reviewing a README or landing page for accuracy and AI-generated phrasing; editing a SKILL.md or AGENTS.md without breaking its procedure; writing a sentence that compares evlog with another logging library.
Run `npx skills add evloghq/evlog --skill write-evlog-content -a claude-code`. Or copy the skill folder (.agents/skills/write-evlog-content in evloghq/evlog) into .claude/skills/write-evlog-content in your project. Claude Code loads it when a task matches its description.
Run `npx skills add evloghq/evlog --skill write-evlog-content -a codex`. Or copy the skill folder (.agents/skills/write-evlog-content in evloghq/evlog) into .agents/skills/write-evlog-content 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 evloghq/evlog --skill write-evlog-content -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/write-evlog-content, .gemini/skills/write-evlog-content, .github/skills/write-evlog-content and .opencode/skills/write-evlog-content in your project.
Going by SKILL.md and its folder, evlog Content Writing needs the command-line tools its instructions call (pnpm). Our summary lists: The evlog repository.
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. Review the folder before installing.
evlog Content Writing is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k tokens (SKILL.md is roughly 11k 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 19k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with evlog Content Writing: Chinese Technical Writing (leter/zh-tech-writing, 334 stars), Declauding (oaustegard/claude-skills, 150 stars), User-Facing Text Cleanup (guillaumemeyer/watermarks-remover, 24k stars) and Chinese Text Humanizer (op7418/Humanizer-zh, 19k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
evloghq (a GitHub organization) maintains it in evloghq/evlog, which has 1,887 GitHub stars. The repository holds 20 skills in this directory. The repository was last updated on October 7, 2026.
Source: evloghq/evlog on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.