PART 1

The tools

This page is a teaching guide for content designers, not an inventory. Each card explains what the tool is, how it actually works, where it fails, and what you can borrow even if you never install it. Facts, links, and dates come from the research; the prose is written so you could teach the move in a critique.

All 44 tools at a glance

ToolWhat it doesAvailability
Content design tools
Anthropic /ux-copyWrites or reviews interface copy from a prompt, inside Claude CoworkPublic
Wix /ux-contentReviews a full screen for hierarchy, edge cases, and the next actionInternal
Wix terminology-researchResearches candidate terms against four sources and writes a glossary entryInternal
Gemini CLI string-reviewerReviews a product’s own UI strings against a checklist and word listPublic
LobeHub DESIGN.mdA content spec kept in the repo, plus a skill that audits the UI at three levels of detailPublic
Intercom validation skillChecks code, screenshots, or Figma text against a design systemInternal
Intercom VERBIA chat assistant that answers content questions from the style guide, glossaries, and design systemInternal
PayFit’s content-design assistantRoutes a terminology or drafting question to the right document set before answeringInternal
Atlassian Content AssistantA Slack agent that drafts copy and names the standards it usedInternal
Atlassian Design System toolsLets a coding agent fetch the design system’s UX-writing rules directlyPublic
Intuit content quality pluginA set of skills that all read one shared set of content standardsInternal
SmartHR house-style presetOne company’s content guidelines as a versioned installable packagePublic
ux-writing-skillReviews copy in four passes, one per quality standardPublic
ux-writing-1A fine-tuned model that rewrites UI strings as structured data you can script againstPublic
The i18n content hookBlocks string edits until nine mechanical content rules passDescribed
better-interfaceWhole-interface review skill; writing is one of seven sectionsPublic
balise-ux-writingA copy skill with four modes that is never allowed to edit the design file itselfPublic
figma-ux-writing-styleFigma’s own house style guide, runnable in three modesPublic
Salesforce brand-voice skillFetches brand voice and guardrails from a CMS so an agent can apply themPublic
Windy Road hooksFour hooks that block copy edits until a review runsPublic
DittoApproved copy library with rule-citing review, pull-request bot, agent tools, and component specsCommercial
FrontitudeCopy library with guidelines bound to design components, plus push-from-code and agent accessCommercial
ContentRXReviews product writing in the editor, in chat with an agent, and on a pull requestCommercial
GummbleLets an agent search real product screens and real microcopy before inventing new copyCommercial
sota-ux-writingA writing-and-review skill for interface copy, with plain-language and localization rulesPublic
Uxcel ux-microcopyWrites microcopy, then hands the draft to separate review skillsPublic
LocInTranslates product strings from the command line or a build, keeping tone and placeholdersCommercial
LexiAn internal review assistant with named review modes (described in a public writeup)Described
Coinbase content agent → FigmaWhat broke when a working chat agent was rebuilt as a Figma pluginDescribed
RavenOpen toolkit an agent can call for voice systems and audits that quote the broken linePublic
cd-agency content agentsSeventeen content-design agents, one markdown file each, with typed inputs and outputsPublic
cd-agency content lintChecks the changed files in a pull request and can block the mergePublic
Other writing tools
Metabase docs skillsPaired docs writer and reviewer sharing one style guidePublic
Vale + style-package registryChecks documents against style rules you install as packagesPublic
writing-evalScores new text against a writing profile built from your own past documentsPublic
slop-no-moreA scanner that matches twenty-six AI-writing patterns, with no model involvedPublic
textlint AI-writing presetFlags the formatting and vocabulary tells of machine-written JapanesePublic
Vercel writing-guidelinesReviews long-form content against rules fetched from a URL each runPublic
GitLab docs standardsFifty-three Vale lint rules, plus the style guide served as raw markdownPublic
Inspiration from other disciplines
Anthropic policy compilerTurns a written policy into code that checks content, without a model on every checkPublic
Duolingo Slack agentA Slack agent with a second AI step that verifies names and links before it repliesPublic
claude-personaRuns a panel of simulated test users, each answering with no visibility into the othersPublic
Designer Skills CollectionMany small design skills plus commands that chain them, automatically checked for overlapPublic
bco-signalsA written policy governing how an AI agent adds entries to a public datasetPublic

Content design tools

Tools whose actual job is UX content: reviewing it, generating it, governing terminology, enforcing a style guide. If you are building something in this space, these are your direct references. Read each card for the architecture lesson — especially How it works and What to borrow — not only for whether you can install the thing tomorrow.

Anthropic's /ux-copy skill

A slash command in Claude Cowork that writes or reviews UI copy · anthropics/knowledge-work-plugins · 23,621 stars · checked 2026-08-23

Full detail
What it is
A slash command, /ux-copy, that writes or reviews interface copy.

It runs in Claude Cowork, Anthropic's desktop app for knowledge work — not a coding tool.

It ships in Anthropic's plugin repo next to six other design skills: accessibility review, design critique, design handoff, design system, research synthesis, and user research.

Built by
Anthropic.
Availability
Public, licensed Apache 2.0 — a permissive open-source licence. You can copy the file, change it, and use it commercially, as long as you keep the copyright notice.

Install with npx skills add https://github.com/anthropics/knowledge-work-plugins --skill ux-copy.

The repo was last updated the day this was checked.

Where it runs
Claude Cowork. Invoked as /ux-copy <context or copy to review>.
What you give it
The skill asks for four inputs:
  • Context — the screen, flow, or feature.
  • User state — what the user is trying to do, and how they are feeling.
  • Tone — formal, friendly, playful, or reassuring.
  • Constraints — character limits and platform guidelines.
What it does
Writes new copy or reviews copy you paste in, then returns a recommendation, alternatives, a rationale, and localization notes.

It applies five principles — clear, concise, consistent, useful, human — and a set of per-surface formulas:

  • Error messages: what happened, why, how to fix it.
  • Empty states: what this is, why it's empty, how to start.
  • Confirmation dialogs: state the action and the count (Delete 3 files?), describe the consequence, and label buttons with the action (Delete files / Keep files) rather than OK/Cancel.
  • CTAs: start with a verb, name the specific outcome.
  • Tooltips, loading states, onboarding: one concept at a time, set expectations.

Tone is mapped to four states: success, error, warning, neutral.

How it works
The skill is a single markdown file with no code. Its behaviour comes from three parts:
  1. It triggers on phrasing. The agent matches an incoming request against a list in the file's description to decide whether to load the skill. That list holds two kinds of entry:
    • Exact phrases — "write copy for", "what should this button say?", "review this error message".
    • Tasks — naming a CTA, wording a confirmation dialog, filling an empty state, writing onboarding text.
  2. It fixes the output format — see the next row.
  3. It checks for connected tools. Two cases, and it defers to a shared connectors file rather than naming a specific product:
    • A knowledge base is connected — it pulls the brand voice and style guide from it.
    • A design tool is connected — it reads the screen in Figma and takes character limits from the design.
Grounding
None by default. The skill contains no style guide, terminology list, or examples from a specific product — it applies general UX-writing principles unless a connected knowledge base supplies your own.
Output format
Every response follows the same four-part structure, whatever you asked for:
  • A recommended-copy line — the single answer.
  • An alternatives table, with the columns Option, Copy, Tone, Best For.
  • A rationale.
  • Localization notes — idioms to avoid, character expansion, cultural context.
Testing
None. It does not check its own output, and nothing else does either.
Limits & gaps
  • 3.4 KB in one file. No scripts and no validators — everything it does, it does by instruction.
  • No terminology source, and no access to a codebase or repo.
  • It can't see the thing it is writing for unless a design tool or knowledge base happens to be connected.
What to borrow
The output contract is the teaching point — not the five principles, which any good guide already has.
  • An alternatives table with a Best For column gives a reviewer a choice rather than a single suggestion. Choice teaches judgment; one line trains obedience.
  • A required localization-notes section surfaces translation cost while the copy is still being decided, so “we’ll localize later” cannot hide expansion and plural problems.
  • Ask for context, user state, tone, and constraints before polishing words. Without that gate, the skill invents a situation and writes beautifully for the wrong one.

Wix /ux-content (Jot)

Writes or fixes UX copy for a whole screen, not one string at a time · build writeup (July 2026) · UXCC (April 2026)

Full detail
What it is
An agent skill that writes and fixes the copy on a screen. It works out for itself whether the job is writing something new or improving what's already there, and it reports whether a user would actually know what to do next — including when the fix is structural rather than a wording change.

The distinction it is built around: most AI copy tools judge each string on its own, which catches wording but not whether the screen works.

Built by
The UX writing team at Wix, over about six months of iteration. Project led by Ayelet Kessel.
Availability
Internal. Described in detail across two public articles; the files are not published.
Where it runs
In a coding agent. Triggers on the phrase "ck-ux-content" (tolerant of typos and of spaces or underscores in place of the hyphen) or on a direct request to write or review UI text.
What you give it
A screen or just the text. From there it gathers its own context — reading the product code, the spec, and the other project artifacts to work out what the feature does and what state the user is in.
What it does
Writes or reviews the copy on a screen, measured against a single question its own instructions put above everything else: after reading this, would the user know what they are supposed to do, and how? Clarity, tone, hierarchy and structure are all treated as serving that one goal.

To answer it, the skill works at three levels rather than only on the words:

  • The screen — whether the thing holds together: one clear primary message and next action, and a reading order that matches the order the user needs.
  • The component — whether the copy follows the pattern for that particular surface, and whether the content belongs in that component at all.
  • The string — wording, approved terminology, and the house style guide.

It is also explicitly allowed to conclude that the fix is structural rather than verbal — recommending a component or layout change instead of a rewrite.

How it works
Two depths, chosen up front with a plain-language question:
  • Quick check — hierarchy, state of mind, path forward, style guide, glossary, then one reviewer subagent pass in a clean context.
  • Full review — all of that, plus three additions:
    • It answers its own questions about the feature from the product code before asking a person.
    • Before any copy work starts, a fresh subagentA separate agent instance with its own clean context window, spawned to do one bounded job (validate a draft, role-play a user) and report back. The clean context is the point: it can't be biased by the main agent's reasoning. looks at the rendered screen with no context and answers one question: does this screen make sense as a whole, or is it the wrong screen for the job? If it's the wrong screen, no amount of rewording will fix it, so the copy work pauses there.
    • On any screen with more than one button, a separate subagent is shown only the button labels and asked which it would click. A mismatch with the intended action is a finding.

The steps that run inside either mode:

  • Map the hierarchy and run a fixed diagnostic against it before touching any words.
  • Check the copy against that component's own rules, from a catalog of 41 reference files. If the message doesn't suit the component it's been put in — an error stuffed into a toast that disappears before it can be read, say — it recommends changing the component rather than rewording the text.
  • Work out whether the user can actually do anything about what the copy is telling them — the step its instructions call "the most critical". If an error says a payment failed, is there a button on that screen to retry it? It reads the code to find out rather than assuming. An action the user can't see — buried in a hover tooltip or a collapsed menu — is treated as no action at all, and the gap gets flagged as a design problem rather than written around.
  • Check the terms against Wix's internal UX writing glossary — the company-wide record of approved wording — swapping anything prohibited for the approved term.
  • Hand the near-final copy to a reviewer subagent — a fresh instance with none of the preceding reasoning in its context — for a cold pass against the guidelines.
Grounding
Product specs, research, user data, and the source code — so it sees the states that actually exist and the actions actually available, not only what the spec mentions.
Output format
Fixed in shape, and written to be scannable in about fifteen seconds:
  • The corrected copy first — always the actual fixed wording, never just a flag that something is wrong — shown against the original.
  • An Element / Before / After table when a whole screen is under review; numbered options when several approaches are genuinely viable.
  • The reason, in at most two or three one-line bullets.
  • Design flags, one line each, written as problem then recommendation. Not optional when the path-forward step found a missing action, the wrong component, or a hidden warning.
  • Everything else pushed to the bottom — an unverified assumption, a persona-panel finding — under a plain "More detail" heading, capped at about five lines.
Testing
No accuracy measurement disclosed. What it has instead is five rules aimed at stopping the agent sounding certain about things it hasn't checked:
  • It never grades its own work. The review always runs in a fresh subagent, never as role-play inside the conversation that wrote the copy — the skill's own reasoning is that a model reviewing its own output rates it favourably no matter how critical you tell it to be.
  • What the creator says is a claim, not a fact. Where the code can settle a question, it has to read the code rather than take the answer on trust — and if the two disagree, say so plainly instead of softening it.
  • It must not invent how the user got there. The arrival route is traced from the code, because both the cold read and the persona panel take it as an input; a made-up entry point produces confident reactions to a journey nobody actually takes.
  • Anything it couldn't verify is labelled as such in the output, rather than presented as established.
  • One persona's reaction isn't a verdict. A finding counts when two or more independently hit the same confusion, or a predicted click misses — and after a material rewrite it re-runs the check once to confirm the fix landed.

Every one of those constrains how confident the output is allowed to sound. None of them measures whether it was right.

Reported results
In its first six months it was run 2,470 times by 248 people — the most heavily-invoked skill in Wix's internal library for product teams.
Limits & gaps
  • Not inspectable. File structure, line counts, and the persona definitions aren't public — this card is built from the skill itself, read internally.
  • Adoption is not quality. The figure above says people run it, not that its output is good.
  • No deterministic checker. The one mechanical step is the glossary call; everything else is judgment by a model.
What to borrow
  • Separate the thing that writes from the thing that judges. The review runs in a fresh subagent with none of the drafting reasoning in its context — role-playing a critic in the same conversation doesn't work, because the model rates its own output favourably however you word the instruction.
  • Ask whether the user can actually do the thing your copy implies. Read the code to find out rather than assuming, and treat an action nobody can see — behind a hover, an icon, a collapsed menu — as no action at all.
  • Let the review conclude "this isn't a copy problem." Giving it permission to recommend a different component or a layout change is what stops it polishing wording on a screen that shouldn't exist in that shape.
  • Test decision screens by showing only the buttons. Hand a fresh subagent the labels with no surrounding copy and ask which it would click; a mismatch with the intended action is a finding that a "is this clear?" question never surfaces.
  • Label what you couldn't check. Unverified assumptions travel into the output marked as unverified instead of being presented as fact.

The build lesson underneath all of it: six months of improving the prompt didn't work, and splitting the job into separate verifiable checks did. The quality came from the architecture, not the instruction wording.

Wix terminology-research skill

Decides what to call things, before anyone writes copy · build writeup (April 2026)

Full detail
What it is
An agent skillA folder containing a markdown file of instructions (plus optional reference files and scripts) that an agent loads when relevant. The agent reads the skill's description to decide when to load it — the file is doctrine; the description is the trigger. that researches which term a product should use for a concept, then writes the decision into a terminology guide that people and other agents both read.
Built by
The UX writing team at Wix. Project led by Ayelet Kessel.
Availability
Internal. The method is fully described publicly; the files are not published.
Where it runs
In a coding agent. Early, before any copy exists.
What you give it
Product artifacts — specs and design docs — plus either a feature area to cover, or the two or three candidate words you're choosing between.
What it does
Settles what the product should call things, and writes the decision somewhere both people and other agents will read it. What you get back depends on what you asked for:
  • A full terminology guide, when you give it a feature area. It works out which concepts in that feature need an agreed word at all, then writes an entry for each one. That file becomes the place the team looks up what to call things.
  • A single recommendation, when you name the candidate words yourself. It researches that one concept, then returns a verdict on which word to use, a table of what each competitor calls the same thing, and a confidence rating.
How it works
  1. Extract candidate concepts from the artifacts.
  2. Research each one against four sources — competitor research, prior UX research, a scan of real support tickets and feature requests for how users describe the thing themselves, and a live check against Wix's own internal glossary.
  3. Filter out the ones that don't need deciding. Not every word in a feature is a terminology question. It keeps a concept only if all three are true: users will see the word on screen, there is more than one reasonable thing you could call it, and different teams would otherwise call it different things. Anything that fails one of those is just writing, and stays out of the guide — which is what stops the guide filling up with words nobody was ever going to argue about.
  4. Define it in three fields:
    • Definition — what the thing is.
    • Context notes — scope and boundaries: which objects it applies to, and where it stops.
    • Example usage — one sentence showing the pattern.
  5. Write it to the guide, weighing the four sources in a fixed order when they disagree: the internal glossary first, then how users actually talk about it, then industry convention, and plain language last.

Throughout, every claim has to trace to a source, and the agent is explicitly allowed to say it doesn't know.

Grounding
Four sources, weighed in a fixed order when they disagree:
  • Wix's internal glossary — what the company already calls this. A match in the same product area is binding; a match somewhere else is flagged rather than treated as a conflict.
  • User language — how people describe the thing in support tickets and feature requests.
  • Industry convention — what competitors and the wider field call it.
  • Plain language, last, when nothing above settles it.
Output format
Every term is written to the guide in the same three fields:
  • Definition — what the thing is.
  • Context notes — which objects it applies to, and where it stops.
  • Example usage — one sentence showing the pattern.
Testing
None disclosed. What it has instead is a rule about confidence: an unreachable source caps the whole recommendation at medium, however well the other three agree — and a source that was checked and had nothing to say counts as a real result, not a gap. So the output is honest about its own coverage without anyone measuring whether the recommendations are right.
Limits & gaps
  • Not inspectable. File structure and line counts aren't public — this card is built from the skill itself, read internally.
  • No accuracy measurement. Nothing checks whether a recommended term was the right one.
  • No deterministic checker. The decision hierarchy is applied by a model, not enforced.
What to borrow
The idea itself, before any of the mechanics. Nobody else in this report has built one of these. The terminology industry is mature and crowded — Part 5 lists a dozen products that manage and enforce a termbase — but every one of them assumes the words have already been agreed. Deciding what the term should be, and recording why, is the part left to a meeting and a spreadsheet.
  • Filtering out the words that don't need a decision — not treating every single word as a term that's worth fighting over.
  • Ranking the four sources in advance, so a disagreement resolves by rule and not by the agent.
  • Making terminology decisions before the copy exists. Terminology decided during design is a decision; if it's decided after launch, it becomes a migration.

Gemini CLI's string-reviewer skill

A UX-writing review skill inside a shipping Google product · google-gemini/gemini-cli · checked 2026-08-23

Full detail
What it is
A skill that reviews the user-facing strings in Gemini CLI's own codebase. It lives in the product repo at .gemini/skills/string-reviewer/, with a word list and a separate rule set for settings labels in references/.
Built by
The Gemini CLI team at Google, for their own product.
Availability
Public. It sits in the open-source repo, so the skill file, the word list, and the settings rules are all readable.
Where it runs
In a coding agent — Gemini CLI, on the repo it ships in.
What you give it
A request to review text or user-facing strings.
What it does
Finds user-facing strings that are too long, unclear, or inconsistent — inline text, error messages, status updates — and suggests changes. Its instructions state it must not rewrite strings directly without explicit approval.

Selected rules from its checklist, in its own terms:

  • Remove first-person pronouns entirely. Refer to the AI as Gemini and the infrastructure as the system or the CLI.
  • Use the system for execution, Gemini for analysis — doing versus thinking.
  • The verb signal check: use definite verbs (is, will, must) for what the system actually did, and hedged ones (suggests, may, appears) for anything the model came up with — so the user can tell a fact from a guess.
  • The skip test: do the first three words describe the user's intent? If not, rewrite.interesting
  • Goal-first sequence: [To accomplish X] + [do Y].
  • Status updates under five words, and for tasks over three seconds cycle through sub-states ("Parsing logs…" then "Identifying patterns…") rather than a static spinner.
  • Telemetry over etiquette: remove "Please wait", "Thank you", "Certainly"; replace with progress data.
  • Pair every error with exactly one fix — a command, a link, or a suggested prompt such as "Ask Gemini: 'Explain this port error.'" Human-readable explanation before machine error codes.
  • Reserve warnings for destructive or irreversible actions, and every warning must name a corrective action.
  • Use technical metrics (latency, tokens, compute) instead of "speed" or "cost".interesting
