Brand Voice — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Brand Voice (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Brand writing enforcement for Claude Code — automatic, configurable, zero-friction.
Every time Claude writes or edits a Markdown file, brand-voice checks it against your brand guidelines and signals Claude to fix violations before the file saves. No manual review. No rule reminders in every prompt.
brand-voice demo
Claude reads the violation list, corrects the file, and retries the write — automatically.
Your brand guidelines live in a doc somewhere. Claude doesn't read them unless you paste them into every prompt. Even then, the rules drift over time.
brand-voice makes the rules structural:
.brand-voice-ignore for whole files, <!-- brand-voice-disable-line --> for individual linesnpm install -g brand-voiceOr run without installing:
npx brand-voice@latest checkRequires Node.js 18+.
Run the setup skill inside any Claude Code session:
/brand-voice-setupThe skill does everything:
brand-guidelines.md to your projectCLAUDE.md.claude/settings.json.mcp.jsonAfter setup, every .md and .mdx file Claude touches is checked automatically.
# 1. Install
npm install -g brand-voice
# 2. Create brand-guidelines.md in your project root (see schema below)
# 3. Register the hook
brand-voice setupThree components work together:
| Component | What it does |
|---|---|
PostToolUse hook (brand-voice-check) | Runs after every Write/Edit/MultiEdit on .md/.mdx; exits 2 with violations so Claude auto-corrects, exits 0 when clean |
MCP server (brand-voice-mcp) | Exposes analyze_readability and apply_suggestions for on-demand analysis and word-level fixes |
CLI (brand-voice) | Standalone checker for CI pipelines, ratchet baselines, and GitHub PR annotations |
| Rule | Severity | Description |
|---|---|---|
| Forbidden terms | error | Whole-word, case-insensitive match — blocks the write |
| Avoid terms | warning | Same matching — signals a preferred alternative |
| Sentence length | warning | Configurable max words per sentence (default: 25) |
| Passive voice | warning | Auxiliary + past-participle pattern detection |
| Readability grade | warning | Flesch-Kincaid grade per sentence vs. your target |
Code blocks, inline code, indented blocks, and table rows are never checked — only prose.
Never checked: physical line length or line breaks. The CLAUDE.md injection always includes a formatting rule telling Claude to write continuous paragraphs and let the renderer word-wrap, but the analyzer itself has no line-width rule and never will — sentence length is measured in words, not characters or lines, so hard-wrapped and unwrapped prose score identically.
| Code | Meaning |
|---|---|
0 | No violations — file accepted |
2 | Violations found — Claude reads output, corrects, and retries |
Exit 1 is never used (it aborts the session rather than triggering a retry).
One Markdown file holds your entire brand configuration. Keep it under 600 words so it fits cleanly in context.
# Brand Guidelines
## Persona
Who you are and who you write for.
## Tone & Voice
- Direct, honest, clear
- Person: second ← "first" | "second" | "third"
- Voice: active ← "active" | "passive"
- Sentences: max 25 words
- Contractions: yes ← "yes" | "no"
- Exclamation marks: no
## Vocabulary
**Always use:** Acme, Acme Platform, APIs
**Avoid:** leverage, utilize, synergy, seamless
**Forbidden:** [competitor names, unverified claims]
## On-Tone Examples
> Connect your data in minutes — Acme handles the routing.
## Off-Tone Examples
> Leverage our cutting-edge platform to seamlessly integrate.
## Visual Identity
- Primary color: #006EFA
- Secondary color: #0050C3
- Accent color: #FF9DFF
- Background color: #FFFFFF
- Text color: #282828
- Logo (light): https://cdn.example.com/logo-light.svg
- Logo (dark): https://cdn.example.com/logo-dark.svg
- Heading font: Inter
- Body font: Source Sans Pro
## Formatting Rules
- Heading style: sentence case
- Oxford comma: yes
- Readability target: 8th grade
## Quick Reference
Repeat your top 5 rules here. This section appears last —
where LLM attention is highest — to reinforce critical rules
against context-window attention drop-off.See example/brand-guidelines.md for a complete working example.
## On-Brand Examples and ## Off-Brand Examples are accepted as aliases for ## On-Tone Examples / ## Off-Tone Examples. All other section names are case-insensitive exact matches.
The hook and CLI search for brand-guidelines.md in this order:
~/.claude/brand-guidelines.md (user scope — enforces rules across all your projects).brand-voice-ignoreCreate a .brand-voice-ignore file in your project root. Uses gitignore-style patterns:
# Auto-generated content
dist/
CHANGELOG.md
# Agent prompt files — intentional brand vocabulary exceptions
data/prompts/**
# Vendor docs
vendor/<!-- brand-voice-disable-line -->Add this comment anywhere on a line to suppress all violations on that line. Useful for one-off exceptions where the violation is intentional.
analyze_readabilityCheck a file or inline text for violations and readability scores.
Inputs:
| Field | Type | Required | Description |
|---|---|---|---|
file | string | one of file/text | Absolute or relative path to a .md/.mdx file |
text | string | one of file/text | Inline Markdown to analyze |
cwd | string | no | Working directory for locating brand-guidelines.md |
Returns: { filePath, passed, violations[], readabilityScores, visualIdentity }
apply_suggestionsApply safe word-level substitutions for forbidden/avoid terms. Does not fix sentence length, passive voice, or grade — those need human judgment.
Inputs:
| Field | Type | Required | Description |
|---|---|---|---|
file | string | yes | Path to the file to fix |
dryRun | boolean | no | Preview diff without writing (default: false) |
Returns: diff + change list (dry run) or confirmation + change list (live)
Tip: Run dryRun: true first to preview, then apply.
brand-voice works independently of Claude Code — add it to any pipeline.
Check all `.md` files:
npx brand-voice@latest checkCheck only files changed in the current branch:
npx brand-voice@latest check --changed-onlyGitHub Actions inline annotations (PR diff comments):
npx brand-voice@latest check --reporter github-pr-reviewRatchet enforcement — block regressions without requiring a clean slate:
# Run once, commit the file
npx brand-voice@latest baseline --save
# In CI: fail only if violations increase above baseline
npx brand-voice@latest check --baseline .brand-voice-baseline.jsonExample GitHub Actions workflow:
name: Brand Voice
on:
pull_request:
paths: ['**.md', '**.mdx']
jobs:
prose:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- run: npx brand-voice@latest check --changed-only --reporter github-pr-reviewExit 0 = clean or within baseline. Exit 1 = errors found or baseline exceeded.
brand-voice <command> [options]
Commands:
check [file] Check a file or all .md files in cwd
setup Print instructions to run /brand-voice-setup in Claude Code
import <file> Normalize a brand-guidelines.md into cwd
baseline --save Save current violation count as ratchet baseline
vale-sync Check that the Vale binary is available
Check options:
--changed-only Only check files changed in git (requires git)
--baseline <file> Compare against a baseline JSON file (ratchet check)
--reporter github-pr-review Emit GitHub Actions annotation formatimport { parseGuidelines, analyzeText, loadGuidelines } from 'brand-voice';
const guidelines = loadGuidelines(process.cwd());
if (guidelines) {
const result = analyzeText(markdownString, 'doc.md', guidelines);
console.log(result.violations); // Violation[]
console.log(result.readabilityScores); // ReadabilityScores
console.log(result.passed); // false if any error-severity violations
}See src/types.ts for full type definitions.
| Scenario | What to do |
|---|---|
| Solo developer | Run /brand-voice-setup once per project; commit brand-guidelines.md |
| Team | Commit brand-guidelines.md, .claude/settings.json, and .mcp.json; teammates get enforcement on git pull |
| Global (all projects) | Run /brand-voice-setup with the global flag; writes to ~/.claude/brand-guidelines.md |
| claude.ai (browser) | Setup skill outputs a paste block for Claude Project instructions — no hook or MCP needed |
| Enterprise / CI | Use brand-voice check in pipelines; commit .brand-voice-baseline.json for ratchet enforcement |
/brand-voice-setup or written manuallyvale-syncBug reports, feature requests, and pull requests are welcome. See CONTRIBUTING.md for setup instructions, key invariants to preserve, and code style guidance.
MIT — see LICENSE.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.