This is a small custom Hugo theme, hand-built in one sitting and refined since. No framework, no build step, no JavaScript bundler.
Typography
Display and editorial type is Fraunces, set in its variable form with the optical-size axis tuned up at large sizes so the drawing stays sharp. Body and UI type is Geist. Monospace for dates, section numbers, and metadata is Geist Mono.
All three are self-hosted as WOFF2 files, preloaded in the document
head, and served with font-display: swap. No third-party font CDN
loads at runtime.
Palette
A near-black background, #0A0A0B, tinted warm rather than blue. A
warm ivory, #EBE6DC, as the primary ink. A desaturated ember,
#C77A3C, used sparingly, on the order of four prominent moments
per page.
The accent color lives as a single CSS custom property at the top of
main.css. Changing every ember on the site is a one-line edit.
Build
Hugo, extended version. Content lives in /content, data lives in
/data, the theme in /themes/eksi. Adding a blog post is one
markdown file. Updating the Building surface is one YAML file.
No package.json. No node_modules. Nothing to npm install.
What the site is made of
- About 51 KB of CSS, 5 KB of JavaScript, one 54 KB OG image.
- Lighthouse targets above 98 on mobile.
- Grain overlay at 3.5% opacity. Motion disabled for readers who ask.
- Dark-mode only by design. Print stylesheet turns the page into a readable CV on one click.
What it runs on
Hosted statically. No analytics, no cookies, no trackers. The only outbound requests are the pages you ask for.
Structure
Eleven numbered surfaces on the home page. Index, Principles, Work, Engagements, Case Studies, How I Work, Building, Writing, Speaking, Selected Results, Contact. Plus side pages: Now, Reading, and this one.
The numbering is intentional. A thoughtful reader should be able to quote a single section, by number, in an email.
Credits
Fraunces is by Undercase Type. Geist and Geist Mono are by Vercel. The writing, the opinions, and the mistakes are mine.