Skip to content

Commit f22ba3d

Browse files
committed
feat: Reluctant Motivation subscribable calendar feed
Add a fun, on-brand ICS feed people can subscribe to: one all-day note every 2-4 days with gentle encouragement, snark, and calendar-nerd jokes. - gen-motivation-feed.js: deterministic generator, 605 notes across 2026-2030 from a curated pool. Gaps 2-4 days, tones spread so no two adjacent notes share a kind; byte-identical on re-run. - reluctant-motivation.ics: all-day VALUE=DATE events, TRANSP:TRANSPARENT so they never block the day, stable per-date UIDs, refresh hints. - Landing page in the site design system (calendar-grid hero, marigold "today" highlight, agenda view on mobile), copy-URL + webcal/gcal buttons. - SEO: FAQ schema, canonical + OG tags, branded social card, sitemap 0.7.
1 parent 6dd0a85 commit f22ba3d

7 files changed

Lines changed: 6650 additions & 0 deletions

docusaurus.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ const config: Config = {
174174
// Boost the pages we most want crawled and ranked.
175175
if (path === '/') return {...item, priority: 1.0};
176176
if (path.startsWith('/features')) return {...item, priority: 0.8};
177+
if (path === '/reluctant-motivation') return {...item, priority: 0.7};
177178
if (path.startsWith('/docs/getting-started') || path === '/donate' || path === '/work-with-us') {
178179
return {...item, priority: 0.7};
179180
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# Reluctant Motivation feed
2+
3+
A calendar feed people subscribe to for a little encouragement, a little snark,
4+
and the occasional calendar-nerd joke — one all-day note every 2–4 days. It
5+
means well, mostly.
6+
7+
- **Feed:** `https://kashcal.onekash.org/reluctant-motivation.ics`
8+
- **Page:** `https://kashcal.onekash.org/reluctant-motivation`
9+
10+
## Files
11+
12+
| Path | Role |
13+
|------|------|
14+
| `scripts/gen-motivation-feed.js` | Generates the ICS. Deterministic — same inputs, byte-identical output. |
15+
| `static/reluctant-motivation.ics` | The committed feed (Docusaurus serves `static/` at the root). |
16+
| `src/pages/reluctant-motivation.tsx` | The subscribe landing page (calendar-grid hero, FAQ schema, copy button). |
17+
| `src/pages/reluctant-motivation.module.css` | Scoped styles, using the site's brand tokens. |
18+
| `static/img/social/reluctant-motivation.png` | Social share card (1200×630, brand teal). |
19+
20+
## Regenerate the feed
21+
22+
Run on demand — this is a committed source asset, not a build step (same as the
23+
social cards):
24+
25+
```bash
26+
node scripts/gen-motivation-feed.js # this year + 4 (5 years)
27+
node scripts/gen-motivation-feed.js --years 8 # a longer horizon
28+
node scripts/gen-motivation-feed.js --start 2027 --years 5
29+
```
30+
31+
The build is reproducible: the gap between notes and the note chosen for each
32+
date are derived from a hash of `(year, date)`, and `DTSTAMP` is fixed per year
33+
(not "now"), so re-running produces an identical file. Tones are spread so no
34+
two adjacent notes share a kind and the largest kind doesn't clump at the tail.
35+
36+
To add or change notes, edit the `QUOTES` array in `gen-motivation-feed.js`
37+
(each entry is `[kind, text]`, kind is `Gentle` / `Snark` / `Calendar joke` /
38+
`Sincere`) and regenerate. Keep summaries short — they show up in one day cell.
39+
When the feed nears its final year, re-run with a later `--start` and commit.
40+
41+
## Feed shape
42+
43+
Each note is an all-day event (`DTSTART;VALUE=DATE`), `TRANSP:TRANSPARENT` so it
44+
never blocks the subscriber's day, with a stable per-date `UID` and RFC 5545
45+
line folding. Calendar-level `REFRESH-INTERVAL` / `X-PUBLISHED-TTL` / `SOURCE`
46+
tell clients to re-fetch, so new notes appear on their own.
47+
48+
## Social card
49+
50+
Regenerate only if the title/tagline changes (needs `rsvg-convert`):
51+
52+
```bash
53+
# see the inline SVG in git history, or re-run the one-off snippet used to
54+
# create static/img/social/reluctant-motivation.png
55+
```

scripts/gen-motivation-feed.js

Lines changed: 343 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)