DEV Community

孫昊
孫昊

Posted on

I Drafted 9 Months of Substack Issues in One Sitting. Here's the Calendar Pattern.

TL;DR: Wrote 18 paste-ready Substack issues in one ~2-hour session, covering Day 67 → Day 124 of an indie experiment. Each issue has YAML frontmatter with publish_target_date, body with TBD placeholders for actuals at publish time. Saves me from writing while behind, lets me focus weekly on data-fill rather than blank-page composition.


The pattern: skeleton + actuals

Each Substack issue has 2 phases:

Phase 1: Skeleton (write months ahead)

---
id: substack-37-day-90-milestone
title: Substack #37 - Day 90 Milestone (3-Month Cumulative Report)
publish_target_date: 2026-06-06
---

# Day 90 Milestone — 3-Month Cumulative Report

## Cumulative Day 1 → Day 90

(Fill in 2026-06-06 with actuals.)

### Apps
- Apps in App Store: [TBD]
- Total downloads: [TBD]

### Gumroad
- Total sales: [TBD] units
- Cumulative revenue: $[TBD]

[... full skeleton with all section headers and TBD placeholders]

## Day 91-180 plan

(Fill in 2026-06-06 — depends on Day 90 outcome.)

If Path A: ...
If Path B: ...
If Path C: ...

[... contingency plans for each scenario]
Enter fullscreen mode Exit fullscreen mode

Phase 2: Data fill (10 min on publish day)

On 2026-06-06, I:

  1. Open daily_briefing.py to get current numbers
  2. Replace [TBD] with actuals
  3. Replace (Fill in YYYY-MM-DD with X.) with the X
  4. Click publish (CDP automation does the rest)

10 minutes of focused work per issue at publish time, instead of 60-90 min of blank-page writing.

Why skeleton + actuals beats writing-on-the-day

1. Compounds editorial decisions over time

When I'm writing the 9-month plan in May, I have brain space for strategy:

  • "Should #37 be the milestone issue or the post-milestone reflection?"
  • "Does the Day 90 to Day 180 narrative arc make sense?"
  • "Which 3 metrics matter most across the 9 months?"

If I waited to write each issue on its publish day, I'd be in the weeds + answering email + putting out fires. Strategic thinking dies.

2. Catches gaps in advance

Writing 18 skeletons exposed:

  • 2 weeks where I had no clear narrative (filled with "mid-quarter check")
  • 1 week that needed a contrarian counter (added)
  • 1 week that needed a "what's next" hook (added)

I wouldn't have caught these writing one issue at a time.

3. Frees the publish day for data accuracy

When I publish on 2026-06-06, my entire focus is "are these numbers right?"

Not "what should I write?" + "are these numbers right?"

Data accuracy gets the focus it deserves.

The 18-issue catalog (real example)

substack-21-15-page-b2b-funnel.md            (publish 2026-05-07) — LIVE
substack-22-90-min-iap-setup.md              (publish 2026-05-07) — LIVE
substack-23-day-60-milestone.md              (publish 2026-05-07) — LIVE
substack-24-day-67-week-1-data.md            (publish 2026-05-14)
substack-25-day-74-week-2-data.md            (publish 2026-05-21)
substack-26-day-81-week-3-data.md            (publish 2026-05-28)
substack-27-day-88-week-4-data.md            (publish 2026-06-04)
substack-28-day-90-milestone.md              (publish 2026-06-06)
substack-29-day-95-week-1-after-milestone.md (publish 2026-06-11)
substack-30-day-102-week-2.md                (publish 2026-06-18)
substack-31-day-109-week-3.md                (publish 2026-06-25)
substack-32-day-116-week-4.md                (publish 2026-07-02)
substack-33-day-180-milestone.md             (publish 2026-09-04)
substack-34-day-200-q1-2027-mid.md           (publish 2026-10-15)
substack-35-day-67-first-week-after.md       (publish 2026-05-15)
substack-36-day-74-second-week.md            (publish 2026-05-22)
substack-37-day-90-milestone.md              (publish 2026-06-06)
substack-38-day-97-first-week-after-90.md    (publish 2026-06-13)
Enter fullscreen mode Exit fullscreen mode

Plus #39-#41 covering Day 104-124. Total: 21 issues spanning Day 60 → Day 124.

Time investment

Writing 18 skeleton issues in one session:

  • Setup time: 30 min (template + 2 example issues)
  • Per-issue draft: ~6 min (skeleton + TBD placeholders)
  • Total: 30 + (6 × 18) = ~140 min

vs writing 18 issues one at a time:

  • Setup: 30 min × 18 = 9 hours of context-switching
  • Per-issue actual writing: 60-90 min
  • Total: ~22-32 hours

Saves me 18-26 hours of writing time over 9 months.

Calendar collision detection

Skeleton-first lets me detect calendar collisions. For example:

  • I want to publish a "Day 90 milestone" issue
  • I also want a "first week after Day 90" issue
  • Both need Day 90 actuals

Solution: Day 90 milestone publishes 2026-06-06 with full numbers; "first week after" publishes 2026-06-13 with delta-from-90 numbers.

If I'd written one at a time, I'd have written both with full numbers. Redundant.

Source

Full Substack content calendar template + 18 example skeletons + CDP publish automation:

AutoApp Dashboard ($39) includes:

  • 18 paste-ready Substack issue templates (Day 60 → Day 124)
  • substack_publish.py (CDP automation)
  • manifest_scan.py (frontmatter aggregator + calendar viewer)

If you're writing every Substack issue on the day of publish, you're missing the strategic editorial layer. 18 skeletons in 2 hours. 9 months of less stress.

Top comments (0)