How it works
  • It triggers on requests to review text or user-facing strings.
  • It assigns a role first — "Act as a Senior UX Writer" — before applying the checklist.
  • Terminology routes to a separate file. Terms are checked against references/word-list.md. Anything marked "do not use" or "use with caution" gets corrected to the preferred term.
  • One surface has its own rules. If the settings schema file is modified, a distinct rule set from references/settings.md applies instead, so settings labels and descriptions follow their own conventions.

The failure mode to teach: a checklist without the product’s own word list will “pass” copy that uses the wrong product name in perfect grammar. Pair mechanical rules with a glossary, or the review becomes a spelling bee.

Grounding
Its own repo: a project word list, a settings-specific rule file, and the codebase it reviews.
Output format

The format is a numbered list where every item names the principle that was broken, then shows the before and after against it:

1. **{Rationale/Principle Violated}**
  - ❌ "{incorrect phrase}"
  - ✅ `"{corrected phrase}"`

Naming the violated principle on every item is what makes the output auditable — a reviewer can check the call against the rule rather than taking the rewrite on trust. The skill also tells the agent not to write anything outside the list — no intro, no summing up — so the output stays a clean list another tool can read.

Testing
None. Nothing measures whether the checklist is applied the same way twice.
Limits & gaps
  • Scoped to one product's strings. It reviews the repo it ships in, and nothing else.
  • The rules are shaped by a terminal. The five-word status limit and the telemetry rules assume a CLI, not a consumer app.
  • No deterministic checker. Nothing here fails a build — the word list is read by the model, not enforced by a linter.
What to borrow
  • Naming the exact verbs for each situation — definite ones for what the product actually did, hedged ones for what the model worked out — so hedging is a rule rather than a matter of taste.
  • Giving a surface with different conventions its own reference file instead of burying an exception in the main list.
  • Making every suggestion name the rule it came from, so a reviewer can check the call rather than trust the rewrite.

LobeHub's DESIGN.md and layered UX audit

Engineers writing a content spec with closed lists and numeric limits · lobehub/lobe-chat · verified in-tree 2026-08-23

Full detail
What it is
A UX rulebook that lives in the codebase, written for the agent that builds the screens rather than for a designer reviewing them. Three files:
  • DESIGN.mdwhat the interface looks like and says. Design tokens, the component inventory, and a Voice & Content section.
  • A skill called uxwhat it does as the user moves through it. Empty states, loading states, errors, long lists, draft safety, button hierarchy, progressive disclosure.
  • A skill called ux-auditthe reviewer. Checks one finished screen against the other two.
Built by
LobeHub engineers, for their own product. Not content designers.
Availability
Public and readable in full. Both skills ship in two file formats, so they work across more than one coding agent rather than being tied to a single one.

Nothing to install: the files sit in the product repo — DESIGN.md at the root, the skills under .agents/skills/ — so any agent working in that codebase reads them as part of its instructions.

Where it runs
In a coding agent — any one that reads instruction files out of the repo. Not Figma, not a chat window.

The ux skill is marked user-invocable: false. Nobody summons it; the agent loads it on its own whenever the work touches a user-facing feature.

What you give it
For an audit, one screen — a single page or surface. Nothing at all for the ux skill, which the agent loads on its own.
What it does
Sets the wording and behaviour an agent has to follow when it builds a user-facing feature, so the interface stays consistent without a designer reviewing each screen. What makes that possible is the form the rules take: closed lists and numbers, not principles.

From the Voice & Content section, verbatim:

  • A closed term list: "Never alternate synonyms (no 'bot / assistant / AI agent' drift for Agent)," followed by the full canonical list — Workspace, Agent, Group, Context, Memory, Integration, Skill, Topic, Page, Provider, Evaluation, Benchmark, Dataset, Test Case…
  • A closed verb set: "reuse the same verb for the same action everywhere: Create / Connect / Run / Pause / Retry / View details / Clear Memory."
  • "Name actions with a verb and a noun (Create Agent, Delete Session), never a bare Confirm, OK, or Submit."
  • "In-progress states use a present participle with an ellipsis (Generating…, Saving…)."
  • "Confirm outcomes by naming the specific thing that changed; skip 'successfully' and superlatives."
  • "Layered, not split — one main line that is simple and actionable, plus an optional second line… Don't ship 'simple vs pro' variants."

Two rules go further than wording and put numbers on tone.

  • A warmth budget. "Default to 80% information, 20% warmth; at key moments (first run, empty state, long waits, failures, data-loss risk, collaboration conflicts) up to 70/30. Hard cap: at most half a sentence to one sentence of warmth, always followed by a clear next step."interesting
  • A fixed order for sensitive messages. "1. Acknowledge the situation, without judgment. 2. Restore control — pause, replay, edit, undo, clear Memory, view Context. 3. Give the next action."
  • Three named anti-patterns: preachy encouragement ("don't worry"), grand narratives, and over-anthropomorphising ("I understand you").
How it works
One run, in order:
  1. You point it at one screen. A whole-app sweep in a single pass is explicitly out of scope. Nobody invokes the ux skill; the agent loads that by itself whenever the work touches a user-facing feature.
  2. Three kinds of evidence are available to it — the source code (L1), a screenshot of the rendered page (L2), or a click-through of the working product (L3). The code is cheap and always gathered; the other two cost more and get gathered when a finding needs them.
  3. Every claim has to rest on evidence that can actually support it. The skill ships a list pairing each kind of claim with the evidence that settles it — the coverage matrix:
    • "There's no error state." The code is evidence for this.
    • "Send is the most prominent button." The code isn't enough to determine this, so the agent would need a screenshot for better evidence.
    • "The page takes too long to become usable." The code or a screenshot can't answer this. The agent would need to actually click through the product to find out.
  4. Gaps that keep recurring get added to the checklist as new checks, so the review grows out of what it kept missing.interesting
Grounding
  • DESIGN.md — the canonical term list, the verb set, and the numeric tone limits.
  • The ux skill — the rules for states the interface only produces at runtime.
  • A pattern language from outside the company — Jenifer Tidwell's Designing Interfaces, kept in the repo as a catalog the audit is measured against alongside the checklists.
  • The screen under review, at whichever depth the run allows: the code, a screenshot of the render, or a click-through of the live journey.
  • Twenty-five completed audits committed to the repo, as worked examples of what the output should look like.
Output format
A report in four parts, headed by a note of which depths actually ran:
  • Patterns in use — which interface patterns the screen uses, and how well, grouped by family.
  • Strengths worth keeping — an audit that lists only what's broken has turned into a bug report.
  • Gaps, ranked. Each one names the rule it breaks, the depth it was found at, the evidence, and a one-line fix. Three severity tiers: breaks trust, dead-ends the user, or friction.
  • Feedback on the checklists themselves — which of these findings apply beyond this one screen.

Every finding cites its evidence — a file and line number, the screenshot, or the captured measurement. The skill's name for the rule: evidence, not vibes.

Testing
None. Nothing measures whether agents actually follow the spec, or whether two audits of the same screen agree.
Limits & gaps
  • Written for one product. The term list and the verb set are LobeHub's own words, so the method transfers but the contents don't.
  • No deterministic checker. The closed lists are written to be mechanically checkable, but nothing in the repo checks them — an agent reads them and is trusted to comply.
  • Nothing to read means nothing to find. A capability that was never built leaves no code, no failing branch and no button, so a review of the repo can't surface it. Their own example: an audit of the OAuth consent screen reported button-hierarchy and retry gaps, and missed that the screen gives the user no way to switch account.
  • No content designer was involved at any point.
What to borrow
  • Writing the terminology as closed lists — here is the full set of words you may use, rather than a set of words we prefer. A closed list can be checked; a preference can only be argued.
  • Putting a number on tone — a ratio, a hard cap, and a named list of the moments that earn the warmer setting, instead of asking a writer to judge how friendly is too friendly.
  • Pairing each kind of claim with the evidence that can support it — the coverage matrix, which is what stops a reviewer asserting something about the rendered screen on the strength of the code.
  • Filing each rule by what it governs — the words and the visual tokens in one file, the way the screen behaves as someone uses it in the other. A new rule has one obvious home, so the two files never drift into saying the same thing differently.interesting

Intercom's content validation skill

Checks content against the design system while designers prototype · announced on LinkedIn (Feb 2026) · checked Aug 2026

Full detail
What it is
An agent skill that validates content against Surge, Intercom's design system, at the moment a designer is building a prototype.

It exists because Intercom already had a content design agent (VERBI, next card) but it lives in a browser, and designers had moved into Claude Code to prototype — so content feedback was arriving at design review, too late to be anything but rework.

Built by
Russell Norris, Senior Content Designer. He built it using Claude Code itself.
Availability
Internal, but fully described. The files pull from private sources, so they aren't published — the structure below comes from the announcement and his replies to five commenters. No article about it exists yet.

How it reaches other designers isn't stated. A shared repo, a plugin, or copied folders are all possible; what's known from the format is that a skill is a folder of markdown files with no server behind it, so distributing it means getting those files where each designer's agent already looks.

Where it runs
In a coding agent — any one that reads skills from the project. Invoked by slash command or by asking for it in plain language.
What you give it
Four kinds of input:
  • Code you're prototyping — reviewed inline as you build.
  • A screenshot of a design — it reads the UI and validates.
  • A Figma URL — fetched via the API; it checks every text layer.
  • Raw text — a quick spot check.
What it does
  • Foundational rules from Surge: punctuation, capitalisation, character limits, text patterns.
  • Per-component rules: accordions, buttons, badges, labels.
  • Voice and tone.
  • Feature-name conflicts — catches a name that clashes with an existing feature.
  • User research, pulled in when relevant.
How it works
Three steps, in order:
  • Extract the content out of whatever was handed over — code, screenshot, Figma file, or pasted text.
  • Identify the component each string belongs to — is this a button label, an accordion header, a badge?
  • Check that component's rules, not the general ones.

A real rule set, from the skill's validation-workflow.md, for buttons:

Verb-led
  Start with an action word
Max 4 words
  Scannability across languages
Action-oriented
  Describe what happens when clicked
No period

Every rule carries its reason in the same line, so the skill can explain a flag rather than only raise one.interesting

Two more mechanics, both given in reply to a direct challenge that agents tend to ignore parts of a skill:

  • A strict checklist the skill must follow — an ordered list to work through, not prose describing good practice.
  • Every source file is tagged with when to read italways read first, read per component, search when needed, or suggest. Without a tag, the agent decides for itself whether a document is worth opening, and a document it isn't sure about is one it skips.

Size: about 1,000 lines of markdown across 5 files, of which only the main SKILL.md (about 120 lines) loads on activation; the rest are pulled in on demand. He reached that size by asking Claude to optimise the skill's own spec, which trimmed it 70% without changing behaviour.

Grounding
Surge, the design system — foundational rules, per-component rules, voice and tone — plus the product's feature names and user research. It reads them from the repo on every run rather than being trained on them, so when the design system changes the guidance changes with it.
Testing
None described.
Reported results
Validation happens during prototyping instead of at review. Designers catch issues before design review — and pick up the guidelines by using the tool. No figures given.
Limits & gaps
  • Internal and unreleasable as-is, so nothing here can be inspected. His guidance for replicating it: document your guidelines, then write a SKILL.md telling the agent to validate against them.
  • Only the author's account exists. No article, no repo, no third-party report.
  • No deterministic checker. Character limits and punctuation rules are the kind a linter could enforce; here a model reads them.
What to borrow
  • Validate against the design system while someone is still prototyping, not only in a late content review. Catching hierarchy and missing states early is cheaper than rewriting a polished screen.
  • Accept more than one input shape — code, screenshot, or Figma text — so the same standard shows up wherever the draft lives.
  • Use the tool as a teacher of the guidelines, not only as a gate. If designers learn the standard by seeing it applied, you spend less time restating it in critiques.

Intercom VERBI

The chat-based content design agent that came first · build writeup (2025) · walkthrough video (May 2026)

Full detail
What it is
A chat assistant that answers content questions, drafts copy, critiques, and names things — grounded in Intercom's style guide, glossaries, research, and design system.

It exists because the requests never stopped — review this flow, rewrite this screen, name this feature — and there were always more of them than one person could answer.

Built by
Russell Norris, Senior Content Designer — one content designer supporting multiple product teams.
Availability
Internal, but the most thoroughly documented build in this report. A companion walkthrough video was published with Glean (~May 2026).
Where it runs
A chat interface built on Glean, the company-wide enterprise search platform, using its Agents feature. Glean is not a design or prototyping tool — it is where all internal documents are searchable, which is why it was chosen.

Why not the obvious alternatives: Gemini's custom Gems couldn't be shared with other people, so a tool only one person can use doesn't scale a team. ChatGPT was customisable but only with static files — it couldn't point at live URLs, so every style-guide change would mean re-uploading.

What you give it
One of a defined set of task prompts: Can you write this? · Can you edit this? · Can you review this? · Can you name this? · Give me options · Give me guidance · Give me strategy · Give me research.
What it does
Answers a content question, drafts or edits copy, critiques a screen, or proposes a name — from the approved sources and nothing else.
How it works
The system prompt establishes six things:
  • Role — a content designer supporting product designers.
  • Employer — Intercom, and its products.
  • Resources — the sources it is allowed to draw on.
  • Tone — the voice to answer in.
  • UI components — must follow the design system's guidelines only.
  • Use cases — the tasks it handles.

From there it retrieves from the curated collection and answers in chat.

Three guardrails sit in that same system prompt, so they apply on every response rather than at a separate review step:

  1. Against flattery — inform, challenge, and assist; never placate; don't agree by default; if something's wrong, say so.
  2. Against invention — if the answer isn't in the resources, say you don't know; don't guess and don't answer from general knowledge.
  3. Against padding — keep answers short; cut the fluff; skip social niceties; only go long if asked.

Together they describe a content partner who pushes back, admits ignorance, and doesn't waffle.

Grounding
A curated collection of approved sources, and nothing else:
  • The style guide, including a list of the rules broken most often.
  • Tone of voice guidance.
  • The product glossary — hundreds of feature names.
  • The monetization glossary — pricing and plan naming.
  • Product marketing messaging guides.
  • Research insights.
  • Surge, the design system. It lives in Storybook, which is served to Glean through Glean's Indexing API — so component guidance is read live and never goes stale. This is what lets the agent answer something as specific as the correct date format for Japan.
  • Two public Intercom sites.
Testing
Informal, and it changed the build. Testing showed the agent was accurate most of the time but would occasionally give incorrect advice or bend rules — which is why the three guardrails were added to the system prompt. No figures, no held-out set, and no measurement after the fix.
Reported results
700+ uses within a few months. Content rules enforced without manual policing; first drafts checked across teams; naming and style staying consistent. No work is presented with "copy TBD" anymore, and everything shipped is still reviewed by humans.
Limits & gaps
  • The system prompt needs periodic tune-ups as the business changes. He describes this as minor upkeep.
  • You have to go to it. VERBI is a place you open in a browser, so it only helps when someone remembers to ask. That is the gap the validation skill in the previous card was built to close.
  • The two tools share a corpus but are not interchangeable. Answering questions on demand and checking work in progress turned out to need two different products.
  • Only the author's account exists. Internal, so nothing here can be inspected.
What to borrow
  • Put the guardrails in the system prompt, not in a separate review step, so they apply to every answer.
  • Get the live source indexed instead of maintaining a copy of it. Serving Storybook to Glean through the Indexing API is what makes the component guidance read live rather than pasted into a document and re-pasted after every change.interesting

PayFit's content-design assistant

A routing-first RAGInstead of hoping the model knows your rules, you store them in a searchable corpus, fetch the few passages relevant to the current task, and paste them into the prompt at generation time. The model writes with your rules in front of it. assistant for terminology and drafting help · build writeup (July 2025)

Full detail
What it is
A chat assistant, built on the Dust platform, that content designers and non-writers query for terminology guidance, feedback, and drafting help.
Built by
Élodie Veysseyre, Staff Content Designer — one of two content designers supporting the whole product org.
Availability
Internal. Described in a public step-by-step writeup; the app itself isn't published.
Where it runs
Dust — chosen because the company had already adopted it org-wide, not after a technical evaluation of alternatives. A standalone chat surface; not yet embedded in Slack or Figma.
What you give it
A terminology question, a piece of copy to review, or a drafting request.
What it does
Three things: answers a terminology question, gives feedback on a piece of copy, or drafts a new one — each from the company's own style guides and glossary rather than from the model's general knowledge.
How it works
  • It classifies the question before retrieving. It works out the question type first, then searches only the part of the documentation that matches it rather than the whole corpus. Built with Dust's "Tools" feature — each use case listed against its knowledge base, the documentation labelled clearly ("Terminology," "Email guidelines"), and the routing logic in the instructions.
  • Temperature set deliberately low — 0.2, labeled "Factual" — after starting at 1.0 and getting "a flood of hallucinations."
  • The model was chosen separately from the retrieval design, on output quality: ChatGPT → Claude Sonnet → Claude 4.
  • It is instructed to admit ignorance when retrieval finds no confident match:
    If you don't find the information in your database:
    → say that you don't know
    → don't guess and don't give answers based on general knowledge
    The writeup is explicit that this reduces hallucinations rather than eliminating them.
Grounding
Style guides with channel variants (email, help docs, internal), a glossary across three languages, voice and tone maps, and content templates.
Testing
None as a framework, but they did measure the temperature change according to the volume of hallucinations before and after.
Reported results
No numbers. Active-user counts and an internal usage leaderboard are mentioned as tracked, but no figures are given.
Limits & gaps
  • Standalone in Dust, not yet integrated into where the work happens — so it only helps when someone goes to it.
  • Only the author's account exists, and it's from 2025 — so parts of it may be out of date.
  • No deterministic checker. Everything rests on retrieval plus a low temperature.
What to borrow
  • Classify the question before retrieving, rather than searching the whole corpus every time.
  • Cover the basics before you polish anything. Her advice on what to write first is to "start with the most key documents," which "already solved most cases" — and not to "necessarily aim for pitch-perfect documentation, but at least cover all the basics the AI will need."
  • Decide what you are building before you tune it. A temperature of 0.2 reads as the wrong setting for anything to do with writing — until you accept what the thing actually is: "You're not training a Content designer, you're training an assistant that can focus on the guidelines and make sure to apply them."

Atlassian Content Assistant

Drafting and standards on request, in Slack · build writeup (June 2026)

Full detail
What it is
An agent that drafts short-form UX copy and surfaces content standards on request, built into the tools people already use. Part of what Atlassian calls an AI-native content system.

The problem it was built against: too many content surfaces, not enough governance, and quality dropping in teams with no content designer — plus the plain time cost of routine copy and release notes.

Built by
Atlassian's content design team, on Rovo — Atlassian's own AI platform.

The writeup is by three content designers: Tim Pike, Ann Henley, and Aaron Ruby.

Availability
Internal. The architecture and the metrics are published, but the agent, the prompts, and the context stores are not.
Where it runs
Three agents in three places:
  • Content Assistant in Slack — general drafting and review.
  • A Release Notes agent in Jira Service Management — where release work already happens. This one carries the 88% figure.
  • A Brief Builder for PMs — structures a documentation request so the content nearly writes itself, fixing the input rather than the output.interesting
What you give it
A Slack message starting with !content — the trigger word that summons the agent in the channel, the way a slash command works elsewhere.

Every request needs to include:

  • The copy itself, pasted in, when the ask is a review.
  • A description of the surface and situation — which component, which screen, who is reading it — when the ask is a draft.

