THE IDEA
A site that works like the things I build
The easy path was a template. Grab a theme, drop in my projects, ship a demo over a weekend β that is what most portfolios are. But a site that says I care about quality, built on someone else's quick demo, proves nothing. So I gave myself a harder rule: the site has to be the proof, not just claim it.
I treated my own portfolio like a real product, not a quick demo.
I held it to the same bar I hold client work to: real care for speed, small details, and clean code. Every choice β from the layout to the last byte β had to earn its place.
THE PROCESS
Taste is the part you cannot outsource
Agents write code now, and good libraries hand me components for free. Neither of them knows what good looks like, or when a thing is ready to ship. That judgment is mine β and it is the part of this job that matters most.
So I treat AI like a fast, tireless team, and I stay the one in charge. I work Spec-Driven, in three steps:
- I set the standard β I write a clear, exact spec of what good means here, down to the detail.
- Agents build to it β they turn that spec into code, fast.
- I hold the line β I review, test, and push back until the result meets my taste, not only the spec.
I lean on proven parts instead of reinventing them β shadcn/ui and Radix for components, Tailwind for styling. Choosing the right ones, wiring them together, and making them feel like one site is the real skill. The pieces are off the shelf; the judgment is not.
HOW IT'S BUILT
The tools behind the site
The site runs on Next.js with React and TypeScript, and Tailwind CSS for the styles. Every page is built ahead of time, so it loads fast and search engines and AI assistants can read it without running any code.
| Tool | Role |
|---|---|
| Next.js | App framework, static-first rendering |
| React + TypeScript | UI, with types end to end |
| Tailwind CSS | Styling from design tokens |
| shadcn/ui + Radix | Accessible component primitives |
One source of truth
All the text and data live in one file β lib/data.ts. The same source feeds the whole site, including a rΓ©sumΓ© page that is ready to print. I change it in one place, and it updates everywhere.
THE LOOK
Liquid glass, with my own electric colors
The look is inspired by Liquid Glass, the design Apple introduced with the iPhone 17, its newest phone at the time. Many people did not like it β I did. I did not copy it; I took the idea of soft, see-through glass and gave it my own electric colors, the tones I like most, so the site feels alive.
The glass comes from one shared building block that I reuse on every card and panel, with design tokens for the colors and spacing, so everything matches and is easy to change later.
QUALITY
Quality is checked, not just promised
A standard only means something if something enforces it. So I did not just hope the site was fast β I measured it. Every change runs automatic checks before it goes live:
- Lint & format β a consistent code style on every commit.
- Types β a full
tsctype-check, noanyslipping through. - Build & tests β a production build plus the page test suite.
- Lighthouse β accessibility and SEO, and the build fails if the score drops below 95.
Then I optimized the details most sites ignore: images are compressed (the hero went from 19 MB to about 446 KB), security headers keep safe defaults, and the page opens almost instantly with no jumpy layout.
WHAT I LEARNED
What it cost, and what surprised me
- It cost real time. A template ships in a weekend; this did not. For a personal site with no client waiting, I had to keep asking whether the extra polish was worth it. I believe it was β but it is a fair question.
- The agents were never the bottleneck β my judgment was. They built fast. The slow part was deciding what good meant, then reviewing and pushing back until it was right. The work moved from typing to taste, which is exactly where I want it.
- Knowing when to stop was the hardest part. A site about caring for quality can quietly turn into polishing forever. Shipping meant deciding that good enough really was good enough β and letting go.
And it did the job I built it for. Clients on Upwork reached out β and what they singled out was the quality, the care in the details. The site was the proof, so I did not have to claim it.