โ† All writing

I built an operating system so developers would feel at home

9 May 2026 ยท 4 min read

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.

  1. Describe the things you have built.
  2. 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:

code
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.

js
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.

reactuiportfolio