Real examples from the writeup:

  • !content can you review this message: "Authentication was successfully completed…"
  • !content I need text for an info toast message that appears when you click on a data insights card…
  • !content write a tooltip to explain what headcount used is to a user…

Users include engineers, PMs, and marketing — not only designers.

What it does
Drafts the copy or reviews what you paste in, against the company's own standards rather than the model's defaults — and hands back the reasoning alongside the answer.
How it works
Five steps per request:
  1. Work out the intent and which standards are needed. Their example: a success-message request needs the structural and writing guidelines for success messages, plus the product glossary.
  2. Read those guidelines and apply them.
  3. Draft the copy.
  4. Prepare the draft with a rationale — which sources and guidelines it used.
  5. Run a quality check on its own output, then reply.

Step 1 is the part that makes this more than a prompt: the standards it fetches are held as what Atlassian calls context stores — content standards structured so a model can read and apply them, rather than a style-guide PDF.

Grounding
The context stores — content standards, guidelines, and product knowledge restructured so a model can read and apply them.

Where the stores physically live isn't stated. Rovo reads across Jira, Confluence, Slack, and the rest of Atlassian's tools, so the standards sit in the documents those tools already hold.

Their warning is the practical core of it, and it applies to any grounding corpus:

  • Stale standards cost you time. If the guidance hasn't been updated since 2023, teams spend longer editing the output than they saved.
  • Undocumented standards cause hallucination. If the source of truth is buried in a Slack thread, the agent invents one.
Output format
A draft, and with it the rationale — which sources and guidelines it used to get there.

The rationale is produced first, before the draft. They report that ordering it that way improved the quality of the answers, not only their auditability.interesting

Testing
No accuracy measurement published. What they have instead is a review process and a feedback loop.
  • Work is routed by risk into low, medium, and high-touch human review lanes, rather than everything getting the same read. Their reasoning: a minor release note and a pricing flow carry fundamentally different risk.
  • A human edit counts as data. "Every AI-generated draft that gets edited by a human is a signal. We wire those back into the system so that it gets smarter, not just faster."interesting Efficiency and quality metrics are tracked on a dashboard.

So the loop is real. What is missing is a baseline — nothing establishes whether the output was right to begin with.

Reported results
  • 1,500+ requests through the Content Review Desk in under 9 months
  • Drafting time down from a couple of hours to about 15 minutes
  • Release notes production time down 88%
  • 700+ hours returned to content designers
  • Hundreds of monthly users

All of these are time and volume figures. None of them is a quality measurement.

Limits & gaps
  • The review rubric isn't published. The criteria that sort a request into low versus high-touch review are missing, as is who staffs each lane — and that rubric is what decides whether the model saves time or just moves it.
  • The writeup reports only successes. No failure modes and no course corrections.
  • Internal. Only the authors' account exists; nothing can be inspected.
What to borrow
  • Make the agent give its reasoning before its answer, rather than after. Atlassian found it improved the copy itself, rather than only making the tool easier to check.
  • Name the standards it used in the reply, so a writer can argue with a specific guide instead of with “the AI.”
  • Put the assistant in the tools people already open (here, Slack). A perfect content bot nobody switches to is not a system.

Atlassian Design System agent tool serverAn open protocol that lets an AI agent call external tools and data sources — "USB for agents." An MCP server exposes named tools (e.g., check_text, search_strings) with typed inputs; any MCP-compatible agent can discover and call them.

A design system that serves its own UX-writing rules as a callable agent tool · build writeup (2026) · endpoint probed Aug 2026

Full detail
What it is
A tool server that hands agents the Atlassian Design System on request — components, tokens, lint rules, accessibility requirements, and the design system's UX-writing guidance.

The writing rules travel through the same pipeline as the component metadata, so the call that tells an agent a component's props can also tell it how to word that component's copy.

It only covers the design system, and it says so. Atlassian's company-wide content standards sit in a separate internal store the tool tells the agent to fetch as well — so a full content answer is meant to come from two sources, not this one. Detail in Grounding.

Built by
Atlassian's design-system team. The byline spans four disciplines:
  • Eleni Misthos — Senior Developer Content Designer.
  • Kylor Hall — Principal Prompt Engineer.
  • Farid Sabitov — Lead Design Technologist.
  • Julian Fleetwood — Lead Content Designer.
Availability
The agent tool server is public — anyone can call it, no account needed. The schemas behind it aren't published, and the companion agent skill is Atlassian-only.

Four ways in:

  • The hosted URL — point any agent-tools client at it.
  • An npm package@atlaskit/ads-mcp, run locally.
  • An internal agent skillatlassian-design-system, published with @atlassian/skills, Atlassian-only. It bundles progressive-disclosure guidance for tokens and components with agent-oriented workflows, generated from the same source.
  • Flat files — the content guidance also ships as llms-content.txt, ~29 KB of markdown, for anything that can't call a tool.
Where it runs
In a coding agent — any agent-tools client.
  • Hosted: https://mcp.atlassian.com/v1/ads/public/mcp over HTTP.
  • Local: npx -y @atlaskit/ads-mcp.

It was also wired into the design system's help channel in Slack, so the same tools answer questions there.

What you give it
A normal request, in your own words. You don't call the tool yourself.

You ask the agent for something — "write the empty state for this screen," "check this error message" — and the agent decides the design system's guidelines are relevant, picks its own search terms, and makes the call. Then it writes with the returned rules in context.

What it does
One of its 16 tools carries content: ads_get_guidelines. The other 15 are for building UI — component and token search, lint rules, migrations, accessibility.

What that tool covers, from its own description:

"Content & UX writing: messaging types (empty state, error, success, warning, info, feature discovery), voice and tone, inclusive language, grammar and style, date/time copy handoff, vocabulary pointers."ads_get_guidelines, tool description, retrieved from the live server 2026-08-24

Its stated use cases include "writing or reviewing user-facing copy."

What comes back. Asked for empty state, voice and tone, and error message, it returns roughly 22 KB of markdown — per-surface rules, not principles:

  • "Limit your CTA to one or two words."
  • "Write in sentence case and don't use punctuation unless it's a question."
  • "Keep messages one to two sentences long."
  • "Use imperative verbs such as 'Try', 'Remove', or 'Create' … instead of vague terms such as 'OK'."
How it works
Retrieval, not judgment. Three things happen inside ads_get_guidelines:
  • It fuzzy-matches the agent's terms against guideline keywords and body text, so "empty state" finds the empty-state page without an exact title match.
  • It returns concatenated markdown for the matches — the guidance itself, not a summary of it.
  • It never looks at your copy. Nothing is checked, scored, or flagged. The agent gets the rules and is responsible for applying them.
Grounding
Two knowledge sources, and the tool is explicit that it is only one of them.
  • The design system's own schemas — this server. Every answer is generated from them rather than retrieved from prose docs, which is why component guidance can't go stale.
  • Atlassian's company-wide content standards — held in an internal store the tool tells the agent to fetch separately, by calling get_content_standards_docs on Atlassian's internal Context Engine server.
"When working with content, use this tool alongside the Context Engine agent-tools tool get_content_standards_docs for Atlassian-wide content standards (CDSTD/BAIT-style org guidance); this tool supplies ADS-specific foundations."ads_get_guidelines, tool description, retrieved from the live server 2026-08-24

So a full content answer is meant to come from both sources: company-wide voice, terminology, and editorial rules from the internal store, and how those apply to a specific component from here.

How it is generated
Every part of the design system gets a schema — a TypeScript file that describes it. A component's schema captures its usage, code examples, props, content standards, and accessibility requirements. Icons, tokens, lint rules, and foundations pages each get one too.

Those schema files live in the design system's own repository, next to the source code of the components they describe. So a component and the rules for using it are edited in the same place, by the same people, in the same change.

From that single source they generate "content for the ADS agent tool server, the design system skill, DESIGN.md files, and whatever other formats we need in the future."

Writing the rules once and generating every agent format from them is what stops the agent tool server, the skill, and the DESIGN.md files disagreeing with each other.

Testing
Measured, but not on the content. Every published number is about code output — see Reported results. Nothing tests whether the guidance improves the copy an agent writes, and nothing checks a string against the rules at all.
Reported results
Coding agents doing Atlassian-design-system tasks with this server, compared against agents with no agent tool server at all:
  • 4.9% more accurate code.
  • 11% fewer errors.
  • 26% fewer tool calls.
  • 34% faster task completion.
  • 16% fewer tokens consumed.
Limits & gaps
  • Content is retrieval-only. A tool hands the agent the rules; nothing checks a string against them. ads_get_lint_rules returns ESLint rules for code, not copy.
  • Half the grounding can't be inspected. The company-wide content standards this tool defers to sit on an internal server, with no public documentation or endpoint.
  • A separate "52% accuracy improvement" is claimed for unnamed "specific queries," which isn't checkable.
  • Its relationship to the Content Assistant is undocumented. Neither writeup mentions the other. They serve different people — one is a Slack agent you go to and ask, the other a tool an agent calls while building — and both draw on company-wide content standards restructured for machines, but whether that is the same corpus is not disclosed.
What to borrow
  • Serve content guidance as a tool call, not only a document. A file has to be found and fetched; a tool gets called mid-task, with terms the agent chose.
  • Generate every agent format from one source — agent tool server, skill, and DESIGN.md from the same definitions, so they can't drift apart.
  • Put routing rules in the tool description. When to call it, and when not to. The agent reads that before it reads your content, so it decides what to fetch.
  • Say what you don't cover, and where it lives instead. Declaring "this covers the design system; company-wide standards are over there" keeps two teams from duplicating each other's rules, and stops an agent treating a component note as the whole editorial standard.

Intuit's content quality plugin

A plugin of skills sharing one set of standards, on an internal marketplace · build writeup · their public AI content guidance · writeup Aug 2026

Full detail
What it is
Intuit's content design standards packaged as an installable plugin of Claude skills, so anyone generating content gets the standards applied automatically.

Two things prompted it. Research found designers were prompting 30–50 times to design a single workflow with AI, iterating on structure and visuals before content came up at all. And content design roles had shrunk across the industry, leaving PMs, engineers, and product designers writing copy with no content partner.

Their diagnosis of why the existing guidelines went unused: people weren't applying them because they didn't know how to evaluate what quality, on-brand content looks like.

Built by
Intuit's content systems team. The account is Sarah Mohs's, written from inside the work, with Eva Ratcliffe, Patricia Swesey, and Julia Falkowski credited as contributors.
Availability
Internal plugin, public method. The skills aren't published, but the architecture is described in detail, and their public AI content guidance is readable.

Inside the company it ships through a central AI skill directory where employees register, find, and install validated skills — and updates push automatically to everyone who has one installed, which is what stops the standards drifting between teams.

Where it runs
In a coding agent. Also wired into pull-request review agents and frontend development workflows. Installed from Intuit's internal AI skill directory.
What you give it
Content to check, or a request to generate it — in whatever the agent is already working on.
What it does
Checks and generates content against Intuit's own content standards rather than the model's general sense of good writing.

Their before-and-after on the same toast message:

  • Plain Claude rated the message compliant and suggested no changes.
  • With the plugin enabled, it loaded the right reference files, flagged the issues, and suggested the correct pattern from their confirmation guidelines.
How it works
  • One skill holds the standards; the rest read from it. Everything about what "good" looks like lives in that one place, and a request routes automatically to whichever specialized skill fits — which then reads the shared references rather than carrying its own copy to drift out of step. Their stated reasons for that shape: retrieval accuracy, token usage, and management overhead.
  • A skill loads the reference files for the surface in question, then checks the content against those specific standards rather than general best practice.
  • The structure was designed, not accepted. They mapped several possible shapes in FigJam before committing, deliberately rather than simply taking the model's recommendation.
Grounding
Their existing content design system — the same standards published in prose, restructured as reference files a skill can load.
Testing
A hand audit of the skill set. A team member went through the whole set looking for three things:
  • Overlaps between skills.
  • Inconsistencies between them.
  • Places where two skills were competing to trigger on the same conditions.

She then rewrote the skill descriptions based on user research — the trigger language had to match the words designers actually use, not the words the system uses.

That audits the system's structure. Nothing measures whether its content judgments are right.

Reported results
Second-most-installed plugin in their internal marketplace within 24 hours. Reported user behavior: one person wired it into their own PR review agent unprompted; another described the model asking whether they really wanted to do something against the style guide.
Limits & gaps
  • Their own stated limit: the plugin scales their system, but it doesn't scale craft.
  • Not public: the skill files, and the list of specialized skills.
What to borrow
  • Keep the standards in one skill and have the others read from it, rather than giving every skill its own copy to drift out of step.
  • Audit your skill set for competing descriptions. Two skills triggering on the same request is a failure mode that stays invisible until someone looks for it.
  • Write the trigger words people actually say, taken from research rather than from your own vocabulary.

SmartHR's house-style preset

A company's own content guidelines published as an installable package · kufu/textlint-rule-preset-smarthr · MIT · v1.37 · checked Aug 2026

Full detail
What it is
SmartHR's UX content guidelines, published as a rule pack you install with a package manager rather than a document you read. It is a rule pack for textlint, a linter for natural language.

The reasoning behind the format: a style guide living in a wiki doesn't get applied. Shipping it as a dependency makes it versioned, updatable, and enforceable at the point where work gets merged.

Built by
SmartHR, a Japanese HR software company, on the GitHub org kufu.

Their stated design principle translates as "design starts from words."

Availability
Public on npm and GitHub, MIT licensed. Semantic versioning past v1.37 with a changelog — the release discipline engineers use for a library, applied to a style guide, so a team can pin a version and review a diff before upgrading.
Where it runs
Wherever textlint runs — command line, a build check, or an editor — plus a companion Slack bot that lints and fixes documents in chat.
What it does
Enforces SmartHR's own writing rules, and carries a dictionary of house terminology alongside them — so the package holds both the style rules and the approved words.
How it works

Install it as a dependency and name the preset in the textlint config. Every rule in the pack then runs on whatever files textlint is pointed at, alongside any other presets in the same config.

The architecture lesson is why the format matters more than any single rule:

  1. Someone changes a house term — the package gets a new version, with a changelog entry.
  2. A product team pins or upgrades the same way they would a library, after reading the diff.
  3. The check runs where the merge happens — command line, build, or editor — so the style guide is not a wiki page someone meant to open later.

That is the failure mode it is designed against: a beautiful guideline that nobody applies because it lives in the wrong place. Shipping the guide as software does not make the rules wiser; it makes them present.

Grounding
SmartHR's own writing rules plus the house terminology dictionary, both shipped inside the package. No corpus and no model.
Output format
Standard textlint output — location, rule, and message. Same as the textlint AI-writing preset.
Testing
None published. Deterministic, like any textlint pack, but nothing measures whether the rule set is the right one.
Limits & gaps
  • Japanese only, and specific to SmartHR's house style.
  • 120 stars against the AI-writing preset's 1,100 — a company's own rules are useful mainly to that company.
  • The rules are UI-writing rules, but the checker can't tell where the text will appear. textlint reads text — .txt and .md by default, HTML with a plugin, and in principle a strings file if someone writes a processor for it. What it never gets is the knowledge that this string is a button label with twenty characters of room, so a character limit or a per-component rule can't be expressed in the pack at all.
  • No English equivalent exists. No company in this report publishes its UX content guidelines as an installable, versioned package.
What to borrow
  • Publish the house style as a versioned package, not a document. This is the clearest example in the report of treating content standards as software — with releases, diffs, and a version number a team can pin.
  • Keep the terminology dictionary in the same package as the rules, so the words and the style ship together.

ux-writing-skill

Published UX writing doctrine as an installable skill · GitHub · MIT · v1.6, active 2026 · 152 stars · ~1,500 installs

Full detail
What it is
An agent skill that reviews and writes interface copy against a four-standard framework, with example banks for each UI surface.

Its framing: content quality doesn't scale when one person reviews everything, so catch the 80% of issues that are obvious and let a human spend time on the 20% that needs expertise.

Built by
Christopher Greer, Staff Content Designer at Stripe. A personal project, not a Stripe product.
Availability
Public. Every file is readable. Install with npx skills add, clone it, or upload the built zip.

A build workflow rebuilds an installable zip on every change, and the repo is versioned like software.

Where it runs
In a coding agent. It triggers on its own when a request matches — no slash command needed, though $ux-writing and @ux-writing work for explicit invocation.
What you give it
Any interface copy — or a Figma frame link, via the included Figma agent-tools integration guide.
What it does
Judges copy against four standards — Purposeful, Concise, Conversational, Clear — and returns specific improvements, with accessibility guidance and tone adapted to the situation.

Tone example for a frustrated user: "Payment failed. Your card was declined. Try a different payment method." against the poor version, "Error 403."

How it works
  • It loads itself. Nobody has to summon it — the frontmatter description is deliberately long, naming every surface it covers (buttons, labels, errors, notifications, forms, onboarding, empty states, success messages, help text) and every verb (writing, editing, auditing, reviewing), so a matching request pulls it in.
  • It checks one standard per pass — four passes over the copy, in this order, each with a definition it checks against:
    • Purposeful — it helps the user or the business reach a goal.
    • Concise — every word has a job.
    • Conversational — write how you speak.
    • Clear — plain language.
  • Reading level is set by who is reading — 7th grade for general audiences, 10th for professional ones.
  • Length is capped per surface, with its own sentence-length and character-count targets depending on where the string sits.
  • Active voice is a proportion, not an absolute — about 85% of the time, rather than a rule with no exceptions.interesting
  • A small entry file, the rest on demand. SKILL.md holds the framework and the patterns; an accessibility guide, a usability checklist, the detailed patterns and a voice-chart template sit in references/ and load only when needed.
  • Templates and worked examples ship with it — fill-in templates for error messages, empty states and onboarding, plus before-and-after pairs with analysis and scoring.
  • No code anywhere. Everything it does, it does in prose.
Grounding
Published UX writing methodology — Sarah Richards, Torrey Podmajersky — encoded rather than invented, which is why it works without company-specific context. No house style, no glossary.
Testing
No accuracy measurement published. It does ship before/after examples with scoring, which are the raw material for an eval — but nothing runs them as one.
Reported results
152 GitHub stars, roughly 1,500 installs, and the most-engaged practitioner launch post in the niche.
Limits & gaps
  • Generic by design. It carries published doctrine, not your house style, so it won't know your terminology or your components.
  • No deterministic checker. The testable numbers — 85% active voice, a reading-level target — are the kind a script could measure, and nothing does.
What to borrow
  • Before/after pairs as the doctrine format. They teach a model, anchor a judge, and double as eval cases — one authoring effort, three uses.
  • Turn a framework into a sequence of steps rather than a list somebody has to remember. A list gets skimmed and half-applied, whereas steps in a fixed order get worked through.
  • Put testable numbers in the guidance, so the advice can be checked rather than only agreed with. For example, "keep sentences short" becomes "under 30 words", which is something a script can count and a reviewer cannot argue with. You can also say "~30 words" if you don't want it to be too specific.

ux-writing-1

A fine-tuned model for UI copy review, with its training and eval pipeline · model card · repo · Apache-2.0 · published June 2026

Full detail
What it is
A model you can run yourself that reviews UI copy and hands back three things per string: a rewrite, the reason for it, and a risk rating. The output is structured data, so a script can act on it.interesting

The whole pipeline that produced the model is published alongside it.

Why build one at all: reviewing copy at volume through a frontier API is expensive, and a general model doesn't know your standards. A small tuned model can run cheaply, locally if needed.

Built by
Christopher Greer, at a hackathon.
Availability
Public. Model weights, LoRA adapter, a quantized build for laptops, training scripts, the eval harness, and cost notes are all published. The raw training data is private; the schema and generation scripts are not.

