A personal blog where the Git repository is the single source of truth. Posts, pages, images, build logic, and the custom in‑browser admin all live here as plain files — no database, no external CMS host.
The stack is intentionally small: plain Markdown → Eleventy static build → Cloudflare Pages hosting, with GitHub Actions for post‑publish automations and a custom /admin/ editor that commits straight to Git.
GitHub repository ── single source of truth (Markdown, images, build logic, /admin/ app)
│
├─ /admin/ edit posts, pages & media in the browser → each save commits to the `drafts` branch
├─ Publish applies the pending changes from `drafts` onto `main`
├─ GitHub Actions build & deploy _site from `main` + run post‑publish automations (social, IndexNow, …)
└─ Cloudflare Pages serves the deployed _site (uploaded via wrangler) + Pages Functions
mainis exactly what is published.draftsis the shared working copy the admin reads and writes, so editing continues across devices (desktop and mobile).- Cloudflare Pages is only the static host plus a few Pages Functions (admin auth + GitHub API proxy). There is no host‑specific site logic.
- Drafts (
draft: true) and future‑dated posts are excluded from the built site.
npm install # install dependencies
npm start # local dev server (http://localhost:8080)
npm run build # production build into _site/
npm run lint # lint the admin app (runs automatically in build)The generated static site is written to _site/.
Start here, then follow the topic you need — each page covers only its own area.
| Page | What it covers |
|---|---|
| docs/content.md | Writing posts & pages: frontmatter, types, drafts, Markdown conventions, embeds |
| docs/media.md | Images (captions, alt text, automatic optimization) and self‑hosted videos |
| docs/admin.md | The custom /admin/ editor: the drafts‑branch model, publishing, mobile use, OAuth |
| docs/social.md | Social posting to Mastodon & Bluesky — full social-config.json reference |
| docs/automations.md | IndexNow, Web Archive, Webmentions, Backup Git, and the GitHub Actions CI build |
| docs/deployment.md | Local development, GitHub setup, and Cloudflare Pages configuration |
| docs/architecture.md | Folder structure, design decisions, trade‑offs, URL preservation, backup & migration |
All human‑authored content stays accessible as plain files (blog/posts/*.md, blog/pages/*.md, blog/assets/). Opening the repository is enough to read, copy, migrate, or rebuild everything.