// the find
swyxio/swyxdotio
This is the repo for swyx's blog - Blog content is created in github issues, then posted on swyx.io as blog pages! Comment/watch to follow along my blog within GitHub
swyx's personal site, built on SvelteKit 2/Svelte 5 with GitHub Issues as the CMS. Posts live as GitHub Issues; a webhook hits Cloudflare Workers to refresh a KV-backed content manifest so publishes are instant without a full redeploy. It's a real production site, not a demo.
The caching architecture is well thought out: KV stores the parsed content manifest, the Cache API handles edge caching keyed by KV generation, and a webhook invalidates both on publish — so neither GitHub nor cold Workers are in the hot path for readers. The hybrid rendering split (prerendered static pages + on-demand SSR posts, edge-cached) is the right call for a blog that mixes evergreen and frequently-updated content. Search is lazy-loaded only when the search box is used, which avoids shipping full article bodies to every visitor. The test suite covers the non-trivial pieces — markdown rendering regressions, slug logic, content manifest parsing — rather than just happy-path routes.
GitHub Issues as a CMS is a fun hack but it's someone else's database you don't control — rate limits, API changes, or account issues can take your content layer down. The KV manifest is a mitigation, not a fix. The workflows directory is renamed `ignoregithub` to prevent Actions from running, which is a workaround that will confuse anyone forking this. There's no content migration story: posts are GitHub Issue numbers in disguise, so moving off GitHub Issues later means rewriting every URL or setting up redirects. The podcast admin tooling is woven directly into the site routes rather than being a separate app, which adds meaningful surface area to what should be a read-heavy public site.