Rebuilding lisovyi.net: static, typed, zero JavaScript

My previous site was a simple hand-rolled page. It worked, but it wasn’t mine in the ways that matter: no typed content, no source-controlled history, no way to publish from a terminal.

The rebuild has a few deliberate constraints:

No client-side JavaScript

Every page is server-rendered HTML. There are no hydration scripts, no framework runtime, no analytics. The result is a page that loads fast on any connection and works with JavaScript disabled.

Content collections with schemas

Every blog post is a Markdown file validated by a Zod schema at build time. If I forget a pubDate or mistype a tag, the build fails with a readable error instead of shipping broken metadata.

Raw Markdown mirrors and llms.txt

Every post is also served as raw Markdown at /blog/<slug>.md, and llms.txt is generated at build time listing every live page. AI agents (and humans with curl) can read the source directly.

Publishing is a git push

The whole workflow is:

write src/content/blog/my-post.md
git commit
git push

Push to beta for a staging deploy at beta.lisovyi.net, merge to main for production. That’s it. That’s the CMS.