anfloy.AcademyBook a call

Marketing · 01 · The content engineLesson 1 of 4

Your voice, as files

60 min working time · Weeks 5-6

By the end of this lesson you can
  • Build a voice guide from your real writing
  • Make every draft start from your voice, not the model's

Why your voice has to be a file

You leave this lesson with one asset: a voice file built from your real writing that passes a blind test - a teammate reads Claude's rewrite next to a paragraph you actually wrote and can't reliably tell which is which. Here's why that file matters more than any tool in this track. Between 2025 and 2026, the marketing teams that got real results with AI all converged on the same move: they stopped chatting with a model and started running marketing as a repo. One git folder holds the brand voice, the style rules, the skills, and the content. Claude Code is the operator. Anthropic's own marketing team runs this way - one non-technical growth marketer covering five channels, with ad creation going from 30 minutes to 30 seconds.

The reason this works is simple. A model's default voice is nobody's voice. If your style guide lives in someone's head, every AI draft starts from zero and sounds like every other AI draft. If your voice is a file the model loads at the start of every session, every draft starts from you.

Every later lesson depends on this one file. Skip it and everything downstream reads like AI slop. Nail it and the blind test passes - that test is the exit criterion, and you run it on a real teammate before this hour is up.

The marketing repo: scaffold it first

Before voice, you need a place for voice to live. This is the reference structure - one git repo that is your team's marketing brain. You will fill it in over the next six weeks; today you create the skeleton.

The marketing repo
marketing/
├── CLAUDE.md            # operating manual: who we are, voice TL;DR,
│                        #   hard rules, named approvers
├── .claude/
│   ├── skills/          # one skill per repeatable job
│   ├── agents/          # subagents: researcher, writer, editor, fact-checker
│   └── settings.json    # permission rules (the folder gates, in code)
├── brand/
│   ├── voice.md         # THE voice file (this lesson)
│   ├── positioning.md   # product, ICP, messaging
│   ├── banned-words.md  # the AI-slop list
│   └── visual-style.md  # palette, fonts, logo rules for visuals
├── corpus/
│   ├── best-posts/      # 20-50 top-performing pieces, raw
│   ├── posted/          # every post that actually went out (capture loop)
│   ├── corrections.md   # your edits and dislikes, dated
│   ├── calls/           # sales and customer call transcripts
│   ├── stories/         # origin, lessons, numbers only you have
│   └── voice-analysis.md
├── calendar/            # the weekly cadence + topic backlog
├── content/
│   ├── briefs/          # research briefs, one per piece
│   ├── drafts/          # work in progress
│   ├── approved/        # human-approved, ready to publish
│   └── published/       # archive with URL + performance notes
├── derivatives/         # repurposed assets, grouped by source
├── data/                # keywords/, analytics/, competitors/
├── reports/
└── scripts/

Borrow before you build

