Ship Pitch
Purpose
Turn a project's real, verifiable evidence into an investor one-pager and a slide-by-slide
deck outline. The angle is a builder's pitch: lead with proof of execution — what is
shipped and how fast the team ships (momentum) — rather than vague vision. Brand, momentum,
and product capabilities all come from files already in the repo, so the pitch matches the
current release and never drifts from reality.
The cardinal rule: never fabricate a metric. Momentum stats (releases, active build
days, cadence) are derived from the repo and may be shown. Traction (users, revenue,
retention) is shown only as clearly-labeled placeholders until a real, sourced number
exists. See references/one-pager-and-deck.md → "The honesty contract."
Part of the "ship" pack
Reuses the same brand-as-data file and version anchor as the rest of the toolkit, and
consumes their outputs:
docs/brand.json ← colors + fonts (themes the HTML render; sets name + tagline)
docs/VERSION ← shared semver anchor (stamped on the one-pager)
├─ shipping-log / ship-changelog → docs/SHIPPING-LOG.md → momentum stats + shipped features
├─ user-guide-builder / ship-guide → docs/user-guide/* → what it does + who it's for
├─ screenshot-capture / ship-screenshots → [SCREENSHOT: id] callouts for deck visuals
└─ logo-pack / ship-logos → docs/brand/ logo for the deck cover
ship-pitch (this) → docs/pitch/one-pager.md + .html + docs/pitch/deck-outline.md
If a needed input is missing, this skill points at the sibling that produces it
(e.g. no shipping log → run /ship-changelog first) rather than guessing.
Workflow
DISCOVERY — read what already exists (never guess). From the repo root:
node "<skill-dir>/scripts/collect-pitch-inputs.mjs" --days 30
Returns one JSON blob: brand (name/tagline/colors), version, shippingLog
(releases, latest/first version, dates), git (commits, active days, span, last
shipped, contributors), guide (path + section headings = the shipped feature map),
priorPitch (existing outputs — update, don't clobber), gaps[], and ready.
Read it. It is the only source of metrics. If ready is false or gaps[] is
non-empty, handle it per step 2 before writing.
Handle missing inputs honestly.
- No
brand.json → ask for, or hand-write, a minimal one (name + tagline + colors);
the HTML render must be on-brand and must never default to purple. Offer /ship-logos.
- No shipping log / not a git repo → momentum stats are the only metrics you may
show; if neither exists, you have no momentum numbers — say so and offer
/ship-changelog. Do not invent cadence.
- No user guide → "what's shipped" and "who it's for" lack grounding; offer
/ship-guide, or fall back to the README / routes and mark inferred items.
- Prior pitch exists → read it, preserve any human-entered traction/ask, and update
the momentum + shipped sections in place.
Load the content spec. Read references/one-pager-and-deck.md for the section order,
the voice rules, the traction-placeholder block, and the deck slide template. Read
references/worked-example.md for a full input→output trace. Match them — the value of
this skill is the consistent, honest structure.
Write the one-pager to docs/pitch/one-pager.md using the section order: problem →
solution → what's shipped → who it's for → why now/why us → traction → the ask.
- Pull problem/solution/audience from the guide + brand tagline (learn the real
domain; never write interchangeable SaaS filler).
- Build the momentum strip only from the collector's
git/shippingLog numbers.
- Every traction/financial/unsourced line is a canonical bracket token —
[TRACTION: …],
[METRIC: …], [TBD: …], [ASK: …], [SOURCE: …], [CONTACT: …], [TEAM: …],
[MODEL: …], or [PLACEHOLDER]. The renderer styles every one of these as a visible
dashed-pill placeholder, so no fake number can ship. Use only this set (the full table is
in references/one-pager-and-deck.md → "Canonical placeholder tokens") so the writer and
the renderer regex stay in lockstep. [SCREENSHOT: id] is a deck visual marker, not a
blank, and is left un-styled.
Write the deck outline to docs/pitch/deck-outline.md — one block per slide
(headline + 3–5 talking points + speaker note + visual suggestion), covering: title,
problem, solution, what's shipped, momentum, who it's for, why now/why us, traction
(placeholders), business model, the ask. Suggest [SCREENSHOT: id] visuals that
ship-screenshots can fill.
Render the HTML one-pager (themed from brand.json, print-friendly):
node "<skill-dir>/scripts/render-one-pager.mjs" \
--in docs/pitch/one-pager.md --out docs/pitch/one-pager.html \
--brand docs/brand.json --version docs/VERSION
Self-contained, themeable via :root tokens from brand.json — both colors AND
typography: the Google Fonts <link> is built from brand.fonts (display/body/mono),
so a brand that sets custom fonts actually fetches them (not only the --font-* tokens).
All-system font names (e.g. Georgia, system-ui) are skipped — no needless web fetch.
Never purple by default, no backdrop-filter / no SVG feTurbulence, and includes a
print stylesheet so it exports to PDF cleanly.
Report what was created, the momentum stats used, and — explicitly — every
bracket placeholder the founder still has to fill (search the output for [). Tell
them which inputs were missing and which sibling command produces them.
Quality bar
A pitch passes only if all of these hold:
- Zero fabricated metrics. Every number traces to the discovery JSON or a source the
user provided. Every unverified metric is a visible
[...] placeholder. If you typed a
user/revenue/growth number you didn't read in a source, you failed.
- Momentum is labeled as momentum, never as "traction" or "growth." It proves the team
builds, not that customers exist.
- Shipped ≠ planned. "What's shipped" lists only features that exist now (cross-checked
against the guide); future work is clearly future-tense under "roadmap."
- Domain-specific, not generic. Problem/solution name a real buyer and a real pain in
the product's actual domain (learned from the guide/brand), not swappable filler. The
"rejected vs accepted" example in
one-pager-and-deck.md is the bar.
- On-brand HTML. Colors and fonts come from brand.json — the rendered
<link> fetches
the brand's display/body/mono faces (verify: the Google Fonts URL names the brand's fonts,
not the defaults), and the --font-* tokens match it. Not purple unless brand.json says so;
no backdrop-filter / feTurbulence; prints to a clean PDF.
- Findable blanks. A single search for
[ surfaces every unfilled placeholder, and the
HTML render styles every canonical token (TRACTION, METRIC, TBD, ASK, SOURCE,
CONTACT, TEAM, MODEL, PLACEHOLDER) as a visible dashed pill — none render as plain
text. Only [SCREENSHOT: id] (a deck visual) is intentionally left un-styled.
- Skimmable. One screen / one page for the one-pager; one idea per line; no buzzwords
("revolutionary," "seamless," "leverage," "synergy," "game-changing").
Cross-project portability
Nothing is hardcoded to any one app. All inputs are auto-discovered from conventional paths
(docs/brand.json, docs/VERSION, docs/SHIPPING-LOG.md/CHANGELOG.md,
docs/user-guide/*) with graceful fallback. Momentum comes from plain git, available in any
repo. External generators (logo, screenshots, a deck builder) are referenced through their
sibling skills as adapters — none is assumed installed; the skill degrades to
placeholders and clear "run X to fill this" notes instead of failing.
Reusable contents
scripts/collect-pitch-inputs.mjs — discovery: gathers brand, version, momentum
(shipping log + git), and the shipped-feature map into one JSON. Read-only. Run it; don't
re-derive history by hand.
scripts/render-one-pager.mjs — renders the one-pager markdown to a self-contained,
brand-themed, print-friendly HTML page (dependency-free markdown subset). Themes colors
and fonts from brand.json: --font-* tokens and the Google Fonts <link> are both
derived from brand.fonts, so custom typography is actually loaded, deduped, and falls
back cleanly for system fonts.
references/one-pager-and-deck.md — section order, voice, the honesty contract, the
traction-placeholder block, and the deck slide template.
references/worked-example.md — a full discovery-JSON → one-pager + deck-outline trace,
with a rejected-vs-accepted problem statement showing the anti-generic bar.
1---2name: ship-pitch3description: Generates an investor one-pager plus a slide-by-slide pitch deck outline from a project's own evidence — docs/brand.json (name, tagline, colors, fonts), the shipping log + git momentum stats, and the user guide. Produces docs/pitch/one-pager.md, a themeable HTML render, and docs/pitch/deck-outline.md covering problem, solution, what's shipped (momentum), who it's for, and clearly-labeled traction placeholders. Never fabricates a metric. Use when the user wants an investor pitch, one-pager, pitch deck, deck outline, fundraising doc, investor update, exec summary, or "turn what we've shipped into a pitch." Triggers on "investor one-pager", "pitch deck", "deck outline", "fundraising one-pager", "investor summary", "make a pitch", "pitch from our shipping log".4---56# Ship Pitch78## Purpose910Turn a project's real, verifiable evidence into an investor one-pager and a slide-by-slide11deck outline. The angle is a **builder's pitch**: lead with proof of execution — what is12shipped and how fast the team ships (momentum) — rather than vague vision. Brand, momentum,13and product capabilities all come from files already in the repo, so the pitch matches the14current release and never drifts from reality.1516The cardinal rule: **never fabricate a metric.** Momentum stats (releases, active build17days, cadence) are derived from the repo and may be shown. Traction (users, revenue,18retention) is shown only as clearly-labeled placeholders until a real, sourced number19exists. See `references/one-pager-and-deck.md` → "The honesty contract."2021## Part of the "ship" pack2223Reuses the same brand-as-data file and version anchor as the rest of the toolkit, and24consumes their outputs:2526```27docs/brand.json ← colors + fonts (themes the HTML render; sets name + tagline)28docs/VERSION ← shared semver anchor (stamped on the one-pager)29 ├─ shipping-log / ship-changelog → docs/SHIPPING-LOG.md → momentum stats + shipped features30 ├─ user-guide-builder / ship-guide → docs/user-guide/* → what it does + who it's for31 ├─ screenshot-capture / ship-screenshots → [SCREENSHOT: id] callouts for deck visuals32 └─ logo-pack / ship-logos → docs/brand/ logo for the deck cover33ship-pitch (this) → docs/pitch/one-pager.md + .html + docs/pitch/deck-outline.md34```3536If a needed input is missing, this skill points at the sibling that produces it37(e.g. no shipping log → run `/ship-changelog` first) rather than guessing.3839## Workflow40411. **DISCOVERY — read what already exists (never guess).** From the repo root:42 ```bash43 node "<skill-dir>/scripts/collect-pitch-inputs.mjs" --days 3044 ```45 Returns one JSON blob: `brand` (name/tagline/colors), `version`, `shippingLog`46 (releases, latest/first version, dates), `git` (commits, active days, span, last47 shipped, contributors), `guide` (path + section headings = the shipped feature map),48 `priorPitch` (existing outputs — update, don't clobber), `gaps[]`, and `ready`.49 **Read it.** It is the only source of metrics. If `ready` is false or `gaps[]` is50 non-empty, handle it per step 2 before writing.51522. **Handle missing inputs honestly.**53 - **No `brand.json`** → ask for, or hand-write, a minimal one (name + tagline + colors);54 the HTML render must be on-brand and must never default to purple. Offer `/ship-logos`.55 - **No shipping log / not a git repo** → momentum stats are the *only* metrics you may56 show; if neither exists, you have no momentum numbers — say so and offer57 `/ship-changelog`. Do **not** invent cadence.58 - **No user guide** → "what's shipped" and "who it's for" lack grounding; offer59 `/ship-guide`, or fall back to the README / routes and mark inferred items.60 - **Prior pitch exists** → read it, preserve any human-entered traction/ask, and update61 the momentum + shipped sections in place.62633. **Load the content spec.** Read `references/one-pager-and-deck.md` for the section order,64 the voice rules, the traction-placeholder block, and the deck slide template. Read65 `references/worked-example.md` for a full input→output trace. Match them — the value of66 this skill is the consistent, honest structure.67684. **Write the one-pager** to `docs/pitch/one-pager.md` using the section order: problem →69 solution → what's shipped → who it's for → why now/why us → traction → the ask.70 - Pull problem/solution/audience from the **guide + brand tagline** (learn the real71 domain; never write interchangeable SaaS filler).72 - Build the **momentum strip** only from the collector's `git`/`shippingLog` numbers.73 - Every traction/financial/unsourced line is a canonical bracket token — `[TRACTION: …]`,74 `[METRIC: …]`, `[TBD: …]`, `[ASK: …]`, `[SOURCE: …]`, `[CONTACT: …]`, `[TEAM: …]`,75 `[MODEL: …]`, or `[PLACEHOLDER]`. The renderer styles **every one** of these as a visible76 dashed-pill placeholder, so no fake number can ship. Use only this set (the full table is77 in `references/one-pager-and-deck.md` → "Canonical placeholder tokens") so the writer and78 the renderer regex stay in lockstep. `[SCREENSHOT: id]` is a deck visual marker, not a79 blank, and is left un-styled.80815. **Write the deck outline** to `docs/pitch/deck-outline.md` — one block per slide82 (headline + 3–5 talking points + speaker note + visual suggestion), covering: title,83 problem, solution, what's shipped, momentum, who it's for, why now/why us, traction84 (placeholders), business model, the ask. Suggest `[SCREENSHOT: id]` visuals that85 `ship-screenshots` can fill.86876. **Render the HTML one-pager** (themed from brand.json, print-friendly):88 ```bash89 node "<skill-dir>/scripts/render-one-pager.mjs" \90 --in docs/pitch/one-pager.md --out docs/pitch/one-pager.html \91 --brand docs/brand.json --version docs/VERSION92 ```93 Self-contained, themeable via `:root` tokens from brand.json — **both colors AND94 typography**: the Google Fonts `<link>` is built from `brand.fonts` (display/body/mono),95 so a brand that sets custom fonts actually fetches them (not only the `--font-*` tokens).96 All-system font names (e.g. `Georgia`, `system-ui`) are skipped — no needless web fetch.97 Never purple by default, no `backdrop-filter` / no SVG `feTurbulence`, and includes a98 print stylesheet so it exports to PDF cleanly.991007. **Report** what was created, the momentum stats used, and — explicitly — **every101 bracket placeholder the founder still has to fill** (search the output for `[`). Tell102 them which inputs were missing and which sibling command produces them.103104## Quality bar105106A pitch passes only if **all** of these hold:107108- **Zero fabricated metrics.** Every number traces to the discovery JSON or a source the109 user provided. Every unverified metric is a visible `[...]` placeholder. If you typed a110 user/revenue/growth number you didn't read in a source, you failed.111- **Momentum is labeled as momentum,** never as "traction" or "growth." It proves the team112 builds, not that customers exist.113- **Shipped ≠ planned.** "What's shipped" lists only features that exist now (cross-checked114 against the guide); future work is clearly future-tense under "roadmap."115- **Domain-specific, not generic.** Problem/solution name a real buyer and a real pain in116 the product's actual domain (learned from the guide/brand), not swappable filler. The117 "rejected vs accepted" example in `one-pager-and-deck.md` is the bar.118- **On-brand HTML.** Colors *and* fonts come from brand.json — the rendered `<link>` fetches119 the brand's display/body/mono faces (verify: the Google Fonts URL names the brand's fonts,120 not the defaults), and the `--font-*` tokens match it. Not purple unless brand.json says so;121 no backdrop-filter / feTurbulence; prints to a clean PDF.122- **Findable blanks.** A single search for `[` surfaces every unfilled placeholder, and the123 HTML render styles **every** canonical token (`TRACTION`, `METRIC`, `TBD`, `ASK`, `SOURCE`,124 `CONTACT`, `TEAM`, `MODEL`, `PLACEHOLDER`) as a visible dashed pill — none render as plain125 text. Only `[SCREENSHOT: id]` (a deck visual) is intentionally left un-styled.126- **Skimmable.** One screen / one page for the one-pager; one idea per line; no buzzwords127 ("revolutionary," "seamless," "leverage," "synergy," "game-changing").128129## Cross-project portability130131Nothing is hardcoded to any one app. All inputs are auto-discovered from conventional paths132(`docs/brand.json`, `docs/VERSION`, `docs/SHIPPING-LOG.md`/`CHANGELOG.md`,133`docs/user-guide/*`) with graceful fallback. Momentum comes from plain git, available in any134repo. External generators (logo, screenshots, a deck builder) are referenced through their135sibling skills as **adapters** — none is assumed installed; the skill degrades to136placeholders and clear "run X to fill this" notes instead of failing.137138## Reusable contents139140- `scripts/collect-pitch-inputs.mjs` — discovery: gathers brand, version, momentum141 (shipping log + git), and the shipped-feature map into one JSON. Read-only. Run it; don't142 re-derive history by hand.143- `scripts/render-one-pager.mjs` — renders the one-pager markdown to a self-contained,144 brand-themed, print-friendly HTML page (dependency-free markdown subset). Themes colors145 **and fonts** from brand.json: `--font-*` tokens and the Google Fonts `<link>` are both146 derived from `brand.fonts`, so custom typography is actually loaded, deduped, and falls147 back cleanly for system fonts.148- `references/one-pager-and-deck.md` — section order, voice, the honesty contract, the149 traction-placeholder block, and the deck slide template.150- `references/worked-example.md` — a full discovery-JSON → one-pager + deck-outline trace,151 with a rejected-vs-accepted problem statement showing the anti-generic bar.