commit 64805de29c9376f29a7c467fa8142631dd767ebe Author: Will Estes Date: Mon Jul 20 14:27:36 2026 -0400 Stub reader-magnet welcome course, active: false pending Cate's story Placeholder welcome-email copy in Cate's voice (Fantasy Michigan), wired end-to-end but not enrollable until the real manuscript/cover/epub land. diff --git a/.gitea/workflows/sync.yml b/.gitea/workflows/sync.yml new file mode 100644 index 0000000..573ebfe --- /dev/null +++ b/.gitea/workflows/sync.yml @@ -0,0 +1,26 @@ +name: Sync courses +on: + push: + branches: [master] + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Package and sync + run: | + tar czf /tmp/courses.tar.gz courses + status=$(curl -s -o /tmp/sync-response.json -w '%{http_code}' \ + -X POST "http://eec-cateconners:8080/admin/sync" \ + -H "Authorization: Bearer ${CATECONNERS_EEC_SYNC_TOKEN}" \ + --data-binary @/tmp/courses.tar.gz) + cat /tmp/sync-response.json + echo + if [ "$status" -ge 300 ]; then + echo "sync failed with status $status" + exit 1 + fi + env: + CATECONNERS_EEC_SYNC_TOKEN: ${{ secrets.CATECONNERS_EEC_SYNC_TOKEN }} diff --git a/README.md b/README.md new file mode 100644 index 0000000..56d6e47 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# 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. diff --git a/courses/reader-magnet/course.yml b/courses/reader-magnet/course.yml new file mode 100644 index 0000000..46a640f --- /dev/null +++ b/courses/reader-magnet/course.yml @@ -0,0 +1,13 @@ +# STUB — active: false until Cate's real story/cover/epub are ready. +# See this repo's README "Status: stubbed" section before flipping this on. +active: false + +slug: reader-magnet +name: "Reader Magnet (short story epub) — TODO: real title" +from_email: hello@cateconners.com +ceiling_hours: 24 +signup_list_name: "cateconners-list" + +steps: + - file: day-0.md + - file: day-1.md diff --git a/courses/reader-magnet/day-0.md b/courses/reader-magnet/day-0.md new file mode 100644 index 0000000..72ba7dc --- /dev/null +++ b/courses/reader-magnet/day-0.md @@ -0,0 +1,20 @@ +--- +subject: "Here's your story: [STORY TITLE]" +redirect_url: "https://downloads.cateconners.com/reader-magnet/story.epub" +--- + +Thank you for finding your way here. + +I write Fantasy Michigan — old-growth woods, lakes that keep their own +secrets, and the kind of magic that feels like it's always been +half-visible at the edge of the Upper Peninsula, if you knew where to +look. [STORY TITLE] is a short story set in that world, and I wanted you +to have it first. + +Click below and it'll download straight to your device. + +[Get my story]({{.CTALink}}) + +Enjoy the ride, + +Cate diff --git a/courses/reader-magnet/day-1.md b/courses/reader-magnet/day-1.md new file mode 100644 index 0000000..d487d18 --- /dev/null +++ b/courses/reader-magnet/day-1.md @@ -0,0 +1,15 @@ +--- +subject: "About [STORY TITLE]..." +--- + +So — [STORY TITLE]. + +[TODO: a line or two of behind-the-scenes color. What in Michigan inspired +this one? What's the next book/story in this world?] + +I'll write again when there's real news — a new release, an event, or +just another story worth sending. No spam, no noise. + +Thanks for reading, + +Cate