Early in a software engineering career, a personal site is one of the first things you feel like you need. I'm currently working on Firefox, and I wanted something straightforward, the kind of page that says who you are, what you do, maybe has a blog. Nothing complicated. But every instinct I had, and every tool I reached for, kept pushing me toward something much bigger than what I actually needed.
I asked an LLM (Claude Code) to help me get started. It came back with a Next.js project, Tailwind, a CMS, and a deployment pipeline. I just needed a page that said my name.
So I stopped and started over. Back to basics. HTML, a CSS file, and nothing else. Not as a statement. Just because that was enough.
The pull toward more
There's an inertia to building for the web. You reach for a framework before you've asked what the page needs to do. You add a build step because that's what serious projects have. You configure things that don't need configuring.
Those tools aren't bad. I use them at work and personal projects. They exist because they solve real problems. But a personal site that says who you are and links to your GitHub isn't a real problem. It's a few paragraphs and some links.
The friction I kept running into wasn't technical. It was social, or maybe mental. A framework signals sophistication. A build pipeline signals seriousness. I didn't want to signal anything. I just wanted to make the damn thing. My high school Computer class taught me HTML and some basic CSS. Turns out that was enough.
What the platform already gives you
I looked into the spec for the <a> element once,
just the humble link, the anchor tag. How href actually
works, how browsers resolve relative URLs, what happens with different
protocols. The href attribute alone has no maximum length
defined in the spec; it can point to mailto:,
tel:, javascript:, data URIs, and more. A
single attribute doing that much work. Deeper than you'd think for
something you click a dozen times a day without thinking about it.
This page has a couple of them.
That rabbit hole, plus working at Mozilla, changed how I think about
browsers and the internet. The web platform already does most of the
work. Semantic HTML already has opinions about how a page should be
structured. The browser already knows how to render a
<blockquote>, a <nav>, a
<footer>. I didn't need to override most of it. I
just needed to use it.
The choices
This site is HTML, CSS, and a little JavaScript. No framework, no build
step, no markdown pipeline. The CSS started from
new.css,
a classless stylesheet that styles semantic HTML elements directly,
with no class attributes required. I modified it from there:
changed the fonts, adjusted spacing, added a few things to match how I
wanted the site to feel. It was a good base because it already respected
the grain of HTML instead of fighting it.
So <blockquote> looks like a blockquote,
<code> looks like code. The HTML is the design.
<!-- this is roughly the entire homepage -->
<main>
<h1>Taimur Hasan</h1>
<p>software engineer</p>
<p>i like building things that are useful.</p>
</main>
I could have used Astro. I could have written a templating script. Every tool was available. But when I actually listed what the site needed to do, none of them were necessary. Reaching for them anyway would have been building for an audience instead of building the thing.
The one thing I did spend time on was the metadata: Open Graph tags,
structured data, proper semantic markup. Not because I was optimizing
for anything (okay, maybe a little, have you seen my
<head>?), but because that's just doing HTML
correctly. The page should describe itself well. That's part of the
craft, not a contradiction of it.
Using an LLM on my own terms
I used Claude Code throughout this build. But I used it on my own terms.
When I first asked it to help me set up a personal site, it sent back a Next.js 14 app router project, Tailwind CSS config, a headless CMS integration, and a GitHub Actions pipeline deploying to Vercel. Five config files before I'd written a single word about myself. I didn't know how to feel about that.
It was doing what it does: pattern matching on what most builds look like. But that wasn't what I was going for. Once I knew what I wanted, pulled from the parts of the web I care about, the tool became useful. Meta tags, CSS questions, scaffolding markup for new pages. That kind of help I was happy to take.
What the tool suggests and what you actually want are two different things, and it's easy to confuse them if you're not paying attention.
When you're early in your career, that's especially easy to lose sight of. You don't always know what you know yet, and the default answer looks authoritative. I wanted to understand what I was making. So I used it when it helped and ignored it when it didn't.
Dieter Rams
I came across Dieter Rams at some point, the Braun stuff from the fifties and sixties. Radios, calculators, shelving systems. Like the whole Apple design philosophy. What stuck with me wasn't the minimalism as aesthetic. It was that the objects weren't trying to impress anyone. They were just trying to work. His tenth principle:
Good design is as little as possible. Less, but better, because it concentrates on the essential aspects, and the products are not burdened with non-essentials. Back to purity, back to simplicity.
— Dieter Rams, Less but Better / Weniger, aber besser
I'm not claiming my personal site is great design. But that idea, that you can stop when the thing works, that "less" is a legitimate destination, not a waiting room before "more", felt right for what I was making. That said, I'll still have some fun with it.
The old web (1.0?)
The early web was full of personal sites that were just someone's thing. Made by hand, put on a server, imperfect and direct. That quality mostly disappeared when we started optimizing personal sites like products, Lighthouse scores and SEO audits for a page that just says who you are.
I'm not nostalgic for the aesthetics of that era. I'm nostalgic for the posture. Someone made a thing, put it online, and let it be that.
Just enough
I'm not against frameworks or build tools or optimization. I use all of those things. I just noticed that for this particular thing, a page about me, I didn't need any of it. And it felt good to not reach for it anyway. I chose not to.