Substack Post Writer
Draft a post from what the user actually has, then package every field Substack needs.
Before drafting
- Read
references/voice-rules.md, references/anti-fabrication.md, references/platform-limits.md.
- Read
~/.substack-skills/voice-profile.md and ~/.substack-skills/story-bank.md if they exist.
Draft
- Build each section from the user's outline, message, Story Bank, or files. Where a section needs a fact you don't have, write around it with a slot:
[what the tool stack cost last month].
- When the input is thin (an outline of labels), the draft is a skeleton: a heading and 2 to 4 lines per section, made of the user's words plus slots. Still a draft, never a refusal.
- Working length 1,000 to 2,500 words unless the user sets one.
- Clipping check: Gmail clips emails over 102KB. If the user's target or past style is over about 6,000 words, or image-heavy, say so before drafting and offer: split into a series, cut, or accept that email readers see "View entire message".
--mode package skips drafting and packages an existing draft.
Reply shape (always, in this order)
- Clipping warning, if it applies.
- The draft or skeleton.
- The package block below, every field filled. Fields that depend on missing content get a best guess marked
(provisional).
- Up to 3 questions whose answers fill the most slots, or suggest
substack-interviewer --mode post.
Package
Title: <60 characters or fewer, says what the reader gets>
Subtitle: <one sentence, adds what the title doesn't>
SEO title: <keyword-first version of the title, 60 characters or fewer>
SEO description: <150 to 160 characters, plain language, includes the main keyword>
Slug: <3 to 6 lowercase words joined by hyphens>
Tags: <2 to 4 existing or new topic tags>
Section: <section name from the voice profile, or "main">
Audience: <everyone | only_paid | founding | only_free>
Paywall: <none | after the paragraph starting "...", with one line on why>
Email subscribers: <yes | no | ask the user>
Words: <count> · Clipping risk: <yes | no>
Slots to fill: <list or "none">
Mark the paywall in the draft with <!-- paywall --> on its own line if there is one.
Publishing
Hand the draft and package to substack-publisher when the user wants it live. This skill doesn't publish.
Common mistakes
| Mistake |
Fix |
| Replying with only questions |
Skeleton, package, then questions |
| Leaving out SEO, slug or tags because the user didn't ask |
The package is always complete |
| Ignoring a 9,000 word target |
Warn about clipping first |
| Inventing the cost, date or result in a section |
Slot it |
1---2name: substack-post-writer3description: Use when the user wants a Substack newsletter post or long-form issue drafted from an idea or outline, or an existing draft packaged for publishing with title, subtitle, SEO title and description, slug, tags, section, and paywall placement. Not for short Notes (use substack-notes-writer) or reviewing tone (use substack-humanizer).4---56# Substack Post Writer78Draft a post from what the user actually has, then package every field Substack needs.910## Before drafting11121. Read `references/voice-rules.md`, `references/anti-fabrication.md`, `references/platform-limits.md`.132. Read `~/.substack-skills/voice-profile.md` and `~/.substack-skills/story-bank.md` if they exist.1415## Draft1617- Build each section from the user's outline, message, Story Bank, or files. Where a section needs a fact you don't have, write around it with a slot: `[what the tool stack cost last month]`.18- When the input is thin (an outline of labels), the draft is a skeleton: a heading and 2 to 4 lines per section, made of the user's words plus slots. Still a draft, never a refusal.19- Working length 1,000 to 2,500 words unless the user sets one.20- **Clipping check:** Gmail clips emails over 102KB. If the user's target or past style is over about 6,000 words, or image-heavy, say so before drafting and offer: split into a series, cut, or accept that email readers see "View entire message".2122`--mode package` skips drafting and packages an existing draft.2324## Reply shape (always, in this order)25261. Clipping warning, if it applies.272. The draft or skeleton.283. The package block below, every field filled. Fields that depend on missing content get a best guess marked `(provisional)`.294. Up to 3 questions whose answers fill the most slots, or suggest `substack-interviewer --mode post`.3031## Package3233```34Title: <60 characters or fewer, says what the reader gets>35Subtitle: <one sentence, adds what the title doesn't>36SEO title: <keyword-first version of the title, 60 characters or fewer>37SEO description: <150 to 160 characters, plain language, includes the main keyword>38Slug: <3 to 6 lowercase words joined by hyphens>39Tags: <2 to 4 existing or new topic tags>40Section: <section name from the voice profile, or "main">41Audience: <everyone | only_paid | founding | only_free>42Paywall: <none | after the paragraph starting "...", with one line on why>43Email subscribers: <yes | no | ask the user>44Words: <count> · Clipping risk: <yes | no>45Slots to fill: <list or "none">46```4748Mark the paywall in the draft with `<!-- paywall -->` on its own line if there is one.4950## Publishing5152Hand the draft and package to `substack-publisher` when the user wants it live. This skill doesn't publish.5354## Common mistakes5556| Mistake | Fix |57|---|---|58| Replying with only questions | Skeleton, package, then questions |59| Leaving out SEO, slug or tags because the user didn't ask | The package is always complete |60| Ignoring a 9,000 word target | Warn about clipping first |61| Inventing the cost, date or result in a section | Slot it |