Deploy — Distribution-Vault auf Cloudflare-Pages

Push-and-forget. Du editierst Distribution/, pushst zu GitHub, Cloudflare baut + deployed automatisch. ~15min One-Time-Setup.

Was du dazu brauchst

WasFree?Account-Link
1GitHub Accounthttps://github.com/signup
2Cloudflare Accounthttps://dash.cloudflare.com/sign-up
3Node 22+ lokal(haben wir schon — 23.3.0 läuft)

Optional: eigene Domain (z.B. distribution.a-friend.ai) — geht später, nicht nötig für Launch.

Step 1 — GitHub Private Repo (one-time)

afriend-business hat noch kein Remote. Push als private Repo:

# in afriend-business root
gh repo create afriend-business --private --source=. --remote=origin --push

oder via Web-UI:

  1. https://github.com/new → name afriend-business, Private, kein README/.gitignore (haben wir schon)
  2. Locally:
    git remote add origin git@github.com:<your-handle>/afriend-business.git
    git push -u origin main

Wichtig: Repo MUSS private bleiben — afriend-business enthält AD-Strategy + Marco-Notes + sensitive Biz-Daten. Cloudflare-Pages funktioniert trotzdem (es liest privat via OAuth-Connect).

Step 2 — Cloudflare-Pages Project (one-time)

  1. https://dash.cloudflare.comWorkers & PagesCreate applicationPagesConnect to Git
  2. Authorize Cloudflare GitHub-App → select afriend-business repo
  3. Build configuration:
    • Project name: a-friend-distribution → wird zu https://a-friend-distribution.pages.dev
    • Production branch: main
    • Build command:
      cd Distribution && npm --prefix _quartz install --no-engine-strict && node _scripts/build.mjs
      
    • Build output directory: Distribution/_quartz/public
    • Root directory (advanced): leave empty (Cloudflare runs from repo root)
  4. Environment variables (Production + Preview):
    • SITE_BASE = https://a-friend-distribution.pages.dev (used by emit-ics.mjs for VEVENT URL field)
    • NODE_VERSION = 22
  5. Save and Deploy → first build runs (~3-5min)

Step 3 — Apple-Calendar subscribe (per device, one-time)

Mac:

  1. Calendar.app → FileNew Calendar Subscription
  2. URL: https://a-friend-distribution.pages.dev/calendar.ics
  3. Auto-refresh: Every 15 minutes
  4. Color: brown/warm
  5. Subscribe

iPhone:

  1. Settings → Calendar → Accounts → Add AccountOtherAdd Subscribed Calendar
  2. Server: https://a-friend-distribution.pages.dev/calendar.ics
  3. Save — events appear in Calendar.app

Step 4 — Share with Daniel (one-time)

Send him two links:

Backlog + Strategy + Doctrine:
  https://a-friend-distribution.pages.dev/

Calendar subscribe (iPhone — paste in Safari, hit subscribe):
  webcal://a-friend-distribution.pages.dev/calendar.ics

Daniel-Setup:

  • Bookmark first URL on phone Home-Screen
  • Tap second URL in Safari → Apple Calendar opens → confirm subscription
  • Events show in his Calendar — each event has URL → tap opens backlog-entry page

Working day-to-day

# add a Backlog entry (Obsidian or any editor)
vim Distribution/Backlog/2026-06-03-b1-hardware-deep-dive.md
 
# locally verify ics is right
node Distribution/_scripts/prebuild.mjs
 
# push → Cloudflare auto-rebuilds in ~60s
git add Distribution/ && git commit -m "BACKLOG +b1 hardware deep dive" && git push

Daniel sees the new event in Apple-Calendar within 15min (refresh interval).

Custom Domain (optional, anytime later)

CF-Pages → Project → Custom Domains → Add distribution.a-friend.ai → CF auto-creates DNS-CNAME. URL flips to https://distribution.a-friend.ai/.

Update SITE_BASE env var → re-push → ICS now points at custom domain.

Troubleshooting

Build fails on “npm error EBADENGINE”: Check Build-Cmd uses --no-engine-strict (Quartz requires npm 10.9.2+, CF runs older sometimes).

calendar.ics 404 in CF deploy: Check Distribution/_quartz/public/calendar.ics exists post-build. Run node _scripts/build.mjs locally and verify.

Apple-Cal doesn’t refresh: Setting → Mail → Accounts → Subscribed Calendar → set “Fetch New Data” to 15min. Default may be “Manually”.

Daniel sees old event: Cache. Apple-Cal honors Cache-Control: max-age=300 set in _headers. After 5min he sees updated.

Roll-back

Want to undo a deploy? CF-Pages dashboard → Deployments → pick prior → Rollback to this deployment. Instant.

File map

Distribution/
├─ _scripts/
│  ├─ build.mjs           ← entry-point (prebuild + quartz + post-copy + headers)
│  ├─ prebuild.mjs        ← sync-doctrine + sync-scripts + emit-ics
│  ├─ sync-doctrine.mjs   ← afriend-script-pool + content-extraction → Doctrine/
│  ├─ sync-scripts.mjs    ← onari content-pool/scripts → Scripts/
│  └─ emit-ics.mjs        ← Backlog/ frontmatter → calendar.ics
├─ _quartz/               ← gitignored node_modules; tracked: config, plugins
│  ├─ quartz.config.ts    ← A Friend palette + content-symlink + ignore-patterns
│  ├─ quartz.layout.ts    ← (Quartz-default)
│  └─ public/             ← gitignored build output
└─ (vault content folders)