Four Hugging Face artifacts, all Apache-2.0: the merged weights (gr33r/ux-writing-1), the standalone LoRA adapter (-lora), a quantized GGUF build for laptops (-GGUF), and a copy of the adapter under the build-small-hackathon org it was made for. Adapting it to your own voice: 100–500 pairs, about $2–6, via a single command, documented in a fine-tuning guide.

Where it runs
On your own hardware. Unlike everything else in this report, this isn't a file an agent reads — it's a model, so someone has to run it. At 27 billion parameters that means a machine with a serious GPU, or a hosting service you rent by the hour. A shrunk-down build they also publish runs on a laptop.
What you give it
A UI string with its context. A bundled CLI can also walk a whole codebase (JS, JSX, TS, TSX, Vue, Svelte, HTML, JSON) and pull out copy candidates with file, line, and surrounding context as JSONL.
What it does
Reviews one UI string at a time and proposes a better version, with its reasoning and a sense of how risky the change is.
How it works
  • It starts from an off-the-shelf model — Qwen3.6-27B — and adapts it rather than training from scratch. The method (QLoRA, 4-bit) tunes a small set of added weights instead of rebuilding the model, which is why the whole thing runs on a hackathon budget.
  • It learns from about 1,400 rewrite pairs — buttons, errors, labels, confirmations — plus permissively licensed real microcopy.
  • Roughly 20% of those examples say "already good, change nothing." That is what teaches restraint, rather than a model that rewrites everything put in front of it.
  • No string appears in both training and test. The splits were deduplicated, so the evaluation isn't scoring it on what it memorised.
  • He trained it twice and kept the two runsOne complete pass of the training process, producing one version of the model. Change something about the data or the settings and you run it again, which gives you a second version to compare against the first. apart on purpose — one learned from text alone, the other from text plus screenshots — so it stays possible to say whether the screenshots helped. So far only the text-only version has been released.
Grounding
One source of policy. The four quality standards live as a single Python constant, and that constant serves three jobs at once:
  • The training system prompt.
  • The rubric the dataset was built against.
  • The eval's ground truth.

One definition of "good," three consumers, no drift.

Two rules inside it:

  • The model is explicitly permitted to return copy unchanged and say so.
  • Safety-critical copy — destructive actions, payments, privacy, security — must keep its consequence and must not be softened.
Output format
Three fields per string, returned as structured data so a script can act on them:
  • The rewrite.
  • The reason for it.
  • A risk rating, tagged against a fixed eight-key list: generic action, vague error, blame language, missing context, inaccessible link, high-stakes ambiguity, wordy copy, terminology drift.

The fixed taxonomy is what makes the output countable. You can ask which failure your product has most of, which a free-text explanation could never answer.

The format is also enforced during evaluation: a response that isn't valid structured data with an actual rewrite in it scores zero rather than being skipped. Malformed output is treated as a wrong answer, not a missing one.

Testing

How the author checked whether the tuned model was actually better than the one he started from — keep this as the headline measurement story:

  • A test set of 90 strings, written by hand, none of which the model had seen during training.
  • A blind comparison. Both models rewrote each string, and the reviewer judged the two answers without knowing which came from which. Sides were shuffled.
  • The result: the tuned model won 65 of 78 comparisons where the reviewer had a preference (83%), and won every one of the nine inline-error cases.
  • Malformed answers score zero. If a model returns something that isn't valid structured data with an actual rewrite in it, that case counts as a loss rather than being dropped from the count — which would have flattered whichever model failed more often.
  • A stated bar for shipping: at least 60% preference across at least 30 decisive comparisons, and no regression on the safety-critical categories.

The same two models were also scored automatically, and those scores came out almost identical — 0.928 for the tuned model against 0.917 for the base, a gap too small to mean anything. It is printed on the model card.

So the automatic metric could not see a quality difference that humans picked 83% of the time. Anyone who had trusted the score alone would have concluded the fine-tune did nothing.

Measurement as a practice, not a lab moment. A June 2026 writeup adds colour around owning the fine-tuned model: running large batches of strings at a known cost, and comparing outputs in a public arena-style setting. The preference test remains the quality headline; the cost and comparison work shows why someone would keep measuring after the first win — so readers see evaluation as ongoing, not a single screenshot of 83%.

Reported results
Barely distributed. Checked 24 Aug 2026: the laptop build has 39 downloads and the full model 6. It came out of a hackathon and hasn't been promoted anywhere, so the numbers say more about reach than about the model.

One efficiency claim alongside the quality result: the tuned model returns about half the output tokens of the base model for an answer of equivalent quality — a smaller model that is also less verbose per call. Pair that with the batch-cost notes from the later writeup if you are arguing for a fine-tune budget: quality preference and cost-per-string are different slides of the same practice.

Limits & gaps
  • Hugging Face lists it under image-text-to-text, a tag inherited from the vision-capable base model. The released fine-tune was trained on text only, so the label does not describe what it does.
  • English-centric.
  • Scoped to short-form product UI copy, not long-form.
  • A reviewer's assistant, not an authority — its author's own framing.
  • It can over-specify on vague, context-free input.
  • Never auto-apply. Output is explicitly for human review, especially for destructive, payment, privacy, or security copy.
What to borrow
The way he tested it, whether or not you ever train a model:
  • Write your test cases by hand, and keep them out of everything else.
  • Judge blind. Don't let the reviewer know which system produced which answer.
  • Count only the comparisons where the reviewer had a real preference.
  • Decide the passing number before you look at the results.
  • Don't let an automatic score be the verdict. Here it reported no real difference where human reviewers picked one 83% of the time. The closer a question gets to whether the writing is actually better, the less a score can see.interesting

The i18n content hookA script the agent harness runs automatically on an event — before a file edit (PreToolUse), after the agent finishes (Stop). Hooks fire deterministically, every time; skills fire only when the model decides to load them. Exit codes let a hook block an action or force the agent to keep fixing.

Content rules that fire automatically on every string edit · writeup (August 2026)

Full detail
What it is
A three-part setup whose load-bearing piece is a hook: a script that runs automatically whenever an agent edits a translation file, checking the string before the change lands.

Why a hook rather than a skill: a skill fires only when the model decides to load it, so anything that has to hold every time can't depend on the model choosing to check.

Built by
Charalampos Elpasidis, a practitioner writing up his own setup.
Availability
Described, not published. No repo — but simple enough to rebuild from the article.
Where it runs
In a coding agent — Claude Code specifically, since it depends on that harness's hook system. The hook is registered in .claude/settings.json against file-edit tools, scoped by a matcher to paths under i18n/**.
What it does
Three parts:
  1. A skill that rewrites technical error strings into human language.
  2. A background agent that audits existing strings across the codebase using file search.
  3. A PreToolUse hook — the part that fires every time, and the reason the setup works at all.
How it works
When an agent tries to edit a string file, the hook receives the pending change, runs nine checks, and blocks the edit with an explanatory error if any fail. The agent reads the failure and fixes the string.interesting

The nine rules, all mechanical on purpose: 25 words maximum; plain language, no jargon; actionable where applicable; no exclamation marks; no banned words (please, invalid, disabled, oops); sentence case; Oxford commas.

Judgment stays with the skill and the human; only the mechanical rules go in the hook.

Grounding
The nine rules, written into the hook script. No style guide, no glossary, no corpus.
Output format
A blocked edit carrying an explanatory error, which the agent then has to satisfy. No report and no findings list.
Testing
None — though the checks are mechanical, so a given string either passes or doesn't. Nothing measures whether the nine rules are the right nine.
Limits & gaps
  • It only covers edits made through the agent — author-stated. A manual edit outside that flow passes unchecked, which is what a build check is for.
  • Nine mechanical rules and nothing above them. Whether a string is the right string isn't something the hook can ask.
What to borrow
  • The nine rules are a usable starter set for any string-file hook — short, mechanical, and hard to argue with mid-edit.
  • Put judgment in the skill and the human; put only mechanical rules in the hook. A hook that tries to decide whether the string is the right string will either block everything or block nothing useful.
  • The honesty about coverage: a hook guards the agent’s door; a build check guards the repository’s. Neither replaces the other. If you only have one, know which door is still open.

better-interface

A whole-interface review skill that includes seven writing rules · Figma Community · Jakub Krehel · 1.2k users, 392 likes · read 24 Aug 2026

Full detail
What it is
One skill that reviews a whole interface across every craft dimension at once, writing included.

Its argument for judging words, layout and type together: they do different parts of the same job. Spacing and position establish the hierarchy before anyone reads a word, the words carry the meaning, and type decides whether they can be read at all. Split that into separate audits and each one can pass while the screen still fails.

Built by
Jakub Krehel, a designer. Not a content designer, and not a content-design tool.
Availability
Public, and readable in full.
Where it runs
In the Figma agent, triggered by slash command.
What you give it
A selection in a Figma file — a frame, a screen, or a flow — plus a request in chat.
What it does
Seven review sections, sized by rule count:
  • UI polish — 14 rules.
  • Accessibility — 9.
  • Typography — 9.
  • Layout — 7.
  • Writing — 7.
  • Plus icons, animations, surfaces, performance, and a common-mistakes list.

Everything consolidates into one prioritized verdict rather than a report per section.

How it works
  • Recon before judgment — establish scope and mode before reviewing anything.
  • Evidence required for every finding.
  • Read-only by default — it does not change the file unless asked.
  • One row per root cause, not one per occurrence, and never pad the report to fill a quota — no findings means no table.
  • An anti-flattening rule, which is rare: "Preserve intentional brand character when it remains clear and appropriate to the stakes: treat a difference from generic plain language as a finding only when it creates inconsistency, ambiguity, translation risk, or an inappropriate tone."
Grounding
Its own rules, all inside the one file, plus whatever is already in the design — it fixes terminology to the file rather than to a glossary.interesting No company context, no corpus.

The seven writing rules:

  • One voice, flexible tone. The product has one voice, set by what already exists rather than invented during a local edit. What flexes is the tone, and it ships a table saying how warm to be at each level of risk:
    ContextTone
    Success, onboarding, empty statesWarm, can be light
    Routine actions, settingsNeutral, minimal
    Errors, destructive confirmationsCalm, plain, zero playfulness
    Data loss, securitySerious, explicit
    It also fixes terminology to the file: "if it's 'Archive' in the menu, it isn't 'Move to storage' in the toast."
  • Plain words over clever ones. No idioms or humour that won't translate; match the verb to the device — "tap" on touch, "click" with a pointer, "select" when both are possible; and never concatenate fragments around a variable, because word order changes per language.
  • Verb-first buttons — "Send", "Save draft", "Delete project". Never "OK!", "Let's go!", or a bare Yes/No on a consequential action. Confirmation buttons repeat the consequence, so the dialog is answerable without reading the body: "Delete this project?" offers Delete project and Cancel.
  • Links describe their destination — because screen-reader users navigate by a list of the page's links. Never "Click here," and never a bare "Learn more" when several appear on one page; suffix each one — "Learn more about exports."
  • One capitalization policy per element type, applied consistently. Sentence case is the safer default.
  • Errors say how to fix, next to where it broke.
  • Empty states point forward.
Output format
You get a written report, plus notes left on the design.

The report is a findings table. One row per problem, with columns for severity, where it is, the before text, the after text, and why. Each row is a fix you can apply rather than a comment you have to interpret.

Around that table sit three things that make the report checkable:

  • A coverage table first, listing every dimension it reviewed and what it found. If it didn't review one, it has to say why — so you can tell "nothing wrong here" from "didn't look."
  • A "considered but rejected" table — things it inspected and chose not to flag, with the reason. Its instruction: these must be real candidates, "not invented filler."
  • One verdict at the end: Block, Needs changes, or Approve.

On the canvas, each row from the table also appears as a small card in the margin beside the frame, colour-coded by severity, with a line pointing at what it refers to.interesting It never draws on top of the design, and re-running replaces the old notes rather than stacking new ones on them.

Testing
None. No tests, no examples, and no evidence the rules improve anything — on the most-installed skill in this report.
Reported results
1.2k users and 392 likes — roughly ten times the nearest content-specific skill, and about twenty times Figma's own first-party writing skill.

The most-used content guidance on the shelf is filed under design critique and written by a designer.

Limits & gaps
  • Writing is one seventh of it. Seven rules against 60 KB of everything else — good rules, but not a content practice.
  • No terminology source. It enforces consistency with whatever is already in the file, which cannot catch a term that is wrong everywhere.
  • It sees a static design. A frame on a canvas can't show how the interface behaves, so a string can't be checked against what the product actually does.
  • The skill is made of a single flat file — 60 KB of it, with no reference files to load on demand, because the platform allows nothing else.
What to borrow
  • The tone-by-stakes table. Four rows that answer "how warm should this be?" without a debate.
  • Confirmation buttons that repeat the consequence, so a dialog is answerable from the buttons alone.
  • The anti-flattening rule — brand character is only a finding when it causes a named harm.
  • The coverage table and the rejected-candidates table. Together they let a reader tell "nothing wrong here" from "didn't look."
  • Reviewing content in the same pass as layout and type, and consolidating to one verdict.interesting

balise-ux-writing

Reviews, rewrites, generates or harmonizes copy in selected Figma screens · Figma Community · Steven H-A · 130 users, 82 likes · read 24 Aug 2026

Full detail
What it is
A UX-writing skill for reviewing, rewriting, generating, or harmonizing copy in selected Figma screens and flows.

Its framing: "Treat interface copy as part of a user task, not as isolated prose."

Built by
Steven H-A, an independent designer. The most-used content-specific skill on the shelf.
Availability
Public, and readable in full. The complete instructions render on the skill's Community page.
Where it runs
In the Figma agent, triggered by slash command.
What you give it
A selection — layers, frames, components, or a whole flow — plus a request in chat.
What it does
Four modes, which it infers from your request:
  • Review — diagnose and propose. No edits.
  • Rewrite — improve existing copy inside the requested scope.
  • Generate — write copy for specified screens or missing states.
  • Harmonize — align terminology and patterns across a flow.

When edit intent is unclear, it defaults to Review. The safe mode is the fallback, not the enthusiastic one.

How it works
  • It frames before it judges. A five-part step establishes who is reading and what they need, what the person is trying to accomplish, which moment this is (discovery, decision, waiting, error, risk, success, or return use), what action the interface actually allows next, and which terms, components, rules and states already exist. One guard on that: "Never present an invented persona or need as research."
  • It reads a string in its frame, not on its own. Selected text layers are read inside their complete parent frames, with adjacent steps, related states and responsive variants inspected too.
  • It writes in the language of the design. In a multi-locale file it preserves each locale and its conventions, and won't translate unless asked.
  • The selection is the edit boundary. It may inspect parent frames, nearby screens, variants and comments for context, but may not edit them — and it preserves components, variants, variable bindings, Auto Layout and every visual style. Only text changes.
  • It asks at most one question. Use visible evidence first, ask one concise question only when the missing context would change the result, otherwise state the assumption and carry on.

A block titled "Protect Meaning and Trust" sets four things it must not do:

  • Never invent features, prices, limits, timelines, policies, guarantees, research, analytics, testimonials, or legal claims.
  • Never silently alter consent, privacy, security, payment, or deletion content.
  • Preserve the consequence of every action, along with product behaviour, hierarchy, and brand voice.
  • Never claim a static design proves anything — not usability, not accessibility compliance, not localization quality, not implementation behaviour.
Grounding
The file itself — the selected frames plus adjacent screens, states, variants and comments. No style guide and no glossary: it infers the terminology and tone from the design in front of it.
Output format
Not specified. Review proposes without touching anything; Rewrite, Generate and Harmonize change text in place, inside the selection.
Testing
None. No tests and no examples ship with it.
Reported results
130 users, 82 likes — the most-used skill written specifically for content work, and more than twice the adoption of Figma's own first-party writing skill.
Limits & gaps
  • No house style inside it. It is a method, not a style guide — it infers terminology and tone from the file, so it can't tell you your own rules.
  • The skill is made of a single flat file, with no reference files to load on demand, because the platform allows nothing else.
  • It sees a static design. By its own rule it can't judge how the interface behaves — which also means it can't check a string against what the code actually does.
What to borrow
  • A stated edit boundary. Any agent operating on a live design file or codebase should have one: what it may read, and what it may change.
  • Default to the read-only mode when intent is ambiguous.
  • A named list of things the tool may never invent — prices, limits, policies, research. Without it, a model asked for copy whose facts it hasn't been given will supply them, and they will read as confidently as the parts that are true.
  • Write down what your tool is not able to judge. This one says a design sitting still on a canvas cannot prove the interface is usable, accessible, correctly localized, or built as drawn — so it may not claim any of that. Every review tool sees one kind of evidence; naming which kind is what stops it overclaiming.

figma-ux-writing-style

Figma's own house style guide, shipped as a skill · Figma Community · Figma with Henry Freedland · 56 users, 51 likes · read 24 Aug 2026

Full detail
What it is
Figma's internal UX-writing style guide, published as a skill an agent can run.

Its own scope note says what it leaves out: product terminology, and per-component writing patterns.

Built by
Figma's UX Writing team, credited jointly to Figma and Henry Freedland.
Availability
Public, and readable in full. The complete instructions render on the skill's Community page.
Where it runs
In the Figma agent, triggered by slash command.
What you give it
A selection in a Figma file, plus a request — or just a question about what Figma does for a given case.
What it does
Three modes, from one file:
  • Draft — produce strings that follow the rules, citing the rule by name for any non-obvious choice.
  • Review — check a draft against each applicable rule. Its instruction: "Don't flag rules they didn't violate. Don't add filler considerations."
  • Answer — for "what does Figma do for X?", quote the relevant rule directly.
How it works
  • It matches rules to slots by layer name. It walks the selection for text nodes and records each string with its context — "Primary action button", "Title", "Description" — then applies the rules for that slot. Layer naming becomes load-bearing for content review.interesting
  • It skips hidden layers rather than reviewing invisible copy.
  • It is told not to sound too sure. "These are suggestions and not a replacement for real UX writing judgment… your capabilities are largely directional. Don't make a user think you are capable of the gold standard." The output is required to read as "suggestions to consider," not "rules applied" — the opposite of the confident-reviewer voice most tools adopt.
  • Alternatives are offered only where wording is genuinely subjective — error messages, CTAs, loading states, headers, callout body copy. For mechanical fixes like apostrophe type, capitalization, or number formatting: "one correct answer only." That splits judgment from mechanics inside the output itself, so a reviewer isn't offered a menu for something with a single right answer.
Grounding
Its own rules, written into the one file, and nothing else — no glossary, no corpus, no company context beyond what the guide states. All of them specific enough to check:
  • Bolding — bold user-generated content (names, emails, file names, domains) and bold critical information (dates, money, implied costs, roadblocks). Don't bold when several font weights already appear in the same area.
  • Date and time — relative time for most UI, absolute for version history. Three-letter months with no periods, cardinal not ordinal (Aug 16, not Aug 16th), AM/PM without periods, no days of the week.
  • Keyboard shortcuts — Mac uses no plus signs (⌥⌘K), Windows does (Alt+Ctrl+Del). Detect the platform; if you can't, show both with Mac first.
  • Placeholder text — never put critical information there, because it disappears when typing starts. Mark optional fields in the header with "(Optional)", not in the placeholder.
  • Loading states — present tense, no punctuation, not even an ellipsis, and "Do NOT be cute — loading states are not the right context for delight."
  • Punctuation in tight spaces — in toasts and tooltips, prefer a comma splice to an em dash, because "em dashes are visually heavier and more distracting in tight spaces." It calls the comma splice a "hard comma." Its example: "File moved, open it in the new project" rather than "File moved — open it in the new project."
  • Word choice — two lists. Preferred: co-create, together, make, big ideas, collaborate, build, flow. Avoided, each with its reason: dream (too lofty), creativity (too unspecific), playful (too ambiguous), supercharge (too marketing-speak), magical (too fantastical), artist (too poetic), utilize (too stiff).
  • Be concrete — "Write lines people can picture." Its example marks "Less lorem ipsum, more true-to-life designs" as good and "Less guesswork, more accurate mocks" as too abstract.
  • Localization — Japanese may be shorter but taller, German and French may run 50% longer, put "Learn more" at the end of a sentence because mid-sentence order flips in translation, and never start a sentence in a header and finish it in the options below.
