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
- No JavaScript on pages that don't need it. The homepage ships ~6 KB of JS (just the command palette).
- One accent color (
#FFB000), reserved for interactive and live elements. - Mono for chrome and metadata; serif for prose. Sans appears nowhere.
- The status bar at the top shows the real build hash — if it says
BUILD 0a1f, that's the actual commit.
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.