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.js starts the server and loads the kernel.
  • sites/<name>/site.json declares 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.json describes 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.