Skip to content
bitsmonk
Writing

Building bitsmonk.com

A personal site should be cheap to run, fast everywhere, and easy to change without fear. This one is plain HTML, CSS and a little JavaScript, generated once at build time and served from Cloudflare's edge. There is no server to keep alive and nothing to patch at 2 a.m.

The stack

ConcernChoice
FrameworkNext.js (App Router) with output: export
StylingTailwind CSS v4
WritingMDX files in the repo
HighlightsShiki, at build time
HostingCloudflare Pages

Static export gives me the good parts of Next.js (components, file-based routing, the metadata API, generated social images) and leaves out the parts that need a running server.

Content lives next to code

Each post is an .mdx file. Its metadata is a plain export at the top of the file, and it's checked when the site builds:

src/content/writing/hello.mdx
export const metadata = {
  title: "Hello",
  summary: "One sentence about the post.",
  publishedAt: "2026-10-22",
};

If a date is malformed or a title is missing, the build fails with the file name in the error. A broken post never reaches production.

No flash, no tracking

The theme follows your system setting until you choose otherwise. A tiny inline script applies it before the first paint, so the page never flickers between light and dark. There are no analytics scripts, cookies or third-party requests.

Headers at the edge

Because there's no server, security and caching headers live in a _headers file that Cloudflare Pages applies at the edge: a Content Security Policy, HSTS, and long-lived immutable caching for fingerprinted assets.

That's the whole thing. It's small on purpose.