
← docs/ | cat portfolio.md
This is the site you’re reading, and it doubles as a bit of a playground. I built it by hand. I spend most of my day in the terminal and in Claude Code, so I wanted the whole thing to feel like that: a CLI you can read. Every page is a command ($ cat about.md, $ ls projects/), everything is monospace, one green accent, no chrome, no clutter.
The pixel art is drawn in code
The banners aren’t images. There’s no sprite sheet and no assets folder. Each scene is a small pixel-art engine I wrote that paints everything pixel by pixel onto a canvas: a Berlin sunset over the Spree on the homepage, a little version of me waving on the about page, an Everest sunset seen through a cabin window on the blog, and a git push lighting up storefronts across a twilight street on the CV.
The trick is simple. The static parts of a scene get drawn once into an offscreen buffer, then a per-frame loop animates only what moves: the plane towing the banner, the reflection on the water, the deploy pulse, the blinking city lights. Everything runs on a 2px grid so it stays crisp and deliberately low-res. It only animates while it’s on screen, and it holds still for anyone who prefers reduced motion.
Hosted on my own server, no tracking
It lives in the EU, on my own Linux server at Hetzner, part of the same infrastructure I run everything else on. No third-party platform underneath it, no vendor I don’t control. And no tracking of any kind: no cookies, no analytics, no pixels, nothing phoning home. The only JavaScript that ships is the code that draws the pixel art.
Stack
- Astro for the static build and markdown content
- A hand-written canvas engine for the pixel art (no libraries, no image assets)
- Custom CSS, JetBrains Mono, a single green accent
- RSS + sitemap for the blog
- Self-hosted on a Linux server at Hetzner, in the EU