From mph-kit
End-to-end Substack pipeline: takes a subject, produces a draft or published post at mphinance.substack.com by chaining voice writing, figure rendering, and a local draft pusher.
How this skill is triggered — by the user, by Claude, or both
Slash command
/mph-kit:mph-substack-publishThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
End-to-end pipeline. Subject in → draft in mphinance.substack.com out (or published post if asked explicitly).
End-to-end pipeline. Subject in → draft in mphinance.substack.com out (or published post if asked explicitly).
draft) — draft creates a draft only. publish calls /api/v1/drafts/{id}/publish after the draft lands. Always confirm explicitly with Michael before publish mode — that triggers the subscriber email blast and is not reversible.builder — build-in-public, tool launches, code drops. No NFA needed. Default.trade — specific positions / picks / "I bought X". NFA disclaimer required.paid_tease — free post with a paywalled follow-up; include the "what's behind the paywall" section.recovery — personal / sappy / non-finance reflection. No NFA.Read the voice corpus. Read ~/.claude/skills/mph-substack-writer/SKILL.md and ~/.claude/skills/mph-voice-refresh/VOICE.md. The hard rules and RETIRED phrases there supersede anything else.
Pick a slug + workspace.
YYYY-MM-DD_kebab-case-title~/.mph-substack-cache/<slug>/ (create if missing). All intermediate files live here, not in the project repo. NEVER write Substack drafts to docs/substack/drafts/ anymore — Michael does not want post markdown checked into git.Draft the post following the mph-substack-writer skeleton:
 referencepaid_tease category)Render any figures. For tables, comparison cards, stat blocks — write HTML in the workspace folder, render via mph-figure:
node ~/.claude/skills/mph-figure/scripts/render.mjs --in <workspace>/foo.html --out <workspace>/foo.png --html
Reference in markdown as . Substack will receive these as uploaded S3 images.
Push to Substack via the script (handles image upload + ProseMirror conversion + cover image). The pusher lives in the mphinance repo, but the repo path differs per machine, so resolve it for wherever you're running:
C:/Users/mphan/OneDrive/Documents/GitHub/mphinance/substack_social/create_draft_from_md.pymph): ~/mphinance/substack_social/create_draft_from_md.pygit rev-parse --show-toplevel from inside the mphinance checkout, or find ~ -path '*substack_social/create_draft_from_md.py'.python <pusher> <workspace>/post.md
It prints the edit URL. Surface that URL to Michael.
If mode is publish (only with Michael's explicit confirmation):
python <pusher> <workspace>/post.md --publish (same <pusher> resolved in step 5)Use one of these three at the end of EVERY post. Replace the --- separator with markdown horizontal rule (Substack handles it). Do not improvise alternative sign-offs or CTAs; consistency matters more than novelty here.
builder (default) — no NFA— Michael
---
*If this helped, subscribe so the next one lands in your inbox.*
trade — with NFA— Michael
---
*Not financial advice. Do your own research. Don't trade on someone else's conviction.*
*If this helped, subscribe so the next one lands in your inbox.*
paid_tease — with paywall section above the footer## What's behind the paywall
[one-paragraph tease of the paid follow-up — what it covers, when it drops, why it's worth paying for]
— Michael
---
*If this helped, subscribe so the next one lands in your inbox. Paid subs get the deep version on [day].*
The pusher script create_draft_from_md.py lives in the mphinance repo. The absolute path above means this skill works whether Claude is invoked from the mphinance repo, a different repo, or anywhere else. If Michael moves the repo, update the path in this SKILL.md.
The script reads secrets.env from the mphinance repo automatically (resolved relative to the script's parent dir), so SUBSTACK_SID lookup works regardless of CWD.
— Michael. No last name. No MPH initials. No title. No "Managing Partner." No "The Phund." Just the em-dash + first name. (Yes, this is the one place an em-dash is allowed — it's the conventional dash for a signature, not narrative prose.) The MPH handle is fine as a brand/handle in body text ("@mphinance", "the mphinance newsletter") but never as a sign-off — that's the same as using the last name.builder posts. Adding "not financial advice" to a post about building a Python tool reads like a lawyer wrote it. The top-engagement posts in Michael's network (Stephane Derosiaux, Pawel Jozefiak, Jenny Ouyang, even Compounding Quality who literally posts his trades) have ZERO NFA in the body.~/.mph-substack-cache/ is ephemeral. Don't commit it to git. Don't write to docs/substack/drafts/.builder (it's a build-in-public post about a stack change)drafthttps://mphinance.substack.com/publish/post/199012345trade (specific position)draftpublish mode confirmed? Ask: "Confirm you want this published live, not drafted? That'll send the email blast to all subscribers."--publish flag after explicit yes.rawHtml.secrets.env.npx claudepluginhub mphinance/alpha-skills --plugin mph-kitProduces a complete Substack article package (README, images, notes, subject lines, promo) from a single topic, using repo voice and brand files.
Writes, optimizes, and grows Substack newsletters and web posts including ghostwriting with voice matching, algorithm optimization, Notes strategy, SEO, growth tactics, and monetization planning.
Orchestrates Substack Note creation by sequencing research for strategy and writing for content, using newsletter context, lifecycle phases, and content bank ideas.