Output format
A fixed template per finding, in chat:
[Rule name] what's wrong
  Fix: "corrected string"
  Alt: "alternative"

Chat first, canvas only on request. It lists findings in the conversation, shows violations only, and then asks whether you want them added to the canvas. It never draws uninvited.

If you say yes, it leaves each finding on the canvas as a sticky note next to the design.

Testing
None.
Reported results
56 users, 51 likes. Figma's own writing guidance is the third most-used content skill on Figma's own shelf, behind two skills by independent designers.
Limits & gaps
  • It excludes terminology by design — the row of content work most likely to cause real inconsistency.
  • No per-component patterns, stated in its own scope note.
  • No deterministic checker. Several of these rules are mechanical enough to lint — the date format, the shortcut separators — but a model applies all of them.
  • The skill is made of a single flat file, with no reference files to load on demand, because the platform allows nothing else.
What to borrow
  • Tell the tool how sure to sound. Writing the expected level of confidence into the instructions stops it stating a guess in the same voice it uses for a rule.
  • Offer options only for judgment calls, and exactly one answer for mechanics.
  • Attach a reason to every avoided word. "Supercharge — too marketing-speak" is teachable; a banned-words list isn't.
  • Write punctuation rules per surface. What reads well in a paragraph is wrong in a toast or on a button, because every character competes for space there — so the rule for a notification has to be written separately from the rule for body text rather than inherited from it.interesting

Salesforce's brand-voice skill

An agent skill that fetches brand voice and guardrails from a CMS at run time · npm @salesforce/afv-skills · CC-BY-NC-4.0 · verified 2026-08-23

Full detail
What it is
An agent skill, experience-cms-brand-apply, that applies a brand's voice to generated content — without containing that voice itself. It fetches the rules over a tool call each time it runs.
Built by
Salesforce's Agentforce developer-experience team.
Availability
Public on npm — 120 skill files in one package, so a team gets them by adding a line to package.json.

But the brand skill is inert without a Salesforce org that has the feature enabled, so you can read it without being able to run it.

Where it runs
In a coding agent, installed from the npm package.
What it does
Applies a brand's voice to content the agent is generating, and reports back which guidelines it used.
How it works
The skill does not embed the style guide. It fetches brand instructions through agent tools at run time, and declares that dependency in its own metadata.

The returned payload carries six things: brand voice, brand tone, key messages, content rules, style guidelines, and guardrails — "hard restrictions on language, topics, or claims."

These are its four stated principles:

  • "Brand first, content second — always extract brand instructions before generating content."
  • "Never assume brand guidelines — only apply what was explicitly retrieved."
  • "Respect guardrails absolutely — brand content rules are hard constraints, not suggestions."
  • "Show your work — tell the user which guidelines you applied and how."

Two consequences of keeping the standards outside the skill: they can change without touching it, and the same skill works for any customer's brand.interesting

Grounding
The brand instructions held in the CMS and served through agent tools. Nothing is embedded in the skill, and it is told not to fill in anything the fetch didn't return.
Output format
Not fixed. The one requirement is that the reply names which guidelines were applied and how.
Testing
None. It applies a brand voice; nothing checks whether the output actually matched one.
Limits & gaps
  • You can't run it standalone. Without a Salesforce org with the feature switched on, the skill has nothing to fetch — so the half that matters, the brand payload, can't be inspected from outside.
  • No deterministic checker. The guardrails are described as hard constraints, but a model is what honours them.
What to borrow
  • Serve your standards over a tool call instead of embedding them in the skill, so the rules and the tool can change independently.
  • Write "show which guidelines you applied" into the instructions as a requirement, rather than hoping the tool does it unprompted.
  • Write into the instructions that the tool may not assume anything. Salesforce's version is one line: only apply what was explicitly retrieved. It closes the gap where a model fills in a brand voice from memory instead of admitting it found nothing.

Windy Road's voice-and-tone hooks

Hooks that refuse to let copy be edited without review · writeup (March 2026) · repo · MIT

Full detail
What it is
A four-hook gate that blocks an agent from editing any copy-bearing file until a voice-and-tone review has happened in that session.
Built by
Tom Howard, founder of an engineering consultancy. Engineer, not a content designer.
Availability
Public, MIT, live (pushed the day it was checked). Since the writeup it has been generalized into installable plugins.
Where it runs
In a coding agent — Claude Code, in-repo, on paths that hold copy — components and article/social markdown.
What it does
Refuses the edit rather than reviewing it. Copy files can't be changed until a review has run in the session, and a second hook refuses a specific character outright.
How it works
Four hooks forming a lock:
  1. On prompt submit — if a VOICE-AND-TONE.md exists at the project root, inject a mandatory instruction to delegate to the voice-and-tone agent.interesting
  2. Before any edit or writehard-block edits to copy paths unless a session marker exists, returning a deny decision: "BLOCKED: Cannot edit copy file without voice & tone review."
  3. After the review subagent runs — create the session marker, unlocking edits.
  4. On stop — delete the marker, so the next turn requires a fresh review.

There is also a dedicated no-em-dash deny hook. Two implementation details in it:

  • Its search strings are built at runtime from a character code, so the hook file doesn't flag itself.
  • It carries a small whitelist for upstream markers that legitimately contain em dashes.
Grounding
docs/VOICE-AND-TONE.md — five voice principles each with a ✓ and ✗ example, a banned-pattern list, and a prefer/avoid word list. Supporting agents include a blog-article critic, a newsletter critic, a content-risk scorer, and a cross-edition consistency checker.
Output format
A refusal, not a report. The hook returns a deny decision carrying a message the agent reads, and the edit never lands.
Testing
None — but they published a negative result instead, which nobody else here does. See Limits & gaps: three phrases that passed every documented rule and a human rejected anyway.
Limits & gaps
The hooks reliably enforce the rules, and the rules turn out not to be the whole job.interesting They filed this as problem 077 in June 2026, and it is still open.

The gate passes copy that follows every documented rule but still doesn't sound like the person whose voice it is meant to be. In their words, the agent "has no oracle for 'what Tom says' separate from the general rules."

Three phrases that passed the rules and a human rejected anyway:

  • "came due" — correct, but a finance idiom.
  • "narrative tide turns" — correct, but a journalism cliché.
  • Stacked abstract nouns that satisfied the guide's define-on-first-use rule "mechanically but failed Tom's editorial bar for plain English."

Their own diagnosis of why: the voice principles are too abstract to check, and the banned-word list is checkable but far too short. Nothing sits in between.

The fix they propose — derive a voice reference from a body of already-published writing rather than trying to write the rules down — is what writing-eval actually implements.

One more, in common with every hook here: it only guards edits made through the agent. A hand edit outside that flow passes unchecked.

What to borrow
  • Block the edit until a review has actually run, rather than hoping the agent remembers to load a skill. Hooks fire every time; skills fire when the model chooses.
  • Separate “did a review happen” from “did the writing pass.” A hook can require the review step; a human or a later check still owns taste.
  • Scope the hook to the files that carry product strings, so ordinary code edits are not taxed with content review noise.

Ditto

A commercial content system spanning five surfaces — plus component specs for agents · dittowords.com · 2026 releases through Aug 2026

Full detail
What it is

A commercial content system: a copy library acting as the source of truth for product strings, with AI layered on for drafting, linting, and review.

Include it here because it is the clearest commercial assembly of the whole stack this report teaches — approved library, rule-citing review, pull-request bot, agent access, and (in 2026) component-level specs — in one place.

Built by
A vendor, roughly 15 people.
Availability
Commercial product. You can buy it and read the docs; you can't inspect it. Included because it is the one place to see every layer of this report assembled by a team doing it full-time.

Their sales argument is worth knowing, because it is aimed at teams considering a build: generating text is now cheap and interchangeable, so the product is the approved library the generation is anchored to. They market that explicitly against building your own.

Where it runs
A web app, a Figma plugin, an agent tool server, a GitHub PR bot, a CLI, and a packaged set of agent skills — one library, reached from whichever tool the work is already happening in.
What it does
System of record: a copy library with component linking — edit a string once and it propagates to every linked instance. Variants for A/B tests, review workflows with visual context, change history, localization.

Rules: style guides authored as discrete "this, not that" rules, each with a name, description, and examples, covering terminology, tone, formatting, compliance.

How it works

The library is the centre; each surface is a different way to reach it. Teach the surfaces as one system with many doorways, not as five separate products:

  • In Figma — a designer pulls approved strings into a mockup, or pushes new ones back, so the design and the library stay the same text.
  • Through agent tools — a coding agent can search the approved library before writing anything new, and fetch the style rules that apply. The point is that the agent asks the library rather than inventing a string.
  • In a pull request — their GitHub bot reads the changed strings, checks them against the style guide, and leaves inline comments. It also surfaces existing library text that would do the job, so a duplicate string gets caught before it merges.
  • At the command line — the same checks in a script, so a build can run them.
  • As a packaged agent setup — connection, standing instructions, and review skills travel together, so the copy library becomes default equipment rather than a tool someone must remember to call.

Underneath all of it, the linting checks text against every enabled rule.

And then analytics track how the enforcement itself is performing, so rules can be refined — which rules fire most, and which ones people override.interesting

Getting started from nothing: an onboarding agent scans a live codebase, extracts customer-facing strings in every language, builds a first copy and translation library, and drafts a style guide from the voice patterns in the existing copy.

Specs (the 2026 chapter worth teaching). Beside a component in the codebase, a small markdown file (they use the .ditto.md name) lists every piece of user-facing text that component shows — the title, the button label, the helper text, the tooltip — and carries the style rules that apply to those pieces. A file at the root of the project can hold rules that apply everywhere; component files add the specifics. When an agent edits that component, the right rules are already sitting next to the code, the way a stylesheet or a test file would be. You do not have to hope the agent remembers to go fetch the style guide.

Setup, in plain steps: start a project-level rules file; scaffold a file next to a component; declare each text surface and tag what kind of text it is (for example, a call to action); pull the matching rules from Ditto’s platform into that file; commit it so the whole team shares the same rules in version control. Helper skills walk a person through scaffolding, auditing real copy against the specs, and spotting patterns that should become new rules.

A single giant style guide in the repo root gives every component every rule. Agents then grab the first thing that looks relevant. Specs try to give the agent only the rules for the surfaces it is touching.interesting

Grounding
The approved copy library and the rule set — nothing else.
Output format
Every suggestion names the rule that triggered it, and ties the edit back to that rule's rationale. No unexplained rewrites.

That one requirement does two jobs: a writer can argue with a specific rule rather than with the tool, and a wrong suggestion points at the rule that needs fixing instead of eroding trust in everything else the tool says.

Testing
None published. No accuracy figures, and nothing inspectable to check them against. The closest thing is the enforcement analytics — which rules fire and which people override — and that is a signal about the rules, not a measurement of whether a suggestion was right.
Limits & gaps
  • Closed source. You can buy it and read the documentation, but you cannot inspect how any of it works.
  • The value sits in the approved library, and the vendor doesn't populate it. The onboarding agent drafts a first version out of your existing code; after that somebody has to own the strings and the rules.
What to borrow
  • Cite the triggered rule on every suggestion, so a writer argues with a rule rather than with the tool. A wrong suggestion then points at the rule that needs fixing instead of eroding trust in everything else.
  • Search for an existing approved string before generating a new one. Generation is cheap; an ungoverned duplicate is expensive forever.
  • Put the rules next to the component that uses them, not only in a root style guide. Agents (and humans) load what is nearby.
  • Package the connection and the review habit together, so “use the library” is the default path, not a memory test.

These are architecture decisions, not features you need to buy.

Frontitude

A commercial tool that attaches copy guidelines to design-system components · frontitude.com · agent access early access Aug 2026 · rebuilt Figma plugin Aug 2026

Full detail
What it is

A Figma-native content management tool: a copy library, localization handoff, and an AI writing assistant grounded in previously approved content.

Through 2026 it pushed harder into two loops content designers care about: reviewing and editing from Figma with a rebuilt plugin, and closing the gap when a string was born in code and never drawn on a canvas.

Built by
A small vendor.
Availability
Commercial product, with agent-tool access in early access as of August 2026. Nothing about it is inspectable — this card is built from the vendor’s own account.
Where it runs

Figma plugins (including a rebuilt plugin that arrived in August 2026), plus a live connection that lets agents read and edit workspace copy from Claude, Cursor, ChatGPT, and Copilot.

What it does

Keeps the approved copy in one library, hands it off for localization, and writes new strings against the guidelines that apply wherever the string sits.

It also offers ways to push copy from code-built interfaces into the library, so strings that never lived in Figma can still join the same system of record.

How it works

Content guidelines attach to main design-system components. Write the empty-state rule once on the EmptyState component, and any AI operation on any instance of it anywhere automatically loads that rule. Retrieval by location instead of by search — the design system becomes the index.

That is the teaching core. Most style guides ask an agent (or a person) to search for the right chapter. Frontitude’s bet is that if you already know which component you are on, you already know which rules apply.

The open question, stated plainly: if a string was born in code and never drawn in Figma, how does it find the right component’s rules? Push-from-code is their answer to that loop. Verify it on a real repository before you tell a team the problem is solved — vendor demos and a production monorepo are different tests.

Agent access matters for the same reason Ditto’s agent surfaces matter: the library has to show up where the draft is happening, not only where the design file lives. If designers use Figma and engineers use a coding agent, both doorways need the same rules or you have two standards again.

Grounding
Component-attached guidelines, previously approved content, and translation memory.
Testing
None published.
Limits & gaps
  • Closed, and described only by the vendor. None of it can be checked from outside.
  • The rules are organised around Figma components. An agent can fetch them from Claude, Cursor, ChatGPT or Copilot. Push-from-code is the proposed bridge for code-only strings — treat it as a claim to validate on your repo structure, not as a solved problem.
What to borrow
  • Treat the component as the unit of guidance — not one voice guide for the product, but a rule for the empty state and a different rule for the button. That is how retrieval stops being a scavenger hunt.
  • Write new copy against copy that was already approved, not only against the rules.interesting Approved strings are a record of everything the rules never settled, and they are a corpus you already have. Different move from Ditto’s reuse check, which asks whether the string already exists — this one asks what the approved ones sound like.
  • Ask early how code-born strings enter the library. If your product ships screens that were never drawn in Figma, a Figma-only index will silently miss them.

ContentRX

Reviews the prose in your codebase before anyone else does · contentrx.io · checked 2026-09-12

Agent toolsEditorPull requestsCommand line
Full detail
What it is

A review tool for writing that already lives in code: button labels, error messages, pull-request descriptions, README files, and other text the product ships.

It is not trying to be a blank-page writer. Its job is to read what you are about to ship, flag what is unclear, and suggest a sharper line — using one editorial standard everywhere the check runs.

Built by
A company selling the product. The public site is aimed at people who ship software, not only at content designers.
Availability

Commercial. You can buy and install it. You cannot open it up and read how the review engine is built. The company says it measures and publishes how accurate the reviews are — that claim comes from them, and this card does not independently verify the numbers.

Where it runs

The same review engine shows up in four everyday places, so a finding means the same thing whether you are drafting or merging:

  • While you talk to a coding agent (Claude Code, Cursor, and similar). The agent can call ContentRX as a tool mid-conversation, so the flag appears next to the draft instead of later in a separate review pass.
  • In your code editor, as underlines and suggestions you can accept in place — the same idea as a spellcheck, but for clarity and usefulness of product writing.
  • On a pull request, as an automated check. You can configure it so a merge waits until review findings are handled.
  • On the command line, for a quick check of one string, a whole file, or a habit that runs before you commit.

There is also a simple website where you paste text and get a review, with no install.

What it does

It reads writing in context and returns two things: what is wrong, and a suggested rewrite.

Their own demos are easy to picture:

  • A pull-request summary that says “fixed some stuff with the auth flow” becomes a summary that names the actual change and what stayed the same.
  • An error that only says “Something went wrong. Try again later.” becomes a message that says what failed and what the person can do next.
How it works

ContentRX describes itself as more than “ask a model to review this.” The useful teaching point is the pipeline around the model:

  1. It looks at the writing where it lives — next to the code, the pull request, or the file — so the review is not judging a sentence floating in a vacuum.
  2. It applies one opinionated editorial standard across every surface. The point of that sameness is trust: if the editor and the pull-request check disagree, people stop reading both.
  3. It returns a judgment you can act on — what to change, and often a rewritten line — rather than a vague score.

The architecture lesson for anyone building their own checker is simple: one brain, many doorways.interesting If your Figma plugin, your Slack bot, and your pull-request bot each invent their own rules, you have three tools and no standard.

What is still unclear from the public site is how far you can replace their opinionated standard with your own house style guide, and whether every suggestion names a specific rule the way Ditto does. Check that before you treat it as “cite the rule” infrastructure.

Grounding

The surrounding code and the product writing already in the repo, plus ContentRX’s own editorial standard. Your brand voice is only in the loop if you have a supported way to plug it in — confirm that on their docs before promising it to a team.

Output format

Findings plus suggested rewrites, delivered in whatever surface you are in (chat, editor underline, pull-request comment, or terminal). The public demos show concrete before-and-after lines rather than numeric scores.

Testing

The company says accuracy is measured and published. This card does not re-run those measurements. Until you can see the method, treat it like other closed review tools: useful to try, not yet a proven yardstick.

Limits & gaps
  • You cannot inspect the engine. You learn from the behaviour and the docs, not from reading the source.
  • Opinionated by design. That helps a team with no written standard. It fights a team whose doctrine already disagrees with theirs.
  • It reviews pieces of writing, not whole screens. A button, an error, and a title can each “pass” and still fail as one screen — the problem Coinbase’s Figma plugin writeup hits head-on.
What to borrow
  • Run the same review standard in the draft moment and in the merge moment. If only the pull request is strict, people learn to ignore the early warning. If only the chat agent is strict, bad copy still merges.
  • Separate “the check ran” from “the writing is approved.” A green build that only means “the tool finished” is how weak copy ships with confidence. If findings should block a merge, say that out loud in the setup.
  • Show the sharper line, not only the complaint. Reviewers who only say “unclear” train writers to guess. A suggested rewrite teaches the standard.

Gummble

Lets an agent search real shipped screens, flows, and microcopy before it designs or writes · gummble.com/mcp · around July 2026 · checked 2026-09-12

Full detail
What it is

Gummble is a large library of real product interfaces — screenshots, step-by-step flows, recurring patterns, and the words those products use.

In 2026 they added a way for coding and design agents to search that library live. The content-design reason to care is the microcopy search: an agent can look up how real products word an empty state or an error before it invents “Oops! Something went wrong.”

Built by
Gummble, as a commercial research library for product teams.
Availability

Commercial. Agent access comes with their paid plans. You sign in through a normal account login rather than pasting a secret key into a config file. The connection is read-only: the agent can search and look things up, but it cannot change your files through Gummble.

Where it runs

Inside agents that can call outside tools — Claude, Cursor, Codex, Windsurf, v0, and similar. You add Gummble once; after that the agent can ask it questions during a task.

What it does

It answers research questions with evidence from products that already shipped. Typical asks:

  • Show me mobile paywalls that put the yearly plan first.
  • Compare onboarding flows for language-learning apps.
  • Find empty-state microcopy from fintech apps.

