← Notes
2 min read

On building this site

Why I moved from Framer to a self-owned Next.js codebase, and what I learned along the way.

metaNext.jsdesign

This site used to live on Framer. It was fine. It looked the way I wanted it to look, and I could update it without touching code. But over time, two things started to bother me.

The first was cost. Not ruinous — but for a site that mostly exists to show work and let people find me, a monthly platform fee felt like dead weight.

The second was ownership. I had no real idea what Framer was doing under the hood. The SEO was whatever they gave me. The performance was whatever they gave me. If they changed something, I absorbed it.

Why Next.js

I've been adjacent to frontend code for long enough to feel comfortable with it, but I'm not primarily an engineer. I needed a setup that was powerful but not punishing. Next.js with the App Router and Tailwind CSS is exactly that — sensible defaults, a clear mental model, and enough flexibility to do what I actually needed.

The biggest unlock was the content pipeline. Markdown files in a /content folder, parsed at build time, rendered as static pages. No CMS dashboard, no content lock-in. I write posts in the same editor I use for everything else.

What I'd do differently

I probably over-thought the type system. The design took three iterations to land somewhere I was happy with — not because the tools were hard, but because I kept second-guessing the serif/sans pairing.

The thing that worked well: writing the content before designing anything. When you have real words in real components, design decisions about hierarchy and spacing become obvious.

Colophon

Built with Next.js 16, Tailwind CSS v4, and deployed on Vercel. Typography: Lora (display) and Inter (body). Source on GitHub.