why
Every year or so I look at my personal site and wince. The old one worked, but it didn't feel like something I'd built recently. It felt like a template with my name pasted over it. This rebuild is a small act of self-respect: a site that looks like me, updates itself, and gives visitors one thing that makes them smile.
how
The stack is deliberately boring:
import { Inter, JetBrains_Mono } from "next/font/google";
export const inter = Inter({
subsets: ["latin"],
variable: "--font-inter",
display: "swap",
});- Next.js 15 on the App Router: server components let me fetch GitHub at request time without shipping JS to the client.
- Tailwind v4 for CSS-first design tokens.
- MDX for writing, with Shiki doing the syntax highlighting at build.
- Biome because I don't want to think about lint config.
The one interesting piece is the GitHub sync: projects surface from a live API call cached at the edge, invalidated by a webhook. New repo → visible in ≤ 30s. No redeploy.
what surprised me
Three things:
- Removing images was liberating. I thought I'd miss project screenshots. I don't. Typography does more work than I gave it credit for.
prefers-reduced-motionis a great litmus test. If your site still works with all animations disabled, you probably didn't need most of them.- A
curlresponse feels like a signature.curl portfolio.hstart.inreturns an ANSI résumé. It costs almost nothing and it makes engineers grin.
what's next
Writing more. Shipping the GitHub sync. Wiring Strava into the /now page so
the training log updates itself. If you spot anything broken or ugly, let me
know, that's how it gets better.