From content-vault
Drafts newsletters, onboarding emails, and broadcasts in your voice, using a personal copy corpus and anti-slop pass. Renders to your email template and optionally ships to Resend.
How this skill is triggered — by the user, by Claude, or both
Slash command
/content-vault:newsletter-writerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Draft emails (newsletters, onboarding sequences, broadcasts) that read
Draft emails (newsletters, onboarding sequences, broadcasts) that read like you, not like ChatGPT. Renders into your brand email template and (optionally) pushes to Resend.
This skill fails its job if the output reads like generic SaaS copy. That is the test. Smoothness is the failure mode.
The voice comes from the same corpus the writer skills share:
skills/linkedin-copywriter/corpus.md (copy from
corpus.md.example and fill with your top posts). The newsletter
voice is anchored to those posts.<YOUR_NAME>, <YOUR_BRAND>, <YOUR_DOMAIN>,
<YOUR_EMAIL>, <YOUR_CAL_LINK>.RESEND_API_KEY, <YOUR_RESEND_AUDIENCE_ID>, <YOUR_RESEND_FROM>.
Skip this whole block if you only want the drafted copy.<YOUR_EMAIL_TEMPLATE> at your master HTML email
chrome. No template? The skill drafts the copy and you paste it
wherever you send from.Triggers: "write a newsletter", "draft the welcome email", "day-X check-in email", "broadcast about X", "/newsletter-writer".
In scope:
Out of scope (use the other skill):
/linkedin-copywriter/long-form/youtube-scriptQuick brief.
1. Email type: welcome, activation nudge, founder check-in, broadcast/newsletter, win-back.
2. The single specific anchor: a number, a tool name, a person, a moment, or a real observation. Concrete beats generic. ("5 days in" / "you ran the install yesterday" beats "thanks for joining").
3. Primary CTA: install, book a call, browse resources, reply, share, upgrade.
4. Audience: all subscribers, free trial, paying, segment.
5. Send timing: trigger event + delay, or scheduled date.
Parse what the user gave; only ask for missing fields.
Read ../linkedin-copywriter/corpus.md if you haven't this session.
The top 5 posts there are your viral anchors. Internalise:
The model has trained on a million SaaS emails. These patterns are its defaults and they all signal AI. Reject every one. Re-read the draft hunting for them before approving.
Structural patterns to reject:
| Pattern | Why it's slop | Replace with |
|---|---|---|
| "The [adj] way to [verb] X" · "The fastest way to feel what <YOUR_BRAND> does" | LLM stem cell | Drop the framing entirely. Just state the action. |
| "X, Y, and Z" three-item parallels | AI rhythm | Pick one. Or use two with no conjunction. Or be specific about each. |
| "No X, no Y, no Z" enumerated negatives | Borrowed from Apple keynote, now everywhere | Pick one negative and make it concrete. ("Nothing to wire up.") |
| "Whether you're X or Y" generic positioning | Hedging | Pick an audience and address them. |
| "Designed to" / "Built to" | Passive feature copy | Active. ("It scores leads 0-100." not "Designed to score leads.") |
| "We believe" / "We think" | Soft claims | State or shut up. |
| Promise-then-soften · "It does X. Of course, X has limits..." | Cover-your-ass instinct | Make the claim clean. Address limits elsewhere or not at all. |
| Smooth corporate transitions · "Here's the thing." / "Here's why." | Connective filler | Cut. Start the next sentence. |
| Three-clause smoothing · "fast, efficient, and reliable" | LLM default rhythm | Pick one. Make it specific. |
| "Imagine if" / "What if I told you" / "Picture this" | Hype opener | Open with a number, a name, or a fragment. |
| Generic CTA labels · "Get started", "Learn more", "Try it now" | Don't earn the click | Specific verb. "Install the CLI" / "Browse the resources" / "Book 45 minutes" |
Voice patterns to reject:
| Pattern | Why | Fix |
|---|---|---|
| Em dashes (—, –) | Brand rule | Period, comma, colon, parens, or · middot |
| Banned words: leverage, synergy, robust, world-class, seamless, intuitive, powerful, innovative, game-changer, revolutionize, unlock, delve, in today's fast-paced world | Universally AI-marked | Use plain English or a concrete verb |
| "Hey [Name]" when [Name] isn't available | Empty greeting | Skip greeting entirely. Start with the substance. |
| Sign-offs invoking the sender's name when From line already has it | Redundant | Often skip the signature block entirely · the From carries identity |
| Uniform sentence lengths | AI-rhythm tell | Vary deliberately. Mix one-word sentences, fragments, and longer thoughts. |
These are what make copy feel hand-typed, not generated:
If a draft has zero of these, the draft is slop. Rewrite.
After drafting, do a re-read with this checklist:
[ ] Opens with a number, fragment, name, or claim (not setup phrasing)
[ ] No "The [adj] way to..." anywhere
[ ] No "X, Y, and Z" parallels
[ ] No "No X, no Y, no Z" enumerated negatives
[ ] No banned words
[ ] No em dashes
[ ] At least 1 specific number / proper noun in first 30 words
[ ] At least 1 texture moment (tool name / observation / aside)
[ ] CTA label is a specific verb, not generic
[ ] Sentence lengths vary
[ ] If sender name isn't dynamic, no "Hey [name]" greeting
[ ] If From carries identity, signature block is optional, often skipped
Any unchecked item = rewrite that section before showing the user.
SLOP (what the LLM defaults to):
Hey,
The fastest way to feel what <YOUR_BRAND> does is to clone someone else's setup.
Templates are pre-built workflows · tables, integrations, and
dashboards that drop into your workspace in 30 seconds. No yaml, no
glue code, no chasing the right combination of providers.
The full library lives on the resources page · featured by us, plus
what the community is sharing.
[Browse the resources →]
Build something worth sharing? Hit reply with the slug and
I'll feature it.
What's wrong: "Hey," empty greeting · "The fastest way to feel" stem cell opener · "tables, integrations, and dashboards" three-parallel · "No yaml, no glue code, no chasing" enumerated negatives · "lives on the resources page · featured by us, plus what the community" smooth corporate transition · no specific numbers · no texture.
TIGHTER (your voice):
You can read about <YOUR_BRAND> all day. Easier to just clone someone's
setup and run it.
That's what the templates are. Pre-built workflows you drop into your
workspace. 30 seconds, no yaml.
The library is on the resources page · what we've shipped, plus what
people are sharing.
[Browse the resources →]
Built something useful? Reply with the slug. If it's good I'll feature
it on the page.
What changed: opens with a specific stake ("You can read about <YOUR_BRAND> all day"). One negative not three. Specific number ("30 seconds"). "If it's good" is an opinion. Same length but more weight.
After the user approves the draft. Skip this block entirely if you just want the copy.
# Compose the HTML using your master template chrome (<YOUR_EMAIL_TEMPLATE>).
# Render preview
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--headless --disable-gpu --no-sandbox \
--window-size=700,1200 --hide-scrollbars --virtual-time-budget=2000 \
--screenshot=lifecycle/<flow>/<NN-slug>-preview.png \
"file://$(pwd)/lifecycle/<flow>/<NN-slug>.html"
# Push to Resend (newsletters = broadcasts, lifecycle emails = templates)
set -a; source .env; set +a
# For broadcasts:
python3 -c "
import pathlib, json
html = pathlib.Path('lifecycle/newsletters/YYYY-MM-DD-<slug>.html').read_text()
pathlib.Path('/tmp/bc.json').write_text(json.dumps({
'audience_id': '<YOUR_RESEND_AUDIENCE_ID>',
'from': '<YOUR_RESEND_FROM>', # e.g. '<YOUR_NAME> <hello@updates.<YOUR_DOMAIN>>'
'reply_to': '<YOUR_EMAIL>',
'subject': '<SUBJECT_LINE>',
'preview_text': '<PREHEADER>',
'html': html,
}))
"
curl -s -X POST -H "Authorization: Bearer $RESEND_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @/tmp/bc.json https://api.resend.com/broadcasts
# For lifecycle templates (then attach to an automation step):
# POST /templates with {name, subject, html, from, reply_to}
# POST /templates/{id}/publish
Persist resource IDs to a local state file (e.g. lifecycle/resend.json).
Before declaring done:
../linkedin-copywriter/corpus.md../linkedin-copywriter/reference-creators.md<YOUR_BRAND_DOC><YOUR_CAL_LINK>npx claudepluginhub timscheuerai/content-vaultComposes high-converting emails using copy frameworks (PAS, AIDA, BAB, FAB, 4Ps). Generates scored subject lines, responsive HTML templates with dark mode, plain-text fallback, preheaders for cold outreach, newsletters, launches.
Drafts and designs complete HTML email newsletters from a topic or brief. Outputs paste-ready table-based HTML with inline styles for major email platforms.
Guides iterative newsletter writing from insights, ideas, or YouTube transcripts in Ben Van Sprundel's voice. Step-by-step process requiring user input at each stage.