Skip to content

newsletter-prep: draft the next campaign issue automatically - #16

Merged
ralyodio merged 4 commits into
mainfrom
feat/newsletter-prep
Sep 24, 2026
Merged

ralyodio merged 4 commits into
mainfrom
feat/newsletter-prep

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Companion to #15. Drafts the next issue three days out and mails a test copy, so the only manual step left is reading it.

  • Gathers blog posts and GitHub releases since the previous issue, drafts from that material only, then checks every link itself and drops bullets whose links are dead.
  • Creates the issue in myna with that issue's A/B design (--cta-set from the plan) and sends one test copy.
  • Mails the exact line that schedules it; the running myna-daemon sends it at its hour, so nothing else is needed.

Why it stops at the test copy. The first fully automatic draft pulled a 21+ cigar post into a newsletter aimed at every customer. That is what EXCLUDE_WORDS now catches, but it is also why the last step is a person. The earlier hand-written draft had a 404 install link in it too, caught only by checking.

Installed on dev, daily at 06:00 UTC, alongside the #15 digest at 05:25. Both cron lines carry a note to delete them when the month ends.

🤖 Generated with Claude Code

ralyodio and others added 4 commits September 24, 2026 10:52
… the test copy

Gathers every blog post and release since the previous issue, drafts from that
material only, checks every link and drops the dead ones, creates the issue in
myna with its A/B design and mails one test copy.

It stops before the send on purpose. The first automatic draft put a 21+ cigar
post in a newsletter to every customer, found by the exclusion list rather than
by the writing, and the earlier hand-made draft carried a 404 install link that
only a check caught. A person reads the test copy, then the daemon sends it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…nd wrap up at the end

003 and 004 name a set an earlier issue decides, so the run fell back to
default and says so rather than dying on the day. When no sends are left, the
last run mails the campaign's numbers instead of going quiet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Each run marks off whatever myna has actually sent and tops the plan up, so
there is always a future issue on the books. Without the reconciliation step
the plan's sent flags never flipped, the same issue stayed next forever and
the schedule stalled after one send.

A recurring block sets the cadence; --plan runs it against a copy.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ralyodio
ralyodio merged commit 1b286e6 into main Sep 24, 2026
4 checks passed
@ralyodio
ralyodio deleted the feat/newsletter-prep branch September 24, 2026 11:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant