Context
Claire Daily is my own writing site — where I publish a weekly newsletter and travel-log notes without depending on a platform I don’t control. I run the whole thing: content model, templates, design system, and deployment.
What I built
The design goal was that publishing should cost almost nothing once the system was in place.
- Auto-indexing archive — the archive, the category pages and the “latest post” block on the homepage are all generated from the posts folder with Liquid loops (
group_by_exp). Adding a post means dropping one Markdown file in_posts/; every listing updates itself, with no links to edit by hand. - A documented design system — colours, type and spacing live in one CSS file backed by a written brand spec, not scattered ad-hoc values. Every text/background pairing is checked against WCAG AA contrast before it ships.
- Separation of source and output — drafts and private docs are excluded from both the repo and the build, so the published site only ever contains what’s meant to be public.
Iteration
The site reached “drop a file and forget it” in stages, each one removing a manual step.
Migration
Partway through I moved hosting from GitHub Pages to Cloudflare Pages, and the site onto a dedicated subdomain. Deployment is now push-to-build: a commit to main triggers Cloudflare’s build, with no separate deploy step. DNS lives on Cloudflare, and the old platform’s custom-domain artefact was removed once the new setup was handling everything — a clean cut rather than two half-configured hosts.
Outcome
Publishing a post is one file and one push. The site is live at blog.clairedaily.com, and the conventions behind it — content model, palette, deploy flow — are written down as a working spec, so the system stays maintainable instead of living only in my head.