A macOS desktop, simulated in the browser. Window manager, dock, topbar, lock screen, the whole glass-UI look — built with React, running on whatever you throw it at through a browser tab.
Live version: darwinx.vercel.app
It's not a file manager or a calculator app with a macOS skin slapped on — the part that's actually built is the desktop environment itself: a window manager that handles dragging, focus, opening and closing windows from the dock or topbar, minimize/maximize animations, a dock that responds to all of that, a topbar that tracks whichever app's focused and keeps a real clock running, a lock screen, a boot splash, and the glass-blur look tying it together. There's also an "About This Mac" popup and a terminal with a handful of working commands.
On top of that sits an app launcher, and that's where things get honest in a hurry — see below.
npm install
npm run dev
Opens on localhost:5173.
The launcher has ten entries. Some of them are real. Some of them are a name and an empty window.
| App | Status |
|---|---|
| Calculator | Done. Fully working. |
| Finder | Stub. |
| Tips | Done. |
| Music | Partial. The Songs tab works. Albums, Artists, Home, and Playlists are placeholder screens right now, and the API key it needs was never wired up — so even Songs won't pull anything real without one. |
| Terminal | Basic commands work. No file create/delete yet. |
| Chess | Done. |
| Safari | Done. |
| Visual Studio Code | Deprecated. |
| Windows | Stub. |
The desktop shell — window manager, dock, topbar, the animations, the glass look — is genuinely finished and works well. The problem is everything I bolted onto it afterward. Every time I had an idea for another "app" to live inside it, I scaffolded a folder and stubbed it into the launcher, and most of those stubs never got past that point. The list of apps to build kept growing faster than apps got finished, and at some point that list stops being a roadmap and starts being the reason the project doesn't end.
Still on the list, never started: an "About Package" popup for showing file info, and real file create/delete in the terminal.
React 19, Vite, and Supabase for the backend. UI bits from Radix and Headless UI, drag/sort from Sortablejs, the terminal from react-terminal, chess from react-chess-tools.
If you want to pick any of this up — finish an app, fix the stubs, whatever — fork it. The shell's solid enough to build on.