robertobonfa.dev
The site you are looking at: a desktop simulated in the browser, with windows, a dock and icons, collecting the projects of the last few years.
Why
A portfolio is usually scrolled. This one is used. The idea was for the container to say as much as the content: whoever lands here understands within ten seconds that someone builds things, because the first thing they meet is a built thing.
The starting choice was giving up everything that is normally taken for granted. No framework, no build step, no dependency to keep updated: the files that get written are exactly the ones that go online. Three years from now this site will still open, and editing it will take nothing more than a text editor.
The most interesting constraint came from small screens. A desktop with draggable windows makes no sense on a phone, but writing the site twice makes no sense either: below a certain width the metaphor changes on its own, the desktop becomes a home screen with a grid of icons and windows open full screen. Same code, two behaviours.
How it is built
At its core is a window manager that knows nothing about content: it opens, closes, minimises, maximises, moves, resizes and keeps the stacking order. Every section of the site is a small application declaring its title, icon, preferred size and how to draw itself. Adding a project means adding one file, not touching the rest.
Every window has a shareable address, and opening it from scratch restores that view: this is why the iOS app's privacy policy has a direct link that works even without JavaScript, as the App Store review requires.
All the text lives in separate files, in Italian and English, loaded on demand and turned into pages by a purpose-built Markdown converter. The contact form talks to a Python service using nothing but the standard library, listening only on the local address, with defences against automated submissions and a rate limit.
The site is hosted at home, on a tiny Debian container served by nginx, and reaches the internet through a tunnel: no ports open on the router. The server's security rules allow only the two music player domains and nothing else. The wallpapers you can pick in the settings are not stock images: they are generated by another project in this same collection.
- JavaScript
- CSS
- Python
- nginx


