
Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.
Better Writing is a packaged agent skill for rewriting, drafting, and reviewing prose. It uses a short core skill file plus deeper reference notes for genre, voice, slop patterns, and preflight checks, and it includes evals to test whether the skill removes tells without inventing facts.
Builders who want their agent to rewrite prose in a clearer voice without losing facts or tone.
You can turn generic or AI-sounding drafts into prose that stays specific, honest, and readable.
Uses a user writing sample and genre dials to preserve the writer’s voice instead of forcing a single human-sounding register.
Marks missing facts as placeholders or questions instead of inventing details to make a draft sound concrete.
Checks for common slop patterns like throat-clearing, vague attribution, inflated significance, and manufactured drama.
Uses confidence tiers and genre-specific exclusions so polished human writing is less likely to be over-edited.
Runs a final quality pass before delivery to catch obvious problems like leaked tool markup or unfilled placeholders.
Includes fixtures, a checker, a model runner, and comparison scripts for testing changes to the skill.
npx skills add forjd/better-writing
bunx skills add forjd/better-writing
npx skills add https://github.com/forjd/better-writing bunx skills add https://github.com/forjd/better-writing
npx skills add /path/to/better-writing bunx skills add /path/to/better-writing
DISABLE_TELEMETRY=1 npx skills add forjd/better-writing DISABLE_TELEMETRY=1 bunx skills add forjd/better-writing
Use $better-writing to rewrite this launch email so it sounds direct, warm, and less AI-written.
Better Writing is an agent skill for rewriting, drafting, and reviewing prose. Most de-slop skills delete AI tells and converge everything toward one generic "casual human" register. This one adds what those skip:
On top of that, it does the expected job well:
[Your Name] placeholder doesIt also ships with an evaluation harness: fixtures seeded with known tells and known facts, a checker, and a runner that sends each fixture through a real model with the skill loaded.
Real input, real output, no cherry-picked single sentences. These pairs double as test fixtures in evals/fixtures/.
Before:
I hope this email finds you well! We're thrilled to announce the launch of our groundbreaking new analytics dashboard, which goes live on Monday 15 June. This isn't just an update — it's a game-changer designed to transform your workflow. The dashboard replaces the weekly CSV export, and data now refreshes every hour instead of every seven days, empowering you to unlock deeper insights across teams, projects, and date ranges. To get started on this exciting journey, simply navigate to the Reports tab after logging in. Exciting times lie ahead!
After:
The new analytics dashboard goes live on Monday 15 June. It replaces the weekly CSV export. Data refreshes every hour instead of every seven days, and you can filter by team, project, or date range. Log in and open the Reports tab to try it.
Every fact survived (the date, the CSV export, the hourly refresh, the Reports tab). Everything else went.
Before:
It is important to note that customer churn has become a significant challenge in today's competitive landscape, rising for the second consecutive quarter. Some internal observers suggest the March pricing change and onboarding drop-off may have contributed, underscoring the need for a proactive retention strategy moving forward. The implications are significant.
After:
Churn rose for the second quarter in a row [figure needed from the Q1 report]. Two causes have been flagged internally: the March pricing change and onboarding drop-off. Both point to the need for a retention plan.
Note the placeholder. The skill will not invent a churn figure to make the paragraph sound concrete. If the figure exists in the source material, it goes in; if not, the gap is marked honestly.
Writer's draft:
I have rewritten this parser three times now, which is either dedication or a cry for help. Version three finally handles nested quotes, escaped backslashes, and the cursed Windows-1252 em dash that started this whole saga. I am not proud of the regex. It works.
What a generic humaniser pass produces:
After several iterations, the parser now robustly handles nested quotes, escaped backslashes, and Windows-1252 em dashes.
What this skill does: nothing. The draft has a voice, the details are specific, and "a cry for help" is a defendable quirk, not a tell. The skill's job here is to recognise that and leave it alone.
Use this skill when an agent needs to improve:
The skills.sh CLI is the easiest way to install the skill.
With npx:
npx skills add forjd/better-writing
With bunx:
bunx skills add forjd/better-writing
You can also install from the full GitHub URL:
npx skills add https://github.com/forjd/better-writing
bunx skills add https://github.com/forjd/better-writing
For local development, install from this checkout:
npx skills add /path/to/better-writing
bunx skills add /path/to/better-writing
The CLI collects anonymous install telemetry by default. To opt out:
DISABLE_TELEMETRY=1 npx skills add forjd/better-writing
DISABLE_TELEMETRY=1 bunx skills add forjd/better-writing
You can also copy the folder into your agent skills directory if your agent runtime supports local skill discovery.
Invoke it explicitly:
Use $better-writing to rewrite this launch email so it sounds direct, warm, and less AI-written.
Or ask for the behaviour naturally:
Humanise this draft without making it casual. Keep the legal caveats intact.
Review this landing-page copy for generic AI writing and give me a sharper version.
Use my writing sample below as the voice reference, then rewrite the article intro.
| Path | Purpose |
|---|---|
| SKILL.md | Core skill instructions and metadata. |
| agents/openai.yaml | UI metadata for compatible agent clients. |
| references/ai-writing-patterns.md | AI-writing tells, confidence tiers, near-conclusive artefacts, and false-positive checks. |
| references/preflight.md | Final quality checks before delivery. |
| references/sources.md | Source projects and attribution notes. |
| references/structures-and-phrases.md | Slop phrase and structure audit. |
| references/genre-tells.md | Genre-specific phrase banks for email, social, marketing, academic, fiction, and code. |
| references/voice-and-context.md | Audience, genre, dials, voice calibration, and genre exemptions. |
| evals/ | Fixture texts, a checker with voice-drift metrics, a model runner with an added-claims judge, and a pairwise comparison against a no-skill baseline. |
| skills/better-writing/ | Tap layout for managers that expect skills/<name>/; relative symlinks back to the root files. |
| scripts/validate.py | Repo checks run by CI: frontmatter, fixtures, symlinks. |
| CHANGELOG.md | Dated history of the pattern catalogue. |
SKILL.md stays concise so agents can load it quickly. The detailed audit material lives in references/ and is loaded only when needed. The evals/ directory is repo tooling; agents do not load it.
CI runs two dependency-free checks on every push and pull request:
python3 scripts/validate.py # frontmatter, fixture, and symlink checks
python3 evals/run_evals.py --all evals/examples # checker self-test
Neither exercises a model. The self-test proves the checker agrees with the hand-written known-good outputs, nothing more. To test the skill itself, run the model runner described under Evaluation; it needs credentials, so it is not part of CI.
You can also validate the skill with the checker from Anthropic's skill-creator skill:
git clone https://github.com/anthropics/skills.git
python3 skills/skills/skill-creator/scripts/quick_validate.py /path/to/better-writing
This checks the required skill metadata and naming rules.
Better Writing started as a synthesis of three skills and one reference page. Each contributed something worth keeping, and each had a gap this skill closes.
| Source | What we kept | What we changed |
|---|---|---|
| blader/humanizer | The AI-pattern taxonomy and the caution about false positives. | Added genre dials so the fixes are not one-size-fits-all, and an eval harness so the pattern list is testable. |
| hardikpandya/stop-slop | The structural audits: throat-clearing, binary contrast, false agency. | Added voice calibration so removing slop does not flatten the writer into a house style. |
| Leonxlnx/taste-skill | Context-first brief reading and explicit quality dials. | Added factual guardrails and a preservation check, so taste decisions never license invented specifics. |
| Wikipedia:Signs of AI writing | The observed-in-the-wild pattern catalogue. | Reorganised for agent use and dated in the changelog so the list can drift as models do. |
See references/sources.md for fuller source notes.
Pattern lists are easy to break: one well-meaning edit and the skill starts flagging human writing or missing a new tell. The evals/ directory holds ten fixture texts seeded with known tells and known facts, a dependency-free checker that verifies a rewrite removed the tells and kept the facts, and a runner that produces the rewrites with a real model.
python3 evals/run_skill.py # run every fixture through claude-opus-5, check, then judge for added claims
python3 evals/run_evals.py evals/fixtures/launch-email my-rewrite.md # check a rewrite you produced some other way
python3 evals/run_skill.py --no-skill --no-judge --out evals/baseline # the same briefs with no skill loaded
python3 evals/compare_outputs.py evals/baseline evals/outputs # pairwise judge, both orders, unlabelled
The runner needs the Claude Code CLI on PATH with working credentials. Run it before and after any change to SKILL.md or the references and compare the two reports. The added-claims judge exists because the substring checker cannot see invention; a rewrite that added "nobody has asked to bring the stand-up back" to the LinkedIn fixture passed every substring check. The baseline and pairwise comparison exist because a pass count cannot show the skill beat the unaided model.
The checker is a smoke test, not a judge. It matches substrings, bounds the length, rejects the damage a search-and-replace leaves behind (doubled spaces, space before punctuation), catches binary-contrast scaffolds, and on keep-my-voice fixtures measures whether contractions, first person, hedges, and word length moved. A rewrite can pass it and still read badly, so read the outputs in evals/outputs/ as well as the pass counts. Detector scores are deliberately not a check; evals/README.md says why. See evals/README.md for the fixture list and check format.
AI tells drift. "Delve" and "tapestry" marked 2023-era output; "it's not just X, it's Y" marks 2025-era output across vendors, while dash dependence now marks Claude and DeepSeek but not GPT-5. The pattern lists in references/ are treated as a dated catalogue, not a fixed rulebook:
plain-human, voice-preservation, and academic-hedge evals fail if the skill over-edits clean prose. Detector-evasion is explicitly a non-goal.The skill follows the standard agent-skill layout (SKILL.md plus lazily loaded references/), so it works in any runtime that discovers skills by folder:
SKILL.md frontmatter will pick it up; the references are plain Markdown loaded on demand.The skills/better-writing/ directory is a tap layout for managers that expect skills/<name>/. It is built from relative symlinks back to the root files, which survive git clone but not GitHub's Download ZIP or a Windows checkout without symlink support. In those cases install from the repo root, which is the canonical copy.
Keep the skill lean. Put core workflow guidance in SKILL.md, and move detailed pattern lists or examples into references/.
Before opening a pull request:
python3 scripts/validate.py. CI runs it on every pull request as well.python3 evals/run_skill.py before and after the change if you touched the pattern lists or SKILL.md, and say in the pull request what changed in the two reports.MIT licence. Copyright (c) 2026 Forjd.
Sign in to join the discussion.
No comments yet. Be the first to say what this is good for.

Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local deterministic AST parsing, every edge explained, no vector store.
Topic in, narrated explainer video out. A Claude Code / Codex skill that turns any topic into a black-canvas motion-graphics explainer video with TTS voiceover, subtitles and a chapter progress bar. Chinese or English; every frame drawn in code with Remotion.
Public repository for Agent Skills
Open-source AI job search: scan job portals, evaluate listings into a structured A-H report with a global 1-5 score, tailor your CV, track applications — runs locally in your AI coding CLI (Claude Code, Codex, OpenCode, Antigravity…)
Agent skill for beautiful, verifiable architecture, workflow, sequence, data-flow, and lifecycle diagrams—self-contained HTML with motion and crisp export.
A skill to stop your coding agent from burying the answer. ADHD-friendly output.