Skip to content
Back to all cases

AI CASE

This portfolio

The site you are reading is the case itself. Design and code come out of Claude Code and Lovable, the logo was generated rather than drawn, and work only reaches production after review. Not a presentation about the approach, but the approach itself.

PERIOD
2026 - heden
USED
ClaudeVS CodeCanva

The problem

A portfolio that says I build with AI proves nothing. Anyone can write that. The only thing separating someone who does it from someone who talks about it is whether the thing you are looking at was made that way, and whether you can recount where it went wrong.

The approach

Design and code come out of Claude Code and Lovable. The logo was not redrawn by hand but generated: every proportion, from the slant of the letters to the width of the stem, is a parameter in a script. Change a parameter, run it again, and the favicon and the social preview follow automatically.

The site makes zero requests to external hosts. Fonts, icons and logos are local, and the visitor statistics are cookieless and load from our own domain. That is not purity for its own sake: it is the reason no cookie banner is needed.

All work happens in a staging environment and only reaches production after review. AI-driven building without a check produces exactly the faults you do not see in a demo.

The result

Two languages, no external requests, and recently the content has been separated from the code: all text sits in a separate file that is checked against a model during the build. If the content is wrong there is no build, and therefore no deploy. That is the groundwork for an admin screen of my own, so I can update the site without it being a code change.

What went wrong

The best mistake is the most recent one, and it is exactly the point of this case.

While separating the content I put the validation in the place where the page reads its text. Neatly reasoned, and wrong: that code also runs in the browser, so the entire validation library travelled along to every visitor. 58 kilobytes to check data that had long since been approved, on a site whose whole premise is that it loads not one byte too many.

The lesson is not in the mistake but in how it surfaced. Not by thinking about it, but by looking at what was actually in the output after the build.

Which is exactly why I found the same mistake again a day later, in a different shape. These case pages are new, and to fill the list on the front page I loaded every case. So the full text of every case, in both languages, sat in the file you download when you only open the front page: 68 kilobytes, of which 89 percent never reaches the screen there. With the eight cases still to come that would have grown by around 39 kilobytes. The front page now fetches only the titles and the summaries, and a case's text arrives when you open it.

The first time was a slip. The second time, within a week, is a pattern: my default is to send too much along because it looks tidier in the code. That is the same lesson as the conversion optimization I come from, and the reason I have now written it down twice. Measure before you claim anything, including when you built it yourself.

Other cases