What this site runs on
This site is served by a small, custom content platform written in Node.js and Express — no off-the-shelf CMS. It’s built to host several sites from one codebase, each with its own content, theme, and set of enabled features.
How a site boots
Every site is a tiny entry point that hands off to a shared kernel:
sites/<name>/app.jsstarts the server and loads the kernel.sites/<name>/site.jsondeclares which modules the site turns on and which theme it wears.- The kernel wires up the requested modules, the theme, and the content directory, then starts listening.
The same kernel powers every site; what differs is the site.json manifest
and the content.
Content model
All content is plain files on disk — easy to back up, edit, and reason about.
- Pages — markdown in
content/pages/, served at/<slug>(this page is one of them). Pages don’t show in the post list or RSS. - Posts — markdown in
content/posts/, with the blog index, tags, and an RSS feed. - Navigation — a single
nav.jsondescribes the top menu, including dropdowns. - Themes — a set of CSS custom properties (colors, type scale, spacing) that adapt automatically to light and dark mode.
Markdown is rendered with markdown-it (plus footnotes, anchors, and a few extensions); templates are EJS.
Features, as modules
Functionality is split into independent modules a site can switch on or off —
for example the blog, a contact form, a curated links page, image handling,
analytics, and uptime monitoring. Turning a feature on is a one-line change in
site.json.
Editing
Content is edited through a private admin interface rather than by hand, and changes go live immediately — there’s no rebuild or redeploy step for normal edits.
If you’re curious about the internals, the admin side is documented on a private page.