Skip to content
Colophon

In the tradition of putting the production notes on the last page.

Type

Everything you read is set in Space Grotesk: headlines and body are the same family, just different weights, which keeps the page honest. Anything that behaves like an instrument, such as labels, dates, numbers, or buttons, is JetBrains Mono, uppercase and letterspaced so it reads as data, not prose.

Palette

Dark by default: near-black panels, hairline borders, and one lime accent doing all the pointing. There’s a paper-grey light sheet if you’d rather. The toggle in the nav remembers your choice. On light paper the lime gets mixed down so text stays readable; the accent is for emphasis, never decoration. A second, quieter token, --depth, does the far-away work: trim, joinery, and the far walls fading into fog in the house below, never text.

House

This is a procedural three.js house: an architect’s maquette of a small building at night, one soft key light and a hemisphere fill, every edge traced in ink. Seven rooms, each one a page. The hall is home, its front door the porch is contact, and doors lead to a gallery of paintings for work, a study for about, a reading room for notes, and a workshop for this page. Walking through a door is following a link: the camera eases along a curve that passes through the opening’s centre, the leaf swings past perpendicular as you near it, and the route changes underneath you a beat before you arrive. The plinth in the hall carries a small contour model, twelve layers cut from the last year of commits the way a survey map cuts a hill into elevations, one layer per set of weeks. Everything you can read is still ordinary DOM text laid over the render, never drawn into it, so the house is a picture of the site and never a replacement for it.

None of this runs everywhere, on purpose. A classic look, the page you would have found on a browser with no WebGL, stays one toggle away in the nav, and it is what a phone, a reduced-motion setting, or a slow render gets by default: the house eases its own quality down first, and hands the page back with a small note if that still is not enough. The toggle remembers your choice, and the room you left is the room you find again.

Engine

Next.js rendered on the server, PostgreSQL through Drizzle behind a small admin panel I built, so edits are a form, not a deploy, hosted on Render behind Cloudflare. Stats come from the GitHub, LeetCode, and Codeforces APIs with a last-good-snapshot fallback: a flaky upstream can never blank a page. The resume page prints properly, too; try it.

  • Next.js · App Router, server components
  • PostgreSQL · Drizzle ORM
  • Render · Cloudflare
  • three.js · the house, loaded per room
  • GitHub, LeetCode, Codeforces APIs · Live Record