From hypeman
One-time conversational setup for hypeman. Detects channels, captures brand voice via three paths (from scratch / from existing examples / anchored to reference brands), defines a primary ICP, writes the `marketing:` block into `.claude/project.yaml`, drops the `marketing/` directory skeleton, and injects the managed CLAUDE.md section. Idempotent — safe to re-run; existing files prompt before overwrite.
How this skill is triggered — by the user, by Claude, or both
Slash command
/hypeman:bootstrap-marketingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The on-ramp for hypeman. Drops a repo into the hypeman pattern in ~5
The on-ramp for hypeman. Drops a repo into the hypeman pattern in ~5 minutes. Run this once per repo, then never again (re-running asks before touching anything).
Templates live at <plugin-root>/templates/ — typically
.claude/plugins/hypeman/templates/ in the project that's installing. If
templates can't be found, surface clearly — the plugin install is
incomplete.
Read .claude/project.yaml if it exists. Two cases:
Manifest exists (cornerman is installed): good. You're going to add a
marketing: block, not overwrite the file. Confirm schema_version: 1
and proceed. If marketing: already exists, ask whether to refresh
(default no) or keep + just refresh template files.
Manifest doesn't exist: create a minimal one with just the
schema_version and project.name fields, then add marketing:. If
cornerman gets installed later, its /bootstrap-project will populate
the engineering blocks; the two coexist by design.
If the manifest doesn't have project.name, ask. If it doesn't have
project.repo, read git remote -v for origin and offer it as the
default.
Show the profile list from profiles/*.yaml:
dev-tool — engineering blog primary, HN + X dev community, code-first hooks (shipped in v0.1)(v0.2 will add early-stage-saas, consumer-app, b2b-enterprise,
personal-brand. Until then, anything that isn't dev-tool falls back
to custom and the user fills channel defaults manually.)
Print the detection — if the project has a blog directory or
content/posts/, lean dev-tool. Ask to confirm or override.
This is the part hypeman cares most about getting right. Ask which path(s) the user wants — they can pick more than one and the bootstrap will synthesize across them:
Path A — From scratch (no existing content):
For a brand-new project with nothing shipped yet. Walk through 5–8 short questions:
do_not_sayPath B — From existing examples:
For projects that already have shipped content. Ask: "Point me at 3–5 pieces of content that exemplify the voice you want — blog posts, X threads, README sections, anything." Paths or URLs both work. Read them, extract patterns:
do_not_say)Write the extraction as marketing/VOICE.md with citations back to the
source pieces (the lineage matters; future copywriter runs read the
exemplars, not just the rules).
Path C — Anchored to reference brands:
For projects that want to sound like a specific other brand (or a blend). Ask: "Name brands whose voice you want to emulate — 2–4 is the sweet spot. URLs to specific pieces of theirs help a lot." Examples Jesse might name: Linear, Vercel, Stripe, 37signals, Pieter Levels, Ben Thompson, Patrick McKenzie, Matt Levine, Anthropic itself.
For each named brand:
Note the blend, not just the union — "Linear's clarity + Stripe's
specificity + 37signals' contrarian edge" is more useful than three
disconnected style guides. The synthesis goes into VOICE.md's
"Aspirational anchors" section, with the original sources cited.
Paths can mix. A common case: Path A for a few baseline questions, Path C for two reference brands, and as the project ships content, Path B gets re-run on the real artifacts. The voice file evolves.
Ask for the primary ICP — one persona, the one that matters most. Walk through:
Write to marketing/icps/<slug>.md using templates/ICP.md.tmpl. Set
marketing.audiences.primary to the new file's path.
If the user wants to skip ICP definition (early prototype, exploring),
allow it — write a marketing/icps/TODO.md placeholder and flag in the
bootstrap report that an ICP is the first thing to fill before running
strategist.
Scan the project for channel indicators:
content/posts/, content/blog/, pages/blog/, posts/,
_posts/ (Jekyll), src/content/blog/ (Astro) → blog.backend candidatespackage.json deps on buttondown,
resend, mailchimp, @convertkit/* → email.backend candidates.well-known/, OG metadata in next.config.* →
hints, not decisionsAsk the user to confirm which channels are enabled (not just detected — enabled means we'll actively publish there). For each enabled channel, ask for:
approval_required: true (default yes for v0.1)Ask: "What's the one primary metric that defines success for this
project's marketing in the next 90 days?" Then up to 3 secondary metrics.
Write to marketing.goals.
If the user doesn't have a primary metric yet, the answer is "we don't
know what success looks like" — surface that as the gap to close before
any campaign should ship. Default primary_metric: "" and flag it in the
bootstrap report.
Confirm defaults:
auto_publish: false — strongly recommend keeping this for v0.1require_brand_review: truerequire_legal_check_when: [pricing, claims, security] — let user add or removeDon't make publishing easier than it should be. The cost of an unsanctioned post is much higher than the cost of an extra approval click.
From <plugin-root>/templates/, render each .tmpl against the answers
and write into the project:
.claude/project.yaml — add marketing: block (don't overwrite siblings)marketing/VOICE.md ← synthesized from voice paths chosenmarketing/STYLE.md ← from template, with brand-specific overrides appliedmarketing/PLAYBOOK.md ← empty + header explaining purposemarketing/icps/<slug>.md ← from primary ICP answersmarketing/campaigns/.gitkeep ← so the directory existsmarketing/examples/.gitkeep ← for house exemplarsmarketing/competitors.md ← empty + header (competitive-watcher writes here in v0.2)CLAUDE.md ← inject the <!-- hypeman:* --> managed section.gitignore additions ← append marketing/.metrics-cache/ if not presentEach existing file gets a diff preview + confirm-before-overwrite. The
manifest marketing: block is the only write that doesn't prompt
(re-running bootstrap means refreshing the block).
git add . && git commit -m "chore: bootstrap hypeman"/campaign-file against a real signal to test the loop end-to-end/voice-define once you have 3–5 shipped pieces to upgrade
Path A → Path B.claude/project.yaml already has marketing:, ask whether to
refresh or keep + only refresh templates/campaign-file next)npx claudepluginhub boutlabs/hypeman-claude-pluginCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.