Before you fill .claude/skills/ by hand, know this: skills are portable. A skill is just a folder with a SKILL.md inside, which means a skill someone else wrote runs in your repo exactly like one you wrote. The format is an open spec (agentskills.io), so the same folder also works in several other agent tools. And huge free libraries exist. SkillsMP (skillsmp.com) is an independent catalog that says it indexes 3,000,000+ open-source skills as of September 2026, browsable by category - Content & Media, Documentation, and Business are the marketing shelves - with a free API and MCP server if you'd rather search it from Claude. Anthropic's own skills repo installs as a marketplace with /plugin marketplace add anthropics/skills, and the official marketplace (claude-plugins-official) is already added: browse it with /plugin. Using any of them is mechanical: read it, copy the folder into .claude/skills/ or install the plugin, done.

  • Where a skill lives decides who gets it. .claude/skills/ in the repo: everyone who clones the repo, versioned with the work. ~/.claude/skills/: only you, in every project on your machine. A plugin in a team marketplace: every teammate, every repo, one /plugin install command. Voice and brand skills belong in the repo; your personal helpers in your home folder; the team pack in a plugin (capstone).
  • Building one is a conversation, not a template hunt: ask Claude to use Anthropic's skill-creator skill (in the anthropics/skills repo) and it interviews you, writes the SKILL.md, and can test it against sample inputs.
  • The frontmatter does real work: description is how Claude decides to load it, disable-model-invocation: true makes it run only when you type it, allowed-tools pre-approves the tools it needs so they run without a prompt (it grants, it doesn't restrict), and model plus effort pin which model runs it. A tagging skill can pin haiku; a voice-critic skill can pin opus.
  • Skills cost context. Once you have fifteen of them, run /skill-doctor to see each one's context cost and how often it actually fires, and delete the ones nobody uses.

So every time this track says 'make a skill', you have two ways to get one: borrow a ready one or build your own. The split that works: install the generic content plumbing from the library - a humanizer, a repurposer, an SEO-brief skill - and hand-build only what's truly yours: your voice file, your brand gates, your fact-check rules. The library can give you the machinery; only you have the taste.

One thing never comes from a library: brand/voice.md. No catalog knows your voice, your stories, or your never-words - the voice file is the asset you always build yourself, from your own corpus. That's the rest of this lesson. The borrowed skills wrap around it; they don't replace it.

Build the voice corpus

A voice guide written from memory is a vibe. A voice guide extracted from your 20-50 best-performing pieces is data. The corpus is the ground truth, so collecting it is the real work of this lesson.

  1. Pull your top-performing content from the last 12-24 months: posts, newsletters, blog articles, even good internal memos. Aim for 20-50 pieces and at least 500-1000 words of genuinely top-tier writing, mixed formats.
  2. Save each piece as its own file in corpus/best-posts/, raw and unedited. Name them so the source is obvious, e.g. 2026-03-12_linkedin_pricing-story.md.
  3. Note next to each piece why it performed (replies, shares, pipeline) - one line is enough. Performance context teaches the model what good means for you.
  4. If LinkedIn is your main channel, remember it is login-walled - copy your posts out by hand or from your analytics export. Round out the corpus with open writing (blog, newsletter) where you can.
  5. Skip anything ghostwritten, heavily edited by committee, or off-voice. A smaller honest corpus beats a bigger polluted one.

Posts teach the voice. They don't supply the substance. The second half of the corpus is the material only you have: call transcripts (corpus/calls/), the builds or projects you shipped, your positioning, and a story bank of origin stories, mistakes, and numbers (corpus/stories/). The rule that makes the whole engine work: drafts are grounded only in these files, never in the model's general knowledge. A post built from a real call objection or a real number from your own work cannot sound like everyone else's, because nobody else has the input.

Anatomy of a voice.md that works

Most brand-voice docs fail because they describe the voice in adjectives ('confident, approachable, bold'). Adjectives don't constrain a model. The format below is validated against real production voice files: it constrains through examples and rewrite pairs.

  • 1. TL;DR fingerprint - one paragraph that captures the whole voice, e.g. 'write like you'd tell a friend about something you just made.'
  • 2. Calibration from real samples - quote actual sentences from the corpus and annotate why they work ('Short, declarative. Few words, no warmup.').
  • 3. The #1 rule, stated as a rule - with the single best example post pasted in full.
  • 4. Dos and don'ts as rewrite pairs - weak sentence, why it fails, approved version. Ten pairs minimum. This is the highest-payoff section in the file.
  • 5. Hard mechanical rules - things a script can check deterministically: no em dashes, sentence-length caps, banned openers. These get enforced in code later, not just prompted.
  • 6. Provenance note - which corpus files this was extracted from and when, so you know when it's stale.
brand/voice.md skeleton
# Voice

## TL;DR fingerprint
Write like you'd tell a smart friend about something you just
shipped. Short sentences. Concrete numbers. No warmup, no wind-down.

## Calibration (from real posts)
> "It's on me."
Short, declarative, takes responsibility in three words. No hedging.

> "We spent $4,200 to learn this. You get it for free."
Specific number + generosity. The number does the persuading.

## The #1 rule
Earn every sentence. If a line doesn't add a fact, a feeling, or a
joke, cut it. Best example: [paste the single best post in full]

## Rewrite pairs
WEAK: "In today's fast-paced digital landscape, content is key."
WHY IT FAILS: throat-clearing, zero information, pure slop.
APPROVED: "We publish twice a week. Here's what that costs us."

[...9 more pairs...]

## Hard rules (enforced by lint, not vibes)
- No em dashes. Use " - " or restructure.
- No openers from banned-words.md.
- Max 25 words per sentence in social posts.

## Provenance
Extracted 2026-06-15 from corpus/best-posts/ (23 files).
Re-extract when 10+ new pieces land in the corpus.

Extract, test blind, encode as a skill

Now run the extraction. Point Claude Code at the corpus and have it produce the analysis, then the voice file. Work in the repo so everything lands in the right folder.

  1. In the marketing repo, ask Claude to read every file in corpus/best-posts/ and produce corpus/voice-analysis.md: sentence-length distribution, typical openers, CTA style, formatting tics, vocabulary it would never use.
  2. From the analysis, have it draft brand/voice.md in the skeleton format above - fingerprint, calibration quotes, #1 rule, 10 rewrite pairs, hard rules.
  3. Edit it yourself. You are the calibration instrument: kill anything that doesn't sound like you, add the rules it missed.
  4. Create brand/banned-words.md alongside it: the AI-slop words ('elevate', 'dive in', 'in today's fast-paced...'), the reveal connectives ('here's the thing', 'the truth is', 'let that sink in', 'the part nobody talks about'), the 'it's not X, it's Y' construction, strawman openers ('most founders...', 'everyone is...'), and your personal never-words.
  5. Run the blind test: take one generic paragraph, have Claude rewrite it using only voice.md, and show a teammate that rewrite next to a real paragraph you wrote. If they can reliably tell which is which, the voice file needs another pass - usually more rewrite pairs.
  6. Encode the whole procedure as .claude/skills/voice-extract/SKILL.md so you can re-run it in one command whenever the corpus grows.
.claude/skills/voice-extract/SKILL.md (frontmatter)
---
name: voice-extract
description: Rebuild brand/voice.md from the corpus. Reads every file
  in corpus/best-posts/, regenerates corpus/voice-analysis.md, then
  updates brand/voice.md keeping the rewrite-pairs format. Run when
  10+ new pieces land in the corpus or quarterly.
disable-model-invocation: true
---

The capture loop: the voice learns from what you actually posted

A voice file extracted once goes stale. What keeps it alive is a capture loop: every time you post, the final text you actually published goes back into the corpus, and every time you change a draft, the change is logged as a correction. The gap between what Claude drafted and what you posted is the most precise voice data you will ever get, and it's free.

  1. Build a content-capture skill. You say 'log this, I posted it' and paste the final text; it saves the post verbatim to corpus/posted/ with the date, channel, and topic tag. Posted posts are the voice anchors - they outrank the original best-posts set because they're current.
  2. When you edit a draft or reject one, say why in one line ('too salesy', 'I'd never open with a question'). The skill appends it to corpus/corrections.md with the date and the before/after sentence.
  3. Add performance later: a week after posting, log the numbers next to the post (comments, reposts, replies that turned into conversations). A post that flopped stays in the corpus but gets tagged, so the extraction weights the winners.
  4. When corrections.md has 10+ new entries, run voice-extract: repeated corrections become rewrite pairs or hard rules in voice.md.

Do this now

Sources and further reading

We set it up with you

Want us to set it up with you, end to end?

Three one-on-one sessions. We train you on your real stack and build your first agents together, until you can run it yourself. You keep everything.