Stub reader-magnet welcome course, active: false pending Cate's story
Sync courses / sync (push) Failing after 6s
Sync courses / sync (push) Failing after 6s
Placeholder welcome-email copy in Cate's voice (Fantasy Michigan), wired end-to-end but not enrollable until the real manuscript/cover/epub land.
This commit is contained in:
@@ -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 }}
|
||||||
@@ -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.
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user