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
| Concern | Choice |
|---|---|
| Framework | Next.js (App Router) with output: export |
| Styling | Tailwind CSS v4 |
| Writing | MDX files in the repo |
| Highlights | Shiki, at build time |
| Hosting | Cloudflare 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:
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.