Rebuilding this portfolio from scratch in the age of AI
My portfolio was handcrafted in 2019 with Jekyll and Bootstrap 4, and it aged. In 2026 I rebuilt it on Astro. Just like at my day job these days, I didn’t type a single line of code.
Before / after: home, projects, a project page and a post, each wiping from 2019 to 2026.How
I used Claude Code with get-shit-done, a framework that drives the work in phases: discuss the goal, research, plan, execute, verify. Kinda V-model lifestyle.
With Opus 4.8, that structure is what kept a months-long migration on track: 6 phases, 30-odd plans, 50 requirements, all met, and 571 commits between April and October (I was busy elsewhere).
By the end of the adventure the method was already obsolete: Opus 5.5 holds large, long-running goals on its own. Not to mention get-shit-done pulling an exit scam in the middle of my migration.
It proposes, I pick
The handiest part. Instead of asking for a design, I asked for fifteen: the LLM built them side by side behind a little picker, and I cycled through with the arrow keys. Then I asked for fifteen variations of my favorites, and so on, until the final pick.
Reviewing the LLM’s first proposals for the blog list, one arrow key at a time.Before / after, optimization <3

What did it:
- No JavaScript by default. The old site loaded 964 KB of scripts on every page, 777 KB of it MathJax for one post’s equations. Now one 6 KB script; KaTeX renders math at build time.
- Images resized for the screen. WebP in several widths, and the browser picks one. Photos went from originals of up to 31 MB to 256 KB at most.
- Lazy loading. Off-screen images wait until you scroll near them.
- CSS written for the site. 13 KB, instead of Bootstrap (142 KB) and Font Awesome’s icon fonts (about 160 KB).
- Videos instead of GIFs. 12 GIFs and 4 videos (220 MB) re-encoded as MP4: 49 MB for all the site’s videos today.
- Only what’s used ships. The build drops any file no page uses. Jekyll even shipped 7 MB of Krita and Photoshop files.
- gzip, HTTP/2 and a 1-year cache. Compressed text, one connection, and a second visit downloads next to nothing.
Visual gating
You ship fast, but are you sure of the impact?
- 145 screenshots, 5 devices. Playwright compares every page on desktop, tablet, Android and two iPhones against references I approved.
- No way around it. The deploy scripts run the gate first.

Where this is going
Well, I’m left with the good part: writing content. And the place and the tooling have never been better for it.