Mirrors michaelferrara-eec-courses. course.yml is active: false and all copy is TODO until the real reader-magnet file/cover art are ready and the thistleandmoth-list Listmonk list exists. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
thistleandmoth-eec-courses
Course content for eec, the self-paced
email course engine — this instance served at eec.thistleandmoth.org. Push to
master and CI syncs courses/ straight to production — there's no staging
step, so treat a push here the same as a push to eec itself.
Full reference for course/step file format, course.yml fields, the
readiness step, drip-triggered courses, and sync guardrails lives in the
eec-courses README — the
format is identical, only the target instance differs.
Layout
courses/
reader-magnet/
course.yml
day-0.md
day-1.md
reader-magnet is the funnel for thistleandmoth.org's /gift page (see the
thistleandmoth-site repo). Same shape as michaelferrara.org's: landing page
signup → subscriber added to the thistleandmoth.org Listmonk list immediately
(signup_list_name in course.yml, no click required) → the reader-magnet
file email goes out ({{.CTALink}} in day-0.md is a direct download link,
not a webpage) → a day-1 follow-up email 24h later with no list/conversion
mechanics of its own.
Stub — two things need to happen before this goes live
course.ymlisactive: false. All the content below is a placeholder (TODO subject lines, TODO body copy, and aredirect_urlpointing at a file that doesn't exist yet in thethistleandmoth-downloadsbucket — seethistleandmoth-site's/giftpage, which is the same kind of stub). Replace the TODOs with real copy once the reader-magnet file and cover art are ready, then flipactive: true.signup_list_name: "thistleandmoth-list"doesn't exist yet in Listmonk. Sync rejects the course outright if the name doesn't resolve to exactly one list — create that list in the Listmonk admin UI first (matching the naming convention ofmichaelferrara-list/Two Squirrels Press), then push.
Until both of those are done, CI runs against this repo will fail sync with a clear error — that's expected, not a sign anything's broken.
Deploying
Push to master → .gitea/workflows/sync.yml tars up courses/ and
POSTs it to this domain's eec-thistleandmoth container over the internal
Docker network, authenticated with THISTLEANDMOTH_EEC_SYNC_TOKEN (a Gitea
Actions secret shared with the eec-thistleandmoth Ansible role's copy). No
separate deploy step, no staging — a push here goes live immediately (once
active: true and the Listmonk list exist).