# cateconners-eec-courses Course content for [eec](https://gitea.reground.org/will/eec), the self-paced email course engine — this instance served at eec.cateconners.com. 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 whole funnel: landing page signup → subscriber is added to the cateconners.com Listmonk list immediately (`signup_list_name` in `course.yml`, no click required) → the story email goes out (`{{.CTALink}}` in `day-0.md` is meant to be a direct download link, not a webpage) → a day-1 follow-up email 24h later with no list/conversion mechanics of its own. `signup_list_name` in `course.yml` must exactly match a list that already exists in Listmonk — create it there first, then push. Sync rejects the course outright if the name doesn't resolve to exactly one list. **Status: stubbed, `active: false`.** Cate's manuscript, title, and cover art aren't in hand yet, so `day-0.md`/`day-1.md` are placeholder copy and `course.yml`'s `download_url`/`redirect_url` point at a bucket path that doesn't have a real file behind it yet. Once the real story, cover, and epub are ready: 1. Upload the epub/cover via `downloads-uploader` (`./upload.sh --site cateconners --slug reader-magnet story.epub cover.jpg`). 2. Replace the placeholder copy in `day-0.md`/`day-1.md` and this repo's `course.yml` `name:`. 3. Update `will/cateconners-site`'s `content/gift/index.md` and `content/gift-thanks/index.md` the same way. 4. Flip `course.yml`'s `active` to `true` and push. ## Deploying Push to `master` → `.gitea/workflows/sync.yml` tars up `courses/` and `POST`s it to this domain's `eec-cateconners` container over the internal Docker network, authenticated with `CATECONNERS_EEC_SYNC_TOKEN` (a Gitea Actions secret shared with the `eec-cateconners` Ansible role's copy). No separate deploy step, no staging — a push here goes live immediately.