Colophon — how this site is built
The stack, the constraints, and the small decisions behind this site.
This site is a single-binary thought: minimal stack, no CMS, no third-party analytics, no client-side router beyond what Next gives me for free. The goal was to make something that loads instantly, reads well, and stays out of the way of writing.
Stack
- Next.js 15 with the App Router, statically generated where possible.
- MDX for notes — files live in
content/notes/*.mdx, parsed at build time. - Tailwind for layout, with five colors total.
- Shiki via
rehype-pretty-codefor code blocks. - Umami (self-hosted) for analytics — no third-party scripts, no cookies.
- Packaged as a Docker container, served behind nginx with a free Let's Encrypt cert, on a Hetzner box that hosts the rest of my infra.
Constraints I gave myself
- Minimal client JavaScript. The only custom client code is the command palette, the nav, and the status-bar clock — everything else renders on the server.
- One accent color (
#FFB000), reserved for interactive and live elements. - Mono for chrome and metadata; serif for prose. Sans appears nowhere.
- Nothing in the chrome is decorative fiction: the
BUILDhash in the status bar is the git commit this deployment was built from, and the clock next to it is actually ticking.
What it doesn't do
There's no comment system, no newsletter form, no related-posts widget, no "share" buttons. If you want to reach me, the contact page has the channels. If you want updates, the RSS feed is the only subscribe channel.
On the analytics side
I run Umami in a sibling container, reachable at
analytics.haythamichahbane.com (private). It records pageviews,
country, referrer, and time on page — nothing personal, no IP
fingerprinting, no cookies. The dashboard is one screen.