Inspiration
"996" culture (9am to 9pm, six days a week) gets talked about like a productivity strategy. We wanted to turn it into a game, so the player feels the grind instead of reading about it. Windows XP was the natural setting: it's the visual language of every cubicle we remember, and we're all nostalgic for it. The jargon was the funniest part to write. "Let's circle back and align on deliverables" works fine as a threat.
What it does
You're a new hire at a company with three bosses: a Manager, a Senior Manager and a Vice President. We shot the boss characters ourselves, using photos of our own team.
- Do small office tasks (sort files, edit a spreadsheet cell, retype a memo) to earn XP. Each task also drains your energy.
- Recover energy by doomscrolling short videos in the "Break Room."
- Don't get caught. While you scroll, your boss ambushes you with time-sensitive events:
- a chat message loaded with corporate jargon (Boss 1+)
- a video call you must answer (Boss 2+)
- the boss's reflection slowly fading in on your monitor as he sneaks up behind you (Boss 3)
- Fill the XP bar, watch it shake cartoonishly, then slap your boss in a cutscene and get promoted to the next, worse boss.
- Run out of energy and your vision blurs, your eyelids droop, the screen goes black, and your boss screams you awake. You're fired.
- Beat the VP and you become CEO.
Each boss adds one new kind of event, so the difficulty comes from pressure, not harder chores. THERE ALSO CUTSCENES FOR DIFFERENT ENDINGS, PLEASE CHECK IT OUT.
How we built it
- TanStack Start + React 19 + TypeScript on Vite, with Tailwind CSS 4 and Radix/shadcn primitives for the UI.
- Zustand holds one authoritative game state (phase, XP, energy, active boss, current mission, active event). That makes windows resumable: you can minimize a task, scroll for energy, and come back to exactly where you left off.
- A hand-built Windows XP shell in React and CSS: windows, taskbar, system tray, dialogs and the Luna-style segmented progress bars.
- Three small task apps we wrote from scratch, since XP doesn't ship with office apps: a file sorter, a spreadsheet and a notepad.
- Event scheduler: events fire on timers that only count while the player is scrolling, and reaction windows get shorter with each boss.
- Sleepiness effects: a CSS overlay driven by the energy value, combining a pulsing
backdrop-filterblur, wobbling gradient "eyelids" and muffled audio. It usespointer-events: none, so you can still play while you're nearly asleep. - The reflection: a cutout of the boss blended onto the screen with
mix-blend-mode, ramping up in opacity, scale and sharpness over a few seconds. - Testing: game logic (XP, energy, timers) is covered with Vitest.
Energy over time looks roughly like this (numbers are tunable in one balance file):
$$E_{t+1} = \operatorname{clamp}_{[0,100]}\big(E_t - d\,\Delta t - c\cdot\text{tasks} + r\cdot s_t\,\Delta t\big)$$
where d is the passive drain, c is the cost per task, r is the recovery rate and $$s_t \in {0,1}$$ is 1 while the player is scrolling.
Challenges we ran into
- The original XP library didn't fit. The popular winXP React project targets React 16, which clashed with React 19 and server rendering. We rebuilt the shell ourselves instead of fighting the dependencies.
- Making rest feel risky. Early versions let you scroll safely forever. Tying every event timer to continuous scrolling time made the energy loop tense.
- Making the reflection look like a reflection and not a PNG fading in. Blend modes, blur and a glare gradient did most of the work.
- Keeping state consistent across windows, overlays, events and cutscenes. Putting everything in one store was the fix.
- Content on a deadline. Cutscenes, boss photos and short videos are all assets we had to make or generate in a weekend.
Accomplishments that we're proud of
- A full run from login screen to CEO that fits in a few minutes.
- Bosses played by our own team.
- The satire. The corporate-jargon messages are the funniest thing in the game.
What we learned
- Pressure comes from tying two systems together (the thing that heals you is the thing that exposes you).
- A single source of truth for game state makes everything else easier to debug.
- Small touches (a sound, a shake, a blur) carry more of the feeling than extra features do.
What's next
More bosses and tasks, a leaderboard for fastest promotion, and a "996 mode" where the energy drain never lets up.
Built With
- css
- eslint
- lucide
- nitro
- pnpm
- prettier
- radix-ui
- react
- react-hook-form
- shadcn-ui
- tailwindcss
- tanstack-query
- tanstack-router
- tanstack-start
- typescript
- vite
- vitest
- zod
- zustand
Log in or sign up for Devpost to join the conversation.