They say the library holds on the order of hundreds of thousands of screens and tens of thousands of flows. Treat the exact counts as marketing numbers; the teaching point is “searchable evidence,” not the headline figure.

How it works

Gummble’s own explanation of neighbouring tools is the clearest way to teach this:

  • Gummble finds outside evidence — what other shipped products look and sound like.
  • A Figma connection reads your file, components, and design system.
  • Component libraries help after you know the direction, when you need something buildable.

Those jobs are easy to mix up. An agent that only knows your Figma file will remix your existing patterns. An agent that only knows the internet will sound like a moodboard. The healthy sequence is: gather evidence, then apply your system, then build.interesting

In practice, you ask the agent for a direction. The agent calls Gummble’s search tools, gets references with product context, and — if you prompt it well — has to show those references before it writes. For microcopy, that means it can study how real products handle validation, recovery, and empty states instead of falling back on training-data clichés.

Grounding

Other companies’ shipped interfaces. That is the point, and also the risk. Gummble will not enforce your voice. Pair it with your style guide, your approved string library, or your own review skill — or the agent will learn taste from the market.

Output format

Search results: screens, flow steps, pattern families, and microcopy examples the agent can cite. It does not rewrite your copy by itself; it feeds the conversation that does.

Testing

None published for whether fetching microcopy references actually improves the writing an agent produces. This is a research shelf with an agent doorway, not a scored writing tool.

Limits & gaps
  • Evidence from other brands. Great for pattern literacy. Dangerous if you paste it in as your voice.
  • Costs money. It is not a free public corpus.
  • Read-only. It will not stop a bad string from merging. It only informs the draft.
What to borrow
  • Make “show your references” part of the writing brief. Even without Gummble, ask the agent to pull three approved empty states from your own library before it drafts a fourth.
  • Keep research tools and design-system tools separate in your head. One answers “what do good products do?” The other answers “what do we already ship?” Confusing them is how generic copy lands in a branded product.
  • Use outside microcopy to critique, not to clone. Steal the structure of a recovery message; rewrite it in your words.

sota-ux-writing

A skill for writing and reviewing interface copy inside a larger pack of engineering skills · martinholovsky/SOTA-skills · listed around August 2026 · checked 2026-09-12

Full detail
What it is

A folder of instructions an agent can load when the task is user-facing interface text: buttons, errors, empty states, notifications, onboarding, and the rest.

It covers voice and tone, plain language, microcopy craft, and the accessibility and translation concerns that live inside the words themselves (alt text, plural forms, strings that will expand in other languages). It is one skill in a bigger pack aimed at coding agents; the pack also claims measured gains on engineering best practices. Those measurements are about the pack overall, not a public test of microcopy quality.

Built by
Martin Holovský, as public open work.
Availability

Public and free to read. You can install the pack for Claude Code and other agents that understand skill files, or copy the writing skill on its own. Always-on routing is optional: the agent can load the right skill from the description of the task, without you naming it every time.

Where it runs

In a coding agent, while someone is building or reviewing product UI. It is not a Figma plugin and not a website you paste copy into.

What it does

Two jobs, on purpose:

  • Write interface copy against the bundled rules.
  • Audit existing copy for clarity, consistency, tone, accessibility of language, and readiness for translation.

The skill is clear about its boundary: it owns the language. Decisions like “should this be an empty state or a blank table?” belong to neighbouring design skills in the same pack.

How it works

Under the hood it is still markdown rules — but the pack is built around a loop that matters for long agent sessions:

  1. Only load the rules this task needs, so the agent is not drowning in every standard at once.
  2. Bring those rules back into view across turns, because long conversations make early instructions fade.
  3. Check again at the end, before the agent declares the work done.

That loop is the teaching core. A beautiful style guide that appears once at the top of a chat will lose to a messier guide that keeps getting re-applied.

The writing rules themselves are grouped into files — language system and plain language, microcopy surfaces, errors and feedback, accessibility and localization — so an audit can walk a known path instead of free-associating.

Grounding

The bundled standards (including plain-language and accessibility language criteria). Not your product glossary, and not your legal word list, until you add them.

Output format

Written copy or an audit, depending on the mode. Exact field layout depends on how you invoke it; the important split is write versus audit, not a single “make this better” blob.

Testing

The parent pack publishes coverage-style results for engineering practices. There is no dedicated public test set of labelled UI microcopy attached to this skill in what we checked.

Limits & gaps
  • General craft, not your voice. Same limit as Anthropic’s /ux-copy until you bind house rules.
  • Lives in a large pack. Powerful if you want routing across many skills; heavier than a single short file if you only need microcopy.
What to borrow
  • Ship write and audit as two modes of the same system, not as two unrelated prompts someone has to remember.
  • Treat translation and accessibility as part of the writing rules, not as a later ticket. Plural forms, expanding text, and screen-reader names are content decisions.
  • Re-check at the end of a long agent run. If your only instruction was at the beginning, assume it has drifted.

Uxcel’s microcopy skill

Writes microcopy, then hands the draft to review skills · Uxcel-Lab/product-skills · around June–July 2026 · checked 2026-09-12

Full detail
What it is

One skill in an open toolkit of dozens of UX and product-management skills. This one focuses on the short words in the interface: button labels, errors, empty states, form labels, tooltips, notifications, and confirmations.

The lineage is the teaching point. The rules are compressed from Uxcel’s learning library — material written and reviewed by practitioners for teaching — rather than invented in one afternoon as a mega-prompt.

Built by
Uxcel Lab.
Availability

Public, under a licence that allows reuse. You can install the whole toolkit, install selected skills, or copy a single skill file into your agent. It works in coding agents and in places that load the same skill format, including some Figma agent surfaces.

Where it runs

Wherever you can load an agent skill. You ask for microcopy help, or invoke the skill by name, and the agent loads those rules for the turn.

What it does

It writes or improves microcopy — and it is blunt about the failure mode of default model writing: verbose, clever, or generic (“Oops!”, “Submit”, “Are you sure?”).

Good microcopy, in its framing, is plain, specific, and quietly helpful. Tone is treated as a choice you make for the brand and the moment, not a default setting of “friendly.”

How it works

The skill does not stop at “here is a draft.” The intended path looks like this:

  1. Establish voice, audience, and tone before polishing wording. Expressive tone without that gate is how jokes land in the wrong moment.
  2. Apply clarity, shortness, and action — what happened, what to do, what the button does.
  3. Hand the result to companion review skills instead of declaring victory:
    • a microcopy audit across the flow
    • an accessibility look at the language
    • a dark-patterns check for confirmshaming, fake urgency, and dishonest persuasion

The design pattern is generate, then refuse to call it done until a review lens has run.interesting That is the same writer/checker separation you already teach elsewhere, packaged as a skill family with a clear handoff.

Grounding

Uxcel’s taught standards, plus whatever brand and audience context the skill gathers at the start. It does not automatically know your glossary.

Output format

Revised microcopy, then audit findings if the handoff runs. The audits are where consistency across a flow gets checked — not only whether one button sounds nice.

Testing

None published as a labelled microcopy test set. “Distilled from a curriculum” is a claim about where the rules came from, not a score against human reviewers.

Limits & gaps
  • Curriculum is not your product. Legal terms, regulated claims, and house names still need a local layer.
  • If someone skips the audit handoff, they only get the writer. The system is only as strong as the habit of finishing the loop.
What to borrow
  • Pair every write skill with a named review skill, and make the handoff part of the workflow description — not a polite suggestion at the bottom of a README.
  • Name dishonest copy patterns out loud (guilt trips on cancel buttons, fake countdown urgency). If the review skill cannot say those words, it will miss them.
  • Gate tone. Decide whether this moment should be warm, neutral, or firm before you ask for “better writing.”

LocIn

Translates product strings from the command line or a build, with an eye on tone and placeholders · locin.dev · around June 2026 · checked 2026-09-12

Command lineBuild checks
Full detail
What it is

A translation helper built for people who keep product strings in code. You run it locally or in your build pipeline; it finds strings, translates them, writes them back out, and checks the result.

It sits next to big localization platforms in spirit, but the doorway is a developer workflow rather than a translator’s workstation. The content-design interest is whether tone and placeholders survive — not whether it can move files around.

Built by
LocIn, as a commercial product.
Availability

Commercial, with a public site. They say it detects common setups such as React, Next.js, Vue, Nuxt, and standard i18n file layouts, and that you can point it at custom paths when your repo is unusual.

Where it runs

On a laptop terminal, or as a step when code is pushed. It is not a Figma plugin and not a chat bot for rewriting English source copy.

What it does

A full pass can scan, extract, translate, export, and validate in one go. Brand-voice profiles steer how the translation should sound. Variables like {{name}} are supposed to stay untouched.

Their own cautionary example is familiar: a casual English line about being “ready to slay” gets mistranslated into something violent, and the placeholder gets renamed. The demo output keeps the placeholder and the intended tone.

How it works

Generic translation tools often see only the isolated string. LocIn’s pitch is that it also reads the component and comments around that string, so a word like “Book” can mean a reservation in one screen and a volume in another.

Teach the failure mode first, because it is the whole reason tools like this exist:

  1. A model translates the words it can see.
  2. It guesses tone from the sentence alone.
  3. It “helpfully” translates placeholder names or breaks ICU-style plural forms.
  4. The build still goes green, because nobody checked meaning — only that a file appeared.

LocIn tries to interrupt steps 2 and 3 by adding UI context and brand-voice profiles, then validating before you ship. How deep that context reading goes is described by the vendor; this card does not re-implement it.

Grounding

Source strings, nearby code context, and whatever brand-voice profile you configure. It will not invent your empty-state strategy. It tries not to wreck the strategy you already wrote.

Output format

Updated translation files and validation results in the terminal or build log.

Testing

No independent public scorecard was verified for this card. Compare carefully with platforms that publish structured quality dimensions if you need audit-ready evidence.

Limits & gaps
  • Younger than the big localization suites. Less public track record than Crowdin, Lokalise, Phrase, or Lingo.
  • Translation quality is not content design. Clear Spanish of a confusing English empty state is still a confusing empty state.
What to borrow
  • Never translate a UI string without its screen context. If your process exports a spreadsheet of keys with no screenshots and no component names, you have already lost.
  • Put placeholder safety in the same gate as “did it translate.” A broken {{name}} is a product bug, not a linguistic quibble.
  • Keep brand voice next to the translation step, not only in an English style guide nobody sends to the model.

Lexi

An internal review assistant with named modes · Pedro Quintino / Anchorage Digital · described Mar 2026 · Medium

Full detail
What it is
A chat assistant built for content-design review inside a regulated fintech practice. It is not a public product — a writeup of the structure, useful for the same reason other described builds are.
Built by
Pedro Quintino at Anchorage Digital.
Availability
Described only. Nothing to install. Re-open the article before quoting it; the page did not always load cleanly during drafting.
Where it runs
As a chat assistant on hosted models — not as a Figma plugin in the writeup.
What it does
Reviews through named modes such as copy, flow, education, and support. Brand and regulatory critique sit above simple word polishing.
How it works
You pick the kind of review before the model starts.interesting A single “review this screen” prompt collapses different jobs into one answer. Modes force the question up front — button wording, flow order, education moment, or support policy — so the assistant is graded against a clearer bar. Same instinct as splitting a writer from a checker, or running terminology and tone as separate passes.
Grounding
House brand, product, and regulatory context as assembled for that assistant.
Testing
None published. A practitioner narrative, not a scored eval set.
Limits & gaps
  • One team’s story — no public repo to take apart.
  • Mode names are theirs. Rename them to match how your team already argues in critique.
What to borrow
  • Name the review modes and make people pick one before the assistant runs.
  • Put brand and legal constraints inside the mode definitions, not as a hope in a giant system prompt.

Coinbase content agent → Figma

A chat agent for content design, rebuilt toward the canvas as skills · Hunter Gebron · described Aug 2026 · UX Content Collective

Full detail
What it is
An internal content-design assistant that designers used from chat, then an attempt to put the same help inside Figma so they did not have to leave the file. Described in a public writeup — not a product you can install.
Built by
Hunter Gebron at Coinbase (with collaborators). Internal; publicly described.
Availability
Described only. A prototype plugin was tried with designers; it is not public.
Where it runs
Chat first (modular system prompt over a large guideline library, with company knowledge search). Figma second, by rewriting that behaviour as skill files the plugin could load.
What it does
In chat: content-design help grounded in house strategy, voice, and taxonomy. In Figma: select a frame, ask for a change or tap a preset, get recommendations, apply them back onto the file.
How it works
Two mechanics transfer.
  • The chat “agent” was configuration — which prompt modules, which knowledge tools, which model — not a program you could drop into Figma. Mirroring it meant skills, then checks that only passed if the guidelines were actually used.
  • String-by-string review can approve a broken screen.interesting Early on, the plugin graded headline, body, and buttons each on their own. Together they still disagreed. The fix was treating the frame as one experience so title, body, and actions have to answer each other.

That second point is whole-screen review (Part 3), learned on the canvas.

Grounding
House content strategy, voice matrices, taxonomy, and product/legal branches — first via company search, later mirrored into skills for the plugin path.
Testing
Author-written checks for fake guideline use; designer feedback that chat still felt stronger. No public dataset.
Limits & gaps
  • Prototype, not a reference implementation.
  • Quality gap vs chat remained in early feedback — closing it needed more guidance and engineering time.
What to borrow
  • Write checks that only pass if your guidelines were actually used.
  • Grade the frame, not the string list.
  • Modular skills over one giant prompt when products need different terminology or legal branches.

Raven

An open toolkit an agent can call for design rules, voice systems, and audits that quote what went wrong · ravenmcp.ai · free and open source · checked 2026-09-12

Full detail
What it is

A local helper that plugs into coding agents and gives them design knowledge on demand: usability principles, UI patterns, design-system tokens, research methods — and a content layer with voice systems and patterns for errors, empty states, notifications, and form validation.

It is broader than UX writing. It belongs here because voice and content patterns are real tools the agent can call, and because its audits try to name the rule and quote the evidence.

Built by
An open-source project. Free under a permissive licence; no account required for the core toolkit.
Availability

Public. You add it to an agent with an install command; it runs on your machine through a package runner. Claude, Cursor, and other compatible agents can call its tools during a conversation.

Where it runs

Beside a coding agent while someone builds or reviews an interface. It can also help audit live pages and some native app screens against design rules.

What it does

For content design specifically, three capabilities matter:

  • Voice systems you can fetch — including voices modelled on GOV.UK, Shopify Polaris, Atlassian, and a conversational product voice — plus general UX-writing principles.
  • Content patterns for common surfaces (errors, empty states, notifications, form validation).
  • Taste and voice audits that return clear verdicts (block, warn, or pass), with a rule name and a quoted snippet of the offending text.
How it works

You describe what you want. The agent chooses among Raven’s tools — fetch a principle, fetch a pattern, run an audit, and so on — the same way it might search a codebase.

For voice work, a useful path looks like this:

  1. Calibrate what “good” means for this surface (how it should look and sound).
  2. Bind that profile to the project so later audits reuse it.
  3. Audit and read findings that say which rule failed and which phrase triggered it.

Their examples include blocking empty hype lines like “make every screen better” or “built for modern teams,” and asking for a concrete user and task instead. Whether or not you use Raven, that finding shape is worth copying: name the rule, quote the line, suggest the fix.interesting

Default voices are borrowed from well-known design systems. They are teaching wheels. Replace them with your own voice before you treat the audit as brand enforcement.

Grounding

Bundled design knowledge on your machine, plus optional project taste profiles you save locally. Not your private brand portal, unless you add it.

Output format

Tool answers in the agent conversation: explanations, pattern checklists, and audit findings with rule identifiers and quoted evidence.

Testing

Site demos and before/after examples. No public microcopy benchmark tied to the content layer was verified here.

Limits & gaps
  • Design-wide, not content-only. Easy for the writing signal to get lost among tokens and layout audits.
  • Starter voices are not your voice. Same trap as any preset pack.
What to borrow
  • Every content finding should name a rule and quote the line. “Feels off” is not actionable. “Voice: no hype — quoted phrase — say what the user can do” is.
  • Calibrate voice per surface (docs site vs app vs marketing) before you audit. One global “be on brand” instruction is how everything starts sounding the same.
  • Keep content patterns next to design patterns in whatever toolkit you build, so errors and empty states are not second-class citizens.

cd-agency content agents

17 content-design agents, one markdown file each, with typed inputs and outputs · GitHub · Adedayo Agarau · 4 stars · created March 2026, untouched since

Full detail
What it is
A set of 17 agents, each one written as a single markdown file and each covering one kind of content work. There is an error-message agent, an empty-state agent, one for calls to action, one for notifications, one for onboarding flows, one for localization, and so on.
Built by
Adedayo Agarau, as personal work.
Availability
Public. The README says MIT — a permissive open-source licence that lets anyone copy, change and use the code commercially, as long as the copyright notice stays attached.

There is no licence file in the repo to back that up though, which is why GitHub reports no licence at all.

Where it runs
You install the project and run an agent from the command line, or call it from Python, or reach it through the MCPModel Context Protocol — an open standard that lets an AI agent call external tools and data sources. A server exposes named tools, and any compatible agent can discover and call them. server that ships with it. It calls a hosted model, so you need to supply your own API key and you pay for the calls.
What you give it
Each agent declares its own inputs, and says which are required and which are optional. The error-message agent asks for the error scenario, and will also take technical details, a severity, who the reader is, and your brand guidelines if you have them.

At the command line that looks like cd-agency agent run error-message-architect -i "API returns 503 during checkout". You can also pipe text in from another command.

What it does
It returns a set of named fields rather than a paragraph of advice. The error-message agent returns the message itself, an ordered list of steps the user can take, a technical note for the engineer, and a tip for preventing the error next time.

Because the fields are declared up front, another program can read the answer without anyone having to parse prose.

How it works
Every agent file has the same two parts. At the top is a block of settings that a program can read: the inputs and outputs described above, the scoring tools this agent is allowed to call, the reference material it draws on, and a list of related agents to hand off to.

For example, the agents can call the voice checker tool, which uses one of four voice presets and checks if your voice aligns with the selected preset.

Below that is the part the model reads. There is a system prompt, then a section that tells the agent what to work out before it writes anything, then worked examples showing an input and the ideal answer.

For example, the error-message agent has to establish who sees the error, which interface element displays it and therefore how many characters it has, whether the user can fix it themselves, how severe it is, which platform it is on, and whether it will be translated.

Grounding
Three layers:
  • Four voice presets — Material Design, Shopify Polaris, Atlassian and Apple HIG — each with tone descriptors, do and don't rules, sample content, character limits and a terminology glossary. These are four well-known design systems, so what ships enforces Apple's or Atlassian's standards rather than yours. Pointing it at your own voice means writing a preset in the same shape.
  • A knowledge folder of 52 references, and each agent names the ones it draws on. The error-message agent lists plain language, cognitive load, usability heuristics, an error taxonomy and a Slack case study, among others.
  • Worked examples inside every agent file.
Output format
The named fields each agent declares, either printed at the command line or returned as structured data if you ask for it.
Testing
There is a test suite in the repo, so the code is tested. What nobody tests is the judgement, since nothing checks whether the messages these agents produce are ones a content designer would accept.
Limits & gaps
  • The voice it enforces is not yours until you write a preset of your own.
  • It never sees your product. You describe the situation to it in a sentence, so it works from your description rather than from the screen or the code.
  • Nobody appears to be using it. Four stars, five forks, and no commits since March 2026.
