I built an operating system so developers would feel at home
Most portfolios ask you to read. Scroll, read, scroll, read, maybe click a link to a repository you will not open. The visitor is a spectator.
But the people looking at my site are mostly developers, and developers do not
read software. They poke at it. They open devtools. They try to break the
form. They type whoami into anything that looks like a prompt ๐.
So the site has a second mode. Press the desktop icon and you get a windowed
operating system: draggable windows, a taskbar, a start menu, a lock screen, a
terminal that answers neofetch, and an API client for browsing my CV as JSON.
The argument for it
A portfolio has one job: convince another engineer you can build things. There are two ways to do that.
- Describe the things you have built.
- Be a thing you have built.
The second is harder to fake. Anyone can write "strong attention to detail" in a bullet point. It is more difficult to write a window manager where the focus order is correct, minimise animates back to the right taskbar button, and the whole thing survives a resize.
The site is not a description of the work. It is a sample of it.
Familiar furniture, on purpose
Nothing in the desktop is a new idea, and that is deliberate. Every element is something a developer already has muscle memory for:
| The thing | Why it is there |
|---|---|
| Terminal | ls, cd, cat, history, tab completion, arrow-key recall |
| API client | my CV as GET endpoints, because that is how you would want it |
| Window manager | drag, focus, minimise, restore, z-order |
| Lock screen | it makes entering a name feel like signing in, not filling a form |
| Start menu | where everything is, exactly where you expect it |
Nobody needs a tutorial. You already know that the thing in the corner opens
the menu, that windows drag by the title bar, and that the terminal probably
answers help. Familiarity is the whole feature.
The terminal is the front door
~/projects, ~/skills, ~/experience. It is a real path tree with cd and
cat, tab completion and command history. neofetch prints ASCII art, because
of course it does.
The bet is that a developer who types help and gets a real response will keep
typing, and somebody who has explored my experience through cat remembers it
better than somebody who scrolled past it ๐ค.
The API client, because a CV is just data
The other window is a Postman-shaped thing. My career as endpoints:
GET /api/experience?sort=company_asc
GET /api/skills
GET /api/projects
Query params, a response pane, real JSON. If you are the kind of person who would rather read a payload than a paragraph, the site meets you there. It is also an honest reflection of how the data is actually shaped underneath.
Where it got interesting
A whole OS is heavy
Windows, terminal, API client, games, a PDF library for the CV, syntax highlighting. Bundled together, the main JavaScript file reached 542KB gzipped, and every visitor paid for it before the landing page could render. Largest Contentful Paint sat at 3.4 seconds ๐.
Almost none of that code runs for someone who never opens desktop mode.
const Desktop = lazy(() => import('./components/Desktop'));
One line. The main bundle dropped to 63KB, and the desktop's 410KB now loads only when you actually ask for it. The lesson is not "code splitting exists", it is that I had let an optional feature become a mandatory download.
The lock screen was a dead end
The desktop opens on a lock screen: clock, date, enter your name to sign in. It sets the tone nicely.
It also had no way out ๐ . If you did not want to sign in, the only exit was editing the URL by hand. I had built a front door with no handle on the inside. It now has a home button in the corner, which is the sort of thing you only notice when you watch somebody else use the site.
Two modes, one theme
Both modes read the same portfolio-theme key from local storage. Switch to
light on the landing page, open the desktop, and it is already light. Small
detail, but the alternative feels like two different websites wearing a shared
logo.
Was it worth it
By any reasonable measure, no. It is thousands of lines for something most visitors will never open, and it took far longer than a list of jobs would have.
But the people I want to work with are exactly the ones who will open it, type
help, and go looking for the edges. For them the site stops being a document
and becomes a small thing to play with, which is a much better first impression
than a bullet point about attention to detail ๐.
If you want a portfolio developers remember, do not describe the work. Hand them something to click.