# thistleandmoth-eec-courses Course content for [eec](https://gitea.reground.org/will/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`](https://gitea.reground.org/will/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 1. **`course.yml` is `active: false`.** All the content below is a placeholder (TODO subject lines, TODO body copy, and a `redirect_url` pointing at a file that doesn't exist yet in the `thistleandmoth-downloads` bucket — see `thistleandmoth-site`'s `/gift` page, which is the same kind of stub). Replace the TODOs with real copy once the reader-magnet file and cover art are ready, then flip `active: true`. 2. **`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 of `michaelferrara-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 `POST`s 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).