What to borrow
  • Make the agent ask before it assumes. The error-message agent is told that if it does not know what actually went wrong it must ask, and specifically that it may not replace one vague message with a different vague message. If the person insists on an answer anyway, it has to state its assumptions out loud first.
  • Write down what the agent should work out before it writes. Who reads this, which element shows it and how many characters that allows, whether the reader can fix the problem, and whether it will be translated. That list is the difference between a reviewer and a rewriter.
  • Declare the inputs and outputs as named fields. It forces you to decide what a good answer actually contains, and it means another tool can use the result.
  • Have each agent name the reference material it draws on, so you can see what is behind an answer and change it.
  • Give each agent a list of related agents. A tool that knows when to hand the work on is more useful than one that tries to cover everything.

cd-agency content lint

A packaged step that checks the changed files in a pull request and can block the merge · GitHub · Adedayo Agarau · created March 2026, untouched since

Full detail
What it is
A step you add to your build pipeline, which runs three specific checkers. It looks at the files someone changed in a PR, reports what it finds and can stop the merge (if needed).

It lives in the same repository as the 17 content agents, but it does not use them. Everything this step runs is ordinary code, and no model is involved at any point.

Built by
Adedayo Agarau, as personal work.
Availability
Public, with the same unresolved licence question as the agents — the README says MIT, and there is no licence file.
Where it runs
Build checks, on every pull request. You reference it from your own workflow file rather than copying its code into your repo.
What you give it
Seven settings. The three that decide how strict it is:
  • severity_threshold — the lowest severity worth reporting, written as error, warning or info. It defaults to warning.
  • fail_on_error — whether a finding at error severity should fail the check and block the merge. It defaults to true.
  • target_reading_grade — the reading level to aim at, as a school grade. It defaults to 8.

