blog-brand
agricidaniel/claude-blog
Generate durable BRAND.md and VOICE.md files to establish consistent editorial voice and positioning across blog workflows.
What is blog-brand?
blog-brand creates two persistent context files (BRAND.md and VOICE.md) that the blog orchestrator auto-loads for writing, planning, and strategy commands. Use it to codify your audience, positioning, editorial rules, and voice patterns in one canonical source that survives across sessions.
- Generates BRAND.md with audience definition, positioning, editorial do/don't rules, taboo phrases, and competitor differentiation
- Generates VOICE.md with pronoun stance, lexical rules, headline patterns, and voice fingerprint metrics
- Runs interactive 5-step interview (audience, positioning, editorial rules, topic scope, voice) with pre-fill from blog-persona if present
- Displays current BRAND.md and VOICE.md contents or reports missing files
- Updates existing files while preserving structure and refreshing the last-updated timestamp
How to install blog-brand
npx skills add https://github.com/agricidaniel/claude-blog --skill blog-brand- blog orchestrator skill installed (blog-brand is a sub-skill)
- Optionally: blog-persona skill with existing persona JSON (auto-fills voice section)
How to use blog-brand
- 1.Run `/blog brand init` to start the interactive 5-step interview
- 2.Answer prompts for audience, positioning, editorial rules, topic scope, and voice (or accept pre-filled defaults from blog-persona)
- 3.Review the generated BRAND.md and VOICE.md files in your project root
- 4.Run `/blog write`, `/blog rewrite`, `/blog brief`, `/blog outline`, `/blog calendar`, or `/blog strategy`—the orchestrator will auto-load both files into the system prompt
- 5.Update either file anytime with `/blog brand update` to re-run the interview with current values as defaults
Use cases
- Establish editorial guidelines before launching a multi-author blog to ensure consistent voice across all posts
- Codify competitor differentiation and anti-positioning so writers never confuse your brand with rivals
- Lock down taboo phrases and required disclosures (affiliate, AI-content, conflict-of-interest) in one place
- Pre-fill voice metrics from blog-persona JSON and convert structured persona into readable prose for human reference
- Onboard new writers by giving them a single canonical source for audience, tone, and editorial boundaries
- Blog editors and content strategists setting up editorial standards
- Multi-author teams needing a shared source of truth for voice and positioning
- Brands migrating from ad-hoc voice guidelines to persistent, machine-readable context
- Users of the blog orchestrator who want downstream skills (blog-writer, blog-reviewer, blog-seo) to respect brand constraints
blog-brand FAQ
No. BRAND.md and VOICE.md are opt-in. If they don't exist, the orchestrator behaves as it did before v1.7.1. Create them only if you want persistent, auto-loaded editorial context.
Yes. They are plain Markdown files. You can hand-edit them anytime. Use `/blog brand update` to re-run the interview if you prefer the guided workflow.
The init interview will pre-fill the voice section (Step 5) from your existing persona JSON, converting structured metrics into readable prose for VOICE.md.
The blog orchestrator injects them into `/blog write`, `/blog rewrite`, `/blog brief`, `/blog outline`, `/blog calendar`, and `/blog strategy`. Other sub-skills may also respect them if they check for the files.
No. blog-brand writes to the project root only. If you need separate brands, use separate project directories.
Full instructions (SKILL.md)
Source of truth, from agricidaniel/claude-blog.
name: blog-brand description: > Establish durable brand and voice context for cross-skill consumption. Generates BRAND.md (audience, positioning, do/don't editorial rules, taboo phrases, competitor differentiation) and VOICE.md (existing persona JSON re-expressed as readable prose), both written to the project root. When present, the blog orchestrator auto-loads these files for write, rewrite, brief, outline, calendar, and strategy workflows. Pairs with blog-persona, which manages the structured persona JSON. Use when user says "blog brand", "create brand context", "brand voice doc", "BRAND.md", "VOICE.md", "establish editorial brand", "brand guidelines for blog". user-invokable: true argument-hint: "[init|show|update]" license: MIT
Blog Brand: Durable Editorial Context
Generates two project-root files that the blog orchestrator auto-loads for supported writing and planning commands when present:
BRAND.md: who the audience is, what the brand stands for, what to never sayVOICE.md: how the brand sounds, structurally and lexically
These are the editorial equivalent of impeccable's PRODUCT.md / DESIGN.md pattern: persistent context that survives across sessions and propagates to every command.
Why this exists
Today, persona JSON (from blog-persona) is loaded by some skills and not others. Topic-cluster context lives inside cluster vaults. Competitor positioning lives nowhere. Each blog command re-derives "what is the brand" from whatever context it has.
BRAND.md and VOICE.md fix this: one canonical source, loaded by the blog orchestrator at the start of every command.
When neither file exists, behavior is unchanged from v1.7.1. Backward compatible.
Commands
| Command | Purpose |
|---|---|
/blog brand init | Interactive interview, writes BRAND.md and VOICE.md to project root |
/blog brand show | Display current contents (or report missing) |
/blog brand update | Re-run the interview with current values as defaults |
Init Workflow
Run the 5-step interactive interview. Ask each step, wait for response, then proceed. If blog-persona JSON already exists, pre-fill voice answers from it.
Step 1: Audience
Ask:
- Primary audience role (e.g. "head of marketing at a 50-500 person B2B SaaS")
- Secondary audience (optional)
- Reader expertise level: beginner / intermediate / advanced / mixed
- Problems the reader is actively trying to solve (3 to 5 bullets)
- Common misconceptions the audience holds (used to anchor information gain)
Step 2: Positioning and Canonical Entity
Ask:
- Official entity name (legal or public brand name)
- Homepage URL (canonical brand front door)
- Logo URL or file path (preferred square or SVG asset)
- sameAs profiles (LinkedIn, X, YouTube, Crunchbase, GitHub, or other official profiles)
- Wikidata Q-ID if one exists; leave blank if not notable
- One-sentence brand mission (what the brand helps people do)
- Distinctive point of view (the contrarian or non-obvious belief that shapes content)
- What this brand is NOT (anti-positioning, what to never be confused with)
- Top 3 direct competitors with the one-line differentiator vs each
Step 3: Editorial rules
Ask:
- Do list (3 to 7 things the blog will always do; e.g. "cite primary sources only," "name the practitioner not the product")
- Don't list (3 to 7 things the blog will never do; e.g. "no clickbait titles," "no listicle filler")
- Taboo phrases (specific words or phrases this brand never uses; separate from the repository's optional project style list)
- Required disclosures (e.g. affiliate disclosure, AI-content disclosure, conflict-of-interest patterns)
Step 4: Topic boundaries
Ask:
- Topics fully in scope (core content pillars)
- Topics partially in scope (adjacent; covered only with original angle)
- Topics out of scope (will not cover; redirect to partner content)
- Recurring formats / column names if any (e.g. "Monthly Field Notes," "Reader Q&A")
Step 5: Voice (auto-fill from blog-persona if present)
Ask:
- Pronoun stance: first-person (we / I), second-person (you), third-person (the team), or mixed
- Acceptable contractions: full / partial / none
- Sentence ceiling: max words per sentence as a hard cap
- Paragraph ceiling: max words per paragraph (default 150)
- Headline patterns to favor: numbered / question / promise / statement
- Headline patterns to avoid: any patterns banned for this brand
- Summary box label: from blog-persona, or pick one
Output Files
BRAND.md template
Write to project root as:
# Brand Context
> This file is auto-loaded by all blog sub-skills. Last updated: YYYY-MM-DD.
## Audience
- **Primary**: [role + context]
- **Secondary**: [if any]
- **Expertise**: [level]
- **Active problems**:
- [problem 1]
- [problem 2]
- [problem 3]
- **Common misconceptions**:
- [misconception 1]
- [misconception 2]
## Positioning
- **Official entity name**: [brand/entity]
- **Homepage**: [canonical URL]
- **Logo**: [URL or file path]
- **sameAs profiles**:
- [profile URL 1]
- [profile URL 2]
- **Wikidata Q-ID**: [QID or none]
- **Mission**: [one sentence]
- **Distinctive POV**: [contrarian or non-obvious belief]
- **What we are NOT**: [anti-positioning]
- **Competitors**:
- [Competitor A]: [our one-line differentiator]
- [Competitor B]: [our one-line differentiator]
- [Competitor C]: [our one-line differentiator]
## Editorial Rules
### Always do
- [rule 1]
- [rule 2]
- [rule 3]
### Never do
- [rule 1]
- [rule 2]
- [rule 3]
### Taboo phrases
- [phrase 1]
- [phrase 2]
### Required disclosures
- [disclosure rule]
## Topic Scope
- **In scope**: [pillars]
- **Partial scope**: [adjacent topics]
- **Out of scope**: [topics to refuse]
- **Recurring formats**: [if any]
VOICE.md template
Write to project root as:
# Voice Context
> This file is auto-loaded by all blog sub-skills. Last updated: YYYY-MM-DD.
## Pronoun stance
[first-person / second-person / third-person / mixed]
## Lexical rules
- **Contractions**: [full / partial / none]
- **Sentence ceiling**: [N words max]
- **Paragraph ceiling**: [N words max, default 150]
- **Summary label**: [Key Takeaways / TL;DR / etc.]
## Headline patterns
- **Favor**: [list]
- **Avoid**: [list]
## Voice fingerprint (from blog-persona)
- Funny vs serious: [0.0 to 1.0]
- Formal vs casual: [0.0 to 1.0]
- Respectful vs irreverent: [0.0 to 1.0]
- Enthusiastic vs matter-of-fact: [0.0 to 1.0]
## Readability target
- Audience tier: [consumer / professional / technical]
- Flesch Grade: [range]
- Flesch Ease: [range]
## Reference samples
- [URL 1] (extracted patterns: [summary])
- [URL 2] (extracted patterns: [summary])
Show Workflow
- Check for
BRAND.mdandVOICE.mdat project root. - If both exist, print a summary table (key sections only) and the file paths.
- If one or both are missing, print which are missing and suggest
/blog brand init.
Update Workflow
Same as Init, but pre-fills every answer with the current value. The user can press enter to accept or type a new value. After collecting all answers, overwrite both files with the new contents and update the Last updated: line.
Integration with the blog orchestrator
When /blog write, /blog rewrite, /blog brief, /blog outline, /blog calendar, or /blog strategy runs, the orchestrator (skills/blog/SKILL.md) checks for BRAND.md and VOICE.md at the project root. If present, the contents are injected into the system prompt for downstream agents (blog-researcher, blog-writer, blog-seo, blog-reviewer).
If absent, behavior is unchanged. The orchestrator does not prompt the user to create them; they are opt-in context.
Relationship to blog-persona
| Concern | blog-persona | blog-brand |
|---|---|---|
| Structured persona JSON for programmatic use | Yes | No |
| Readable brand context for cross-skill prompts | No | Yes |
| Audience and positioning | No | Yes |
| Taboo phrases and editorial don'ts | Partial (don't list) | Full (taboo + disclosures + scope) |
| Competitor differentiation | No | Yes |
| Topic boundaries | No | Yes |
| Voice fingerprint (tone sliders) | Yes (canonical) | Mirror (read-only) |
blog-brand does not replace blog-persona; it consumes it. The persona JSON remains the source of truth for tone dimensions, sentence-length distribution, and contraction frequency. VOICE.md mirrors the readable parts so prompts are self-contained.
If no persona exists when /blog brand init runs, the voice questions still produce a VOICE.md. Users who want programmatic enforcement can run /blog persona create after.
Error Handling
- Project root unclear: ask the user where to write the files. Default is the current working directory.
- Files already exist on init: ask whether to overwrite or run update instead.
- Persona referenced but missing: ask whether to leave the persona reference blank or create one.
- Reader provides minimal answers: prompt for at least 2 audience bullets and 3 editorial rules; refuse to write skeletons.
Related skills
More from agricidaniel/claude-blog and the wider catalog.

blog-brief
Generate SEO-optimized blog content briefs with keywords, outlines, competitive analysis, and distribution plans.

blog-calendar
Generate editorial calendars with topic clusters, publishing schedules, and content decay reviews for sustainable blog planning.

blog-cannibalization
Detect keyword cannibalization across blog posts and get merge/differentiate recommendations.

blog-chart
Generate dark-mode-compatible SVG charts for blog posts with automatic platform detection.

blog-cluster
Plan and execute interlinked content ecosystems from a seed keyword using semantic clustering and hub-and-spoke architecture.

blog-discourse
Research what people are actually saying about a topic across Reddit, X, YouTube, HN, dev.to, and Medium in the last 30 days.