This is roughly the third time I have built a personal website, and this time I set myself one rule: keep it simple enough that maintaining it never becomes the project. The site exists to show small things I build — mostly browser games written in TypeScript — in a way that lets anyone try them with a single click.

Framework
Built on what I know
I chose the tools I use every day at work: Laravel on the server and Laravel Nova as the admin panel. I have a general aversion to big frameworks and packages, but I have to admit that without them this would have taken months instead of evenings — and building the website was never meant to be the main goal.
The first version was plain Blade templates over a bare-bones database. Once the structure stood, I asked ChatGPT 3.5 to style it like a dark-themed programming blog. AI has stayed part of the toolbox since then, for texts, images and code alike.
Projects and pages
The site has two kinds of content:
- Projects describe a piece of code and, wherever possible, let you run it right in the browser.
- Pages like this one are where I write about ideas, plans and the things I learned along the way.
Under the hood both are almost the same; a project additionally owns its code releases. Each kind has an archive that lists everything published so far.

Code Release
Code releases
This is the part that matters most to me. A code release is a zip file uploaded to a project in the admin panel. It contains an index.html plus everything it needs, and the site serves it so the project runs in your browser.
The only catch is paths: the bundle must load its assets relative to its own URL, not from the site root. With Parcel that means building with --public-url:
npx parcel build ./src/index.html --out-dir ./dist --public-url .
Vite does the same with base: './', and it has since replaced Parcel in most of my newer projects.

The Future
Where it went from here
The site kept growing in small steps rather than big rewrites:
- The homepage is now a small desktop in the browser, assembled from self-contained TCE elements — little apps and toys that can also be embedded on their own.
- Pages are written in markdown instead of a rich-text editor, which keeps them portable and easy to edit from anywhere.
- An MCP server lets me manage pages and media straight from an AI assistant.
- Technical documentation lives under /docs.
The plan from the beginning still holds: spend the time on content and projects, not on the website itself.
Comments