The others say what to look at: which files, by matching their names against patterns like **/*.json; which rules to switch on; and what kind of content this is, so that a button gets checked against button rules rather than general ones.

What it does
It asks the pull request which files changed, keeps the ones whose names match your patterns, and runs all three checkers over each of those files. Then it counts the findings that meet your severity setting, and fails the check if any of them are errors that you asked it to fail.
How it works
Three checkers run here, and all of them are ordinary code with no model involved. One measures readability by counting syllables and sentences, one applies a list of content rules, and one checks accessibility.

When it opens a file it reads all of it, not only the lines that changed. So if you edit one button label in a file holding two hundred strings, you get findings from all two hundred, including copy that was already there and that nobody in this pull request wrote. Those findings count towards the total, which means somebody else's old string can fail your check.

There is also an optional council, where several models score the same content and their answers are combined by weighted medianA way of combining several scores into one that ignores outliers. Unlike an average, a single model scoring wildly differently from the rest can't drag the result up or down. rather than by averaging. It needs at least two models to agree before it will return anything.interesting

Grounding
The rule checker carries its own content knowledge, written into the code as lists: action verbs that a call to action should start with, patterns that mean an error message offers a way out, passive constructions, a jargon list, a list of exclusionary terms, and a character limit for each kind of interface element.

The pass marks sit separately in a settings file — an overall score of 75 and a readability score of 65 — and either can be overridden for a particular agent.

Output format
A count of how many problems it found, and a full report as structured data. The decision to block is made on severity rather than on the score.
Testing
The repo has tests for the code. Nothing tests whether a passing score means the copy is actually good.
Limits & gaps
  • What it checks is generic. Reading level and rule matches are measures anyone could apply, so it will not catch a wrong product term or a sentence that is off-voice.
  • It only sees files in the repository. Copy that lives in a translation service, a content system or a design file never reaches it.
  • It reads each file as one block of text. It never looks at the structure of the code, so it cannot tell that a particular string is a button label or that it sits inside an empty state. The only way to tell it what it is looking at is a single setting that applies to the whole run, so every file in a pull request gets treated as the same kind of content.
  • It reports on copy you did not touch. Because it reads whole files, a small change can surface a backlog of older problems, and you have to decide whether to fix them or raise the threshold.
What to borrow
  • Let the checker be told what kind of content it is looking at. A checker that knows it has a button in front of it can hold button rules, like a character limit and an opening verb, without becoming a separate tool. cd-agency only lets you set this once for a whole run, which is too coarse to help much, so the version worth taking is one that carries the surface along with each string.
  • Separate reporting from blocking. One setting decides what gets mentioned and a different one decides what stops the merge, so a team can turn the volume up without turning the gate up.
  • Score with several models and combine by weighted median when a verdict matters enough to pay for the extra calls. It stops one model having a bad run and failing somebody's build.

Other writing tools

These were not built for interface microcopy. Borrow them for mechanics that transfer: paired writer and reviewer, rule packages you can install, corpus-based scoring, and deterministic scanners that catch machine-writing tells.

Metabase's docs-write and docs-review skills

A paired writer and reviewer for documentation, sharing one style guide · metabase/metabase · added Nov 2025, unchanged since Dec 2025 · skill collection active through Aug 2026

Full detail
What it is
Two agent skills sitting in Metabase's main repo: one that writes documentation, one that reviews it. Both read the same style guide.

They exist because documentation style drifts when many engineers edit it and nobody owns the long-form content. They were built for technical writing rather than product copy, so what transfers is the mechanics rather than the rules themselves.

Built by
Metabase, in the open, inside a 49k-star product repo.
Availability
Public and readable in full. Both SKILL.md files and the shared style guide are in the repo.
Where it runs
In a coding agent, on the repo. docs-review can also post to a GitHub pull request — see Output format.
What it does
Two skills, deliberately split:
  • docs-write — drafts and edits docs. Starts from three questions: who is this for, what do they need, and what did you struggle with when you learned it.interesting
  • docs-review — checks changes against the style guide, working through a checklist grouped by tone and voice, structure and clarity, links, formatting, code examples, and sentence construction.
How it works
  • Both skills pull in the same file@./../_shared/metabase-style-guide.md — so the rules live once and neither skill carries its own copy.
  • The reviewer cannot edit anything, and that is a permission rather than an instruction. Its frontmatter declares allowed-tools: Read, Grep, Bash, Glob — no Write tool. docs-write gets Write; the reviewer does not.
  • It is told to hold back. "Only flag issues worth mentioning — if it won't make a material difference to the reader, skip it."

The review checklist is specific enough to argue with. A sample of what it flags:

  • "Users" instead of "people" or "companies".
  • Telling readers something is cool instead of showing them.
  • Tasks described as "easy" or "simple".
  • Linking the word "here" instead of descriptive text.
  • Headings that name the topic instead of conveying the point — "Set SAML before adding users", not "SAML configuration timing".
  • Instructions that explain "why" before saying what to do.
Grounding
One file — _shared/metabase-style-guide.md — carrying voice and structure rules. No glossary and no product terminology.
Output format
It detects which surface it is on and formats accordingly. The skill checks whether the GitHub agent-tools review tool is available:
  • If it is — pull-request mode. Open a pending review, collect every issue first, post all comments in one batch, then submit as COMMENT rather than REQUEST_CHANGES so the review is non-blocking.
  • If not — local mode. A numbered markdown list in the conversation.

Numbering is mandatory, and the skill says why: it "allows users to efficiently reference specific issues (e.g., 'fix issues 1, 3, and 5') and track which feedback has been addressed."

Each issue carries a short title, the line number, the problem, and a suggested fix.

Testing
None. Nothing measures whether the reviewer's flags are right.
Limits & gaps
  • Long-form content, not UI strings. No component awareness, no character limits, no per-surface rules.
  • No deterministic checker. The checklist is applied by the model, not enforced by a linter.
  • No terminology source. The style guide carries voice and structure rules, not a product glossary.
What to borrow
  • Take the write tool away from your reviewer. Metabase's review skill lists the tools it is allowed to use: read, search and run. Write is not among them, so the reviewer cannot change the file even when it decides it should, where an instruction not to edit would have left that up to the model.
  • Ship writer and reviewer as a pair over one shared rules file, so the thing that drafts and the thing that checks can't disagree.
  • Number the findings, so a person can reply "fix 1, 3 and 5" and track what's been handled.
  • Let the output adapt to the surface. One skill, a batched non-blocking PR review where that is possible and a plain numbered list where it isn't.

Vale and its style-package registry

Checks a document against a style guide written as rule files · vale-cli/vale · 6,043 stars · active Aug 2026

Full detail
What it is
A program that reads a document, checks it against a set of writing rules, and prints every place it breaks them.

Alongside it there is a public library of style guides that have already been converted into those rules, so you can install a set rather than writing your own from scratch.

Built by
vale-cli, formerly errata-ai. It is the standard tool for this in the docs world, and the thing several tools in this report are built on top of — including GitLab's 53 rules.
Availability
Public and open source. The library of style packages is a separate repo, last updated July 2026.
Where it runs
Four places:
  • The command linevale README.md.
  • A build check, where a failing check can block a merge.
  • A code editor, through vale-ls, so problems get underlined as you type.
  • An agent, through the third-party Vale-MCP server.
What it does
Matches text against every enabled rule and reports each place a rule fired. There is no judgment in it beyond what a pattern can express, and it rewrites only where a rule declares a replacement.
How it works
Three steps to set up, then one command per run.

1. Write a config file naming the style packages you want. This is a complete one:

StylesPath = styles
MinAlertLevel = suggestion
Packages = Microsoft

[*]
BasedOnStyles = Vale, Microsoft

2. Run vale sync, which downloads the named packages into that folder.

3. Run vale on your files.

Grounding
The rule files in your styles folder — a built-in Vale style plus whatever packages you sync. No corpus, no examples, no model.
Output format
One line per match: the file, the line, the rule's name, the rule's message, and a severity — suggestion, warning, or error.

Take one seven-word sentence:

Click here to utilize the new dashboard!

With the Microsoft package installed, three separate rules match it:

RuleWhat it saysLevel
UIVerbs"Use 'select' instead of the input-specific verb 'click'."warning
Wordiness"Consider using 'use' instead of 'utilize'."suggestion
ExclamationPoints"Use exclamation points sparingly."suggestion

That is the whole output — a list of places a rule matched, with the rule that matched named.

Two of those three can fix themselves; one can't. Wordiness knows "utilize" becomes "use", so it can rewrite. UIVerbs cannot blindly swap "click" for "select", because "right-click" and "double-click" are correct — so its pattern carries explicit exceptions for them and it only flags.

What a rule actually is
A small YAML file.interesting

There are four kinds, and seeing them is the fastest way to understand what this tool can and can't do.

A swap list — "use this word, not that one." From Microsoft's terms rule:

extends: substitution
message: "Prefer '%s' over '%s'."
level: warning
action:
  name: replace
swap:
  "(?:okay|all right|alright)": OK
  "chat bots?": chatbot(s)
  "24/7": every day

Because a swap has a known right answer, this type can auto-fix — that is what action: replace declares.

Something that shouldn't appear. The whole exclamation-mark rule is one pattern:

extends: existence
message: "Use exclamation points sparingly."
level: suggestion
tokens:
  - '\w!(?:\s|$)'

A count inside a scope. The sentence-length rule counts words per sentence:

extends: occurrence
message: "Try to keep sentences short
          (< 30 words)."
scope: sentence
max: 30

A formula. The reading-level rule is plain arithmetic, not a black box:

extends: metric
message: "Try to keep the Flesch–Kincaid grade
          level (%s) below 8."
formula: |
  (0.39 * (words / sentences))
  + (11.8 * (syllables / words)) - 15.59
condition: "> 8"

Change the 8 and you have changed the standard.

Every rule also carries a link: to the human style-guide page it came from, so a flag can point at the reason it exists.

What's in the library
Sixteen packages.
  • Style guides converted into rules — Google's developer documentation style guide, the Microsoft Writing Style Guide, Red Hat's, Elastic's, and OpenShift's. None of them are maintained by the companies whose guides they encode; each carries a notice saying so.
  • General writing checks — proselint (4,565 stars) and write-good (5,084) for common problems, alex (5,100) and neighbor for insensitive or exclusionary language, and a Readability pack holding the standard reading-level formulas.
  • Markup support — AsciiDoc, MDX and Hugo packages, which teach it the difference between text and syntax so it doesn't try to copy-edit a code block.
Testing
Not measured, and mostly not the question — a pattern either matches or it doesn't, and the same text always produces the same findings. What nobody checks is whether the rule set you installed is the right one for what you write.
Limits & gaps
  • Long-form content only. No component awareness, no character limits, no per-surface rules, no notion of a screen.
  • It can only check what a pattern can catch. There is no judgment here — it will flag "alright" every time and will never notice that a paragraph is in the wrong order.
  • The company packages are documentation guides. Neither Google's nor Microsoft's covers button labels or error messages at the level a UI needs.
What to borrow
  • The four rule types are a useful sorting exercise for your own guide. Go through your rules and ask which are a swap, which are a banned pattern, which are a count, and which are a formula. Anything that fits none of the four needs a human or a model — and now you know which ones.interesting
  • Put a link on every rule, pointing at the page that explains it. A writer who disagrees with a flag can then read the reasoning behind the rule rather than guessing at it, and can see for themselves whether it was applied correctly.

writing-eval

A public implementation of a style profile built from a corpus of your own writing, used to score new text · GitHub · Python, local-only · created Aug 2026

Full detail
What it is
A command-line tool that checks a piece of writing two ways: against a fixed list of rules, and against a style built from your own past writing.

Point it at a folder of someone's articles and it learns their sentence rhythm and word choices.interesting Point it at a new draft and it tells you how far the draft sits from that voice.

Built by
Majestic Labs.
Availability
Public. CPU-only and offline by design — "It does not call a hosted model or upload the text."
Where it runs
Three ways: a local CLI, a build wrapper, and a coding agent (via a bundled skill).
What you give it
A draft to check. Optionally, first, a folder of writing you approve of — 25 pieces minimum, 40 or more preferred — to build a profile from.
What it does
Two checks that stack.

The rules. Regex detectors defined in YAML — real ones, from the bundled anti-AI overlay:

  • polish_vocab — a single regex matching about 60 words: delve, leverage, seamless, robust, tapestry, paradigm shift, and more.
  • throat_clearing — catches "here's the thing," "let's dive in," "at the end of the day."
  • generation_artifacts — catches a literal [INSERT...] placeholder left in by mistake, a ChatGPT tracking parameter, and "as an AI language model."
  • significance_markers — catches "that's the part that gets me," and ships with its own instruction for the fix: "Delete the sentence that labels the moment as significant; repeat the concrete detail instead."

34 rules ship by default; the anti-AI overlay above is opt-in and adds to them rather than replacing them.

The profile. A score for how far the draft sits from a body of writing you nominated as the target.

How it works
  • Without a profile it is a linter — the rules run and each finding names the rule that fired.
  • Building a profile records a fingerprint, not a copy of the text: sentence-length statistics, a repeated-opening rate, readability scores, vocabulary diversity, and the top 20 content words. Numbers describing the corpus, not the corpus itself.
    writing-eval profile build acme \
      --from posts/acme
    > built profile 'acme': 30 sources,
    >   15742 words -> data/profiles/acme
  • With a profile, a draft is scored against it across four dimensions, and the report says which one is off.

Their sizing rule: "at least 25 articles and prefer 40 or more"; at 40, they report coverage reaching 87.5%.

Grounding
Two sources, and you supply the second one. The 34 shipped rules (plus the opt-in overlay), and a profile derived from a corpus of writing you nominate. No model is involved in either.
Output format
Without a profile — one finding per line, each naming the rule that fired. Their own example, run on 15 words:
draft.md:1:1 [warn] metadiscourse_openers:
  Remove the metadiscourse opener and state
  the point directly. | span: In this article,
draft.md:1:21 [warn] polish_vocab:
  Replace overused polish vocabulary with
  specific language. | span: delve

Underneath the findings it prints a metrics block — word count, mean sentence length, sentence-length variance, and separately, marked "informational," Flesch reading ease and grade. Those informational numbers are not part of the score; they are there to read alongside it.

With a profile — a scored report. Real numbers from their documented example:

Article score (heuristic): 86/100
Moderate alignment

Clarity and directness   25/25
Readability               23/25
Rhythm and structure      13/25
Vocabulary and style      25/25
Total                     86/100

Issues to improve:
1. Sentence rhythm differs from
   the target profile.

Four sections, 25 points each. This draft lost most of its points on rhythm and structure — the report names which dimension is off, rather than only an overall number.

The report states its own limit: "This score measures detected style patterns and alignment with the target profile. It does not measure factual accuracy or overall content quality."

Testing
The only tool in this report that ships a benchmark rig. It contains:
  • Decision gates.
  • A noise floor calculation — the smallest score difference that means anything.
  • A system comparison script.
  • Documented thresholds.
  • A study of how profile quality varies with corpus size.

Whether the findings are acceptable is left to a separate wrapper script — the tool never fails a build on its own judgment of quality.

Limits & gaps
  • Built for long-form content. The readability and rhythm metrics don't transfer to a four-word button.
  • It needs a corpus. 25–40 pieces of authorized writing, which a product's shipped UI copy could supply — but nobody has tried.interesting
  • It scores style, not correctness. Stated in its own report: nothing here measures whether the writing is accurate or any good.
What to borrow
  • A corpus-derived profile as a voice oracle — the thing Windy Road concluded it needed and didn't build.
  • Noise-floor discipline. State the smallest score difference that means anything, so nobody reads a two-point move as progress.
  • Let the checker report, and let someone else decide what fails the build. Finding problems is a successful run, not a failure — so the question of whether those findings are bad enough to block a merge stays with the team, rather than the tool's idea of acceptable becoming everyone's policy without anyone deciding it.

slop-no-more

Finds the phrases that make writing sound machine-written · GitHub · MIT · Python, standard library only · created 23 July 2026, last commit 27 July 2026

Full detail
What it is
A program that reads a piece of writing and points at the phrases that make it sound machine-written, with a suggested fix for each one.

There is no AI inside it. It matches patterns, so the same text always gets the same answer.interesting

The author's reason for building it that way: you can tell a model "don't write like that" in the prompt and the draft still comes back with the same tells, and for a rule like "no em dash," asking a model to check is slower and less certain than testing for the character. His words: "Stop asking AI to do the checks that do not require intelligence."

Built by
Caleb Stacy, a writer.
Availability
Public and fully readable. No model, no API key, no network call, and no dependencies to install beyond Python itself.

Four ways in: pip install, a git clone that works as a skill with no further setup, a zip upload to Claude, or attaching the single scanner file to a chat that can run Python.

Where it runs
Four places, same code in each:
  • A command in your terminal.
  • A build check that can fail a pull request.
  • An agent skill, with two modes — Build before drafting, which hands the writer or model the rules up front, and Review after, which scans the finished draft.
  • A chat that can run Python — attach the scanner file and your draft.
What you give it
Markdown or plain-text files — a draft, an article, a README.

It is built for long-form content, not for UI strings. Pointing it at product copy is an extension of the tool, not a documented use. What transfers cleanly to content design is the shape of its rules, described below.

What it does
You point it at a file, and it finds the phrases in it that read as machine-written. Three different kinds of thing:
  • Exact words and phrases — "delve," "In conclusion," and other stock openings. A plain list.
  • Sentence shapes — 26 families of them, each a recognisable move rather than a fixed phrase. "Most teams struggle with…" and "Many organisations find…" are the same move with different words.
  • Whole-document habits — things no single sentence reveals: how much sentence length varies, how many em dashes per thousand words, how often ideas arrive in threes.
How it works
Let's look at an example: the rule "anonymous authority". It has three parts:
  • The rule, in words a person can follow: no authority without an authority. Don't write "research shows" unless you say whose research.
  • The patterns that catch it: "research shows," "experts agree," "studies suggest." This is the part a computer runs.
  • The fix to apply: name the source, or drop the appeal and make the claim yourself.

Splitting the rule this way means a writer can read it, a script can run it, and a reviewer knows what to do about a match — without any of the three needing the other two.

Two more of the 26, to show the range:

  • Cataphoric evaluation — "here's why it matters," "the key insight is." Rule: don't announce that a point is important before you have made it. Lead with the point.interesting
  • Endophoric command — "let that sink in." Rule: don't tell the reader how to react to your own text.

Three things narrow what it will flag:

  • Evidence nearby clears a suspicion. The "research shows" flag switches off when a real citation appears in the same claim.
  • It doesn't flag you for quoting other people. Code blocks, block quotes, and quoted phrases are hidden from the scan first.
  • Silencing a rule is recorded. You can tell it to skip a line, and every skip appears in the report rather than vanishing from it.interesting

All the detection sits in one filescanner.py, about 68 KB — with two thin wrappers pointing at it: an installed slop command for the terminal and the build check, and a 12-line script for people who don't install anything, which is how the agent skill calls it. One file behind two wrappers means the agent and the build check run the same code, so they can't reach different verdicts.

Grounding
Its own catalog and nothing else: a word list, 26 sentence-shape families, and a set of document-level statistics. No corpus, no style guide, no model.
Output format
For every phrase it recognises it prints four things — how serious it is, where it is, the phrase itself, and the fix — then gives the whole file a verdict.

Its own sample output, trimmed and re-wrapped to fit:

examples/sample-slop.md
verdict: HEAVY SLOP
density: 390.41 hits / 1k words
high: 7   medium: 5   gate: FAIL

[high] manufactured-antithesis  line 3
  "not about wording, it's about"
  fix: Name who asserted X, or delete
       the denial and state Y as a
       positive claim.

[high] phantom-population  line 3
  "Most teams"
  fix: Cite the source and number,
       narrow to observed cases, or
       delete the claim.

[medium] benefit-cascade  line 5
  "foster engagement while empowering"
  fix: Replace the benefit stack with
       the mechanism.

So "Most teams" is flagged not because those words are banned, but because it claims what a population does without naming one. The fix says so.

The file-level verdict is one of four: CLEAN, MOSTLY CLEAN, SLOP PRESENT, HEAVY SLOP. Under 120 words it reports plain counts instead of a rate, because a density figure on two sentences is noise.

The gate line is for builds. You choose the severity that should fail a pull request, and the command exits 0 for pass or 1 for fail so a build system can read the answer.

Every finding carries its repair, so the report is a worklist rather than a verdict you have to interpret.

Testing
No accuracy figures — but a discipline for adding rules, which is more than most here have. A new rule has to arrive with three things:
  • An example it should catch.
  • A near-miss it must not catch — an innocent sentence that looks similar.
  • Tests, so a later change can't break the rule unnoticed.

The catalog also logs cases a human caught and the scanner missed — including one from the project's own launch post, where a sentence passed the scan but not the author's ear.

And every scan stamps the exact rule set it ran. Two scans are only comparable if that stamp matches, so tightening a rule can't be mistaken for the writing getting worse.

Reported results
No adoption to report. Checked on the repo: 0 stars, 0 forks, no open issues, and the last commit was 27 July 2026 — four days after it was created.

Nobody has written about using it, and the author publishes no accuracy figures. It is in this report for the shape of its rules, not for traction.

Limits & gaps
  • It sees surface forms, not quality. It can't tell you whether the writing is good, true, or persuasive — or who wrote it.
  • A match means the pattern is present, not that the sentence is guilty. A legitimate sentence can wear the same shape, and a paraphrase can slip past — which is why every finding shows the matched text for a person to judge.
  • No accuracy figures. The author claims no precision or recall, and says so plainly.
  • English long-form content only.
What to borrow
  • The three-part rule shape — the rule in words, the pattern that catches it, the fix to apply — for your own recurring culprits.interesting
  • Require a near miss with every rule — an innocent sentence that looks similar and must not be flagged. It is the test for false alarms, and writing one is what makes you find the edge of the rule.

textlint's AI-writing preset

Detects the patterns that make Japanese text read as machine-written · textlint-ja/textlint-rule-preset-ai-writing · 1.1k stars · checked Aug 2026

Full detail
What it is
A rule pack for textlint, a linter for natural language that works the way ESLint works for code.interesting You install textlint, then install rule packs into it.

This pack's rules all answer one question: does this Japanese text read as though a model wrote it?

Built by
textlint-ja, the Japanese textlint community.
Availability
Public on npm and GitHub, with semantic versioning and a changelog — so a team can pin a version and read the diff before upgrading.
Where it runs
Wherever textlint runs: the command line, a build check, or an editor.

It also runs as an agent tool servernpx textlint --mcp — which lets an agent call it directly.

What it does
Flags the tells of machine-written Japanese:
  • Mechanical bold-label list formatting.
  • Emoji bullets.
  • Hype vocabulary.
  • Redundant bold emphasis.
  • English-style colon-before-block constructions.
  • General redundancy, passive voice, and over-abstraction.

Note what several of those are: formatting habits, not word choices. Bold labels and emoji bullets are treated as content defects because they are how generated text looks.

A real before/after from their own documentation:

Detected (bold-label bullets, emoji bullets):
- **Important**: this is an important item
- ✅ Completed item
- 🚀 Ready to start

Rewritten as natural:
- Important item: this is an important item
- Completed item
- Ready to start
How it works
  • Rules run over a parsed syntax tree rather than regex over raw characters. For Japanese that isn't a nicety — it's what makes the rules possible, since the language has no spaces between words.
  • Every rule is individually configurable, with allowlists.
  • The agent-tools mode turns the linter into something the writing agent calls on its own draft, so the loop becomes generate → lint → revise inside one turn instead of a check that runs afterwards.
Grounding
Its own rule files and nothing else. No corpus, no examples, no model.
Output format
Standard textlint output — each finding carries its location, the rule that fired, and that rule's message:
Flagged: "革命的な技術で業界を変えます。"
  (Revolutionary technology will change
  the industry.)
Message: "'Revolutionary' is potentially
  an overstated expression. Consider
  describing the specific improvement
  instead."

textlint ships alternative formatters for other destinations — json, junit, checkstyle, github — so the same run can report into a build check.

Testing
Deterministic. The same text produces the same findings, and no model is involved.interesting

What nobody measures is whether the rules catch what they claim to, or how often they fire on writing that was fine.

Limits & gaps
  • Japanese only. The rules are language-specific and don't transfer.
  • No English equivalent exists at this level of detail.
  • Written for documents, not interfaces. It checks articles, READMEs and docs pages. It has no idea what a button label or an error message is, so it can't apply a length limit or a per-component rule.
What to borrow
  • Encode the tells of machine writing as patterns — formatting and vocabulary habits — so you can catch them without paying for a model call on every paragraph.
  • Keep this as a scanner, not a stylist. It flags likely machine texture; it will not invent a better empty state.
  • Ship language-specific packs. English AI-tells and Japanese AI-tells are not the same list; borrow the idea of a pack, not a universal regex.

Vercel's writing-guidelines skill

A skill that fetches its rules from a URL at review time · SKILL.md · ~46,800 installs · verified 2026-08-23

Full detail
What it is
A skill that reviews long-form content against Vercel's writing guidelines and reports findings in a terse file:line format.
Built by
Vercel, first-party, in their agent-skills collection.
Availability
Public. By install count it is the largest content-adjacent skill in this report by a wide margin.
Where it runs
In a coding agent — any one that loads skills. Pointed at a file or a glob pattern. Triggers on phrasings like "review my docs", "check writing style", "audit prose", "check this page against the writing handbook".
What it does
Checks documentation pages against Vercel's handbook and lists every place they diverge from it, one line per finding.
How it works
The skill is a shim. Step one of its own instructions is "Fetch the latest guidelines from the source URL below."
  • The URL points at a raw file in a separate repository.
  • It is fetched over the web before each review.
  • The rules — and even the output format — live in that fetched document, not in the skill.

So the installed artifact never goes stale. Vercel edits one markdown file in another repo and every one of ~46,800 installations picks up the change on its next run, with no reinstall, no version bump, and no marketplace update.interesting

Grounding
A single 14 KB markdown document — Vercel's docs handbook, described in it as "a living, non-exhaustive list" of the decisions that make documentation work.

What is actually in it:

  • Planning rules. Every page starts from a five-section plan, and declares a content type — Tutorial, How-to, Reference, Conceptual, Troubleshooting, or Landing. "The type drives the shape; one page does one job."
  • Voice rules with tests attached. For active voice: append "by monkeys" — if "the page will be updated by monkeys" parses, rewrite it. Use "you," never "the user." Target under 20 words a sentence. Contractions encouraged.
  • Banned words, with the reason. easy, simple, quick — "they sound friendly but pressure the reader." Replace with something concrete: "one command", "default settings".
  • Tone per content type. A tutorial is "warm, encouraging… walking a new colleague through their first deploy." A how-to is "terse, direct. The reader is mid-task. Get them out." Troubleshooting is "empathetic but not apologetic."
  • Structure rules. Sentence case for page headings, title case for nav labels. Every page opens with a one-paragraph summary. Acronyms spelled out on first use. Three or more list-shaped items in a paragraph become a list.

The tone-per-content-type table is the part with no equivalent in any content-design tool here: five named document types, each with its own voice.

Output format
Findings grouped by file, one per line, each as file:line — a format VS Code turns into a clickable link. Their own example:
## content/docs/sandbox.mdx

sandbox.mdx:1   missing meta.contentType
sandbox.mdx:24  passive voice
                ("the sandbox is created…")
sandbox.mdx:31  banned word "easy"
sandbox.mdx:47  "..." → "…"
sandbox.mdx:102 H2 "Caveats" too generic
sandbox.mdx:118 em dash in prose, replace
                with colon/comma

No prose, no severity levels, no summary. A list you work down.

The format itself is defined in the fetched document, not in the skill — so Vercel can change how every installation reports findings by editing one remote file.

Testing
None. No eval ships with the skill, and nothing checks whether a flagged line is really a violation.
Limits & gaps
  • Long-form documentation, not UI strings. No component awareness, no character limits, no per-surface rules.
  • No deterministic checker. A model applies the handbook, so two runs over the same page can differ.
  • The fetch-fresh trade has a cost. Useless offline, breaks if the URL moves, and no way to pin a version — a rule change lands on every user immediately whether they wanted it or not.
What to borrow
  • Fetch the rules from a URL on every run, so the skill cannot drift away from the living style guide. A copied markdown file in the skill folder will rot the week after someone edits the real guide.
  • Treat the skill as a reviewer of long-form, not of UI strings. Borrow the “always load the current guide” move; do not pretend the same checklist covers button labels and empty states.
  • Make the source of truth obvious in the skill text — name the URL, say what happens if it fails to load, and refuse to invent house style from memory.

GitLab's docs standards, machine-readable twice

53 Vale lint rules, plus the whole style guide served as raw markdown · gitlab-org/gitlab · verified 2026-08-23

Full detail
What it is
GitLab's documentation style guide, published in two forms a machine can use.
  • As rules a program runs. Each rule is a small file saying what to look for and what to say about it, so a script can check a document and report where it breaks the guide.
  • As the guide itself, in plain markdown at a URL, so anything can fetch and read the whole thing in one request.
Built by
GitLab's technical writing team.
Availability
Fully public. The Vale config and its 53 rule files are in the main repo, and the style guide is fetchable as markdown.
Where it runs
Three places, all running the same rules:
  • In the build, on every merge request.
  • At the command line.
  • In a code editor — VS Code, Neovim, or anything else that speaks the Language Server Protocol, through vale-ls. Violations appear as you type, the way a spelling mistake gets underlined.
What it does
Checks a document and reports what breaks the style guide, line by line. It reads a page, applies 53 rule files, and prints each problem with its location.

What those rules actually catch, by what they are named:

  • Sentences that are too long or too hardSentenceLength, ReadingLevel, Wordy, Simplicity.
  • Sentences a reader can misparseUnclearAntecedent catches an "it" or "this" whose subject is ambiguous. MeaningfulLinkWords catches link text like "here" that says nothing out of context.
  • House conventionsOxfordComma, FutureTense, LatinTerms (no "e.g." or "i.e."), BadPlurals, InclusiveLanguage.
  • Plus word-swap lists and a spelling-exceptions file.

Separately, the guide is fetchable as markdown. Append /index.md to the docs URL and you get 94 KB of text/markdown — the whole current style guide in one request.

How it works
  • The rules live in the repo under doc/.vale/gitlab_base/, driven by a root .vale.ini: MinAlertLevel = suggestion, applied to all markdown, with per-path overrides for API fragments and release notes.
  • Their agent instructions name which model should write. Rather than the main agent drafting human-facing long-form content itself, it hands that work to a smaller, less capable model, briefs it with the facts and constraints, then checks the output for accuracy. Their stated reason: "high-capability models tend to produce dense, jargon-heavy prose."
  • A style decision, not a cost-saving one. They picked a weaker model because it writes more plainly.interesting
Grounding
The style guide and nothing else — 53 rule files, the word-swap lists, and a spelling-exceptions file, all in the repo. No corpus, and no model on the checking side.
Output format
Standard Vale output: one line per match with the file, the line, the rule that fired, its message, and a severity.
Testing
Deterministic, so the same page always gets the same answer — and the check is binding, since Vale runs on every merge request and can fail the build on reading level or wordiness.

What nobody measures is whether these are the right 53 rules, or whether the smaller-model instruction actually produces plainer prose.

Limits & gaps
  • Scope: the Vale rules govern documentation, not UI strings.
What to borrow
  • Publish your style guide at a URL that returns markdown, not only HTML. GitLab's docs hand back the whole guide as plain text if you add /index.md to the address, so an agent fetches it in one request instead of picking its way through a web page.
  • Push pattern matching further into prose than it looks like it can go. A pattern can check things that sound like judgment calls: wordiness, reading level, sentence length, and sentences where it isn't clear what a word like "it" refers to.

Inspiration from other disciplines

None of these are writing tools. They solve adjacent problems — design critique, model safety, content moderation, engineering ops, market research, dataset curation. What makes them worth reading is the mechanism: each one solved a problem content design also has, and the way they solved it can be lifted out of its domain and applied to ours. Read How it works first; the product names are secondary.

Anthropic’s content-policy compiler

A worked example showing how to turn a written policy document into code that checks content automatically · claude-cookbooks

Self-hostedInspiration
Full detail
What it is

Most moderation policies exist as a document a human reads. This example has a model read that document once and turn it into a checklist of concrete, testable rules. After that one-time step, checking new content against the rules is just running code — no model needed for every check.

It is not a UX-writing product. It earns a card because content design has the same shape of problem: a fuzzy style guide that people want to enforce without paying for a model call on every string.

How it works

Teach the sequence, because the sequence is the lesson:

  1. A model reads the policy and proposes a set of precise, testable checks.
  2. A human (or a review step) accepts what can be made precise and keeps a list of what cannot.
  3. Plain code runs those checks forever after — same input, same answer, no guessing tax.

The failure mode it avoids is “ask the model again every time.” That feels smart and produces drift: Tuesday’s “professional tone” is not Wednesday’s.

What to borrow
  • Use the model to translate, then let plain code do the checking. The expensive step — reading a fuzzy policy and turning it into precise rules — happens once. Every check after that is fast, free, and repeatable.
  • Every check tells you exactly which rule it broke. Rather than a single pass/fail verdict, you get a record you can point to and argue with.
  • The most useful output is the list of things it couldn’t turn into rules. Some sentences in a policy document are too vague to become a precise check.interesting Printing that list — “these parts of the policy still need a human to interpret” — tells you exactly where your automation runs out. For a style guide, that list is your agenda for hooks, skills, and human review.

Duolingo’s Slack agent

An internal Slack bot for engineers, released as open source, that Duolingo also uses to test its own answers before sending them · repo · writeup

Chat assistantInspiration
Full detail
What it is

A bot that lives in Duolingo’s Slack and answers engineers’ questions, checks on system problems across their monitoring tools, and does small routine engineering tasks on request.

Before it replies, a second AI step double-checks its answer for mistakes like broken links or wrong names. That second step is why content designers should care: it is a checker that is not optional.

How it works

Generation and verification are separate jobs. The first step drafts; the second step only looks for named classes of error. When a human marks an answer wrong, that case can become a permanent test — so the suite grows from real failures instead of from imaginary ones.

Their checks are defined in YAML (plain structured text), so adding a new verification is writing a config file, not shipping a new program.

What to borrow
  • Every time someone marks an answer wrong, save it as a permanent test. That one habit builds a growing set of real, hard cases for almost no extra work — you’re not running a separate project to collect test data, you’re just keeping what users already told you.interesting
  • Make new checks a matter of writing a config file, not writing code. So adding one more thing to verify doesn’t require an engineer to write and ship new code; anyone can add a file.
  • Separate “draft” from “verify before send.” The same split helps a content assistant that would otherwise sound confident while inventing a product name.

claude-persona

Builds a panel of fake test users, each one run completely separately so they can’t see or influence each other · GitHub · MIT · 49 stars

Agent skillInspiration
Full detail
What it is

A tool that invents a panel of realistic fictional people — with names, ages, jobs, personalities — then “interviews” each one about a design or a piece of copy, and tallies up which option they preferred.

Use it as a stress test for wording choices, not as a substitute for talking to real people. The mechanism is what transfers.

How it works

Each fake persona runs as a fully separate process, with no shared memory between them. If all your personas run inside one conversation, they can end up echoing each other or converging on one answer, which defeats the point of asking several different “people.”

Isolation is the architecture. Without it, you have one opinion wearing five hats.

What to borrow
  • Run each fake persona as a fully separate process, with no shared memory between them. Independence is what makes the panel mean anything.
  • Base the personas on real user research, and ask what they’d do, not what they think of the copy. A fake persona can easily be prompted into saying it likes something. It’s much harder to get a consistent, believable answer to “which button would you actually click,” which makes that a more honest test.interesting

Designer Skills Collection

107 small design skills, each one automatically checked to make sure it doesn’t overlap with the others · GitHub · MIT

Agent skillInspiration
Full detail
What it is

A library of 107 small, single-purpose design skills — each one does one narrow thing — plus a smaller number of “commands” that string several skills together into a full workflow, like a recipe calling on individual ingredients.

Content teams that are about to publish twenty microcopy skills face the same problem this repo solved: skills slowly start describing the same job in different words.

How it works

Every skill’s description must say what it does and where it stops — specifically, what its closest neighboring skill covers instead. An automated check runs whenever something changes and catches descriptions that have started to overlap.

Skills stay small; commands stay the place where sequencing lives. That split is what keeps a large library editable.

What to borrow
  • Force every skill’s description to say what it does and where it stops, then run an automated check for overlap. That combination is what lets many small skills stay distinct instead of slowly duplicating each other.
  • Keep single-purpose skills separate from the workflows that use them. A skill is one narrow capability; a command is the repeatable sequence that calls on several skills in order. Fix one skill without rewriting every workflow that happens to use it.

bco-signals

A running list of job postings that an AI agent updates and categorizes on its own, following a strict written rulebook · GitHub · published site

Inspiration
Full detail
What it is

An agent keeps a public, constantly updated dataset of job postings, deciding by itself which postings belong and how to tag them — all according to a detailed policy document a human wrote once.

Lifted into content work, it is a model for governing a growing library of patterns, glossary terms, or approved strings without letting the agent invent categories every Tuesday.

How it works

The default answer is “no.” A new item is rejected unless it actively meets the stated criteria. Anything turned away is still recorded, with a note naming which criteria would have applied, so the same item isn’t assessed from scratch next time.

New categories are not invented on first sight. The agent must see the same pattern in at least two separate postings before it may create a new label — and the bar is “would a second reader independently notice this as a distinct, recurring pattern?”

What to borrow
  • Start from “no,” not “yes.” Adding everything unless a reason turns up to remove it later is how libraries rot.interesting
  • Don’t let the agent invent a new category the first time it sees something new. Applied to a library of content patterns, this is exactly the discipline that stops a tagging system from growing new categories nobody approved.