Devlog — building a cosy datacenter tycoon in the browser

Get in the game
Entry #11 · 26 September 2026

In your pocket, and always a next step

Two things this time: the game now plays properly on a phone, and every selected thing tells you what to do next.

The desktop game with a switch selected: a Next steps card shows 'Uplink to the firewall' ticked off and 'Cable 4 servers to a switch' as the current step, with a green 'Cable 4 to sw-01' button.
Select anything and a Next steps card lists what's left. The current step has a button that does it. Here, one click cables all four loose servers.

Next steps

Players liked the depth but kept losing the thread between steps: "I've racked a server… now what?" Now every rack, PDU, UPS, firewall, switch, server and the ISP demarc gets a short checklist at the top of its panel. Done steps are ticked, and the current one has a button. Most buttons just do the obvious thing:

  • ⚡ Run power from the PDU, or Power 3 racks, which feeds every unpowered rack the PDU has outlets for.
  • 🔌 Cable to sw-01, which finds a free switch port. On a switch, Cable 4 to sw-01 cables every loose server in one go.
  • ✨ Auto-address in Fun mode, or 💻 Open the console in Hacker mode, where you still have to type it.
  • Everything else is a jump: to the gear list, the heat map, the contracts panel or the Build catalog.

Every one-click action goes through undo like anything else. The tutorial also got a 👉 Show me button that opens the right tool or selects the right thing for the current step. The dock can now be collapsed with Hide or the ` key, and it stays that way next visit.

Phones

The game on a phone in portrait: a two-row stats bar at the top, the server room in the middle, and a bottom sheet for srv-06 showing its Next steps checklist above a scrolling dock.
Portrait: the inspector becomes a bottom sheet (tap the grip to make it taller), and the dock scrolls sideways.

The desktop build already worked in a phone browser, in the sense that it loaded. Now it's actually playable:

  • Touch controls. One finger pans, two fingers pinch-zoom and twist. Tap to select. Placing something works as tap a spot, then confirm: a bar appears with ⟳ Rotate, ✓ Place ($1,200) and ✕, and it tells you why when a spot doesn't work. Long-press cancels a tool.
  • Layout. In portrait the side panel is a bottom sheet and the stats bar wraps to two rows. In landscape the panel is a slim column on the right. Everything respects the notch and the home indicator.
  • Console. The terminal goes full screen, and a 📖 button slides out the command list, since there's no room to keep it docked.
  • Graphics. A Low / High / Auto setting in Help. Low means fewer shadows, less grass, fewer night lights and a capped pixel ratio. Auto picks Low on phones.
The game on a phone in landscape: stats split into left and right pills, the room on the left, and a Rack 7 panel on the right with Next steps showing 'Install gear' as current.
Landscape: the panel is a column on the right, and the full dock fits.

Install it, play it offline

The site is now a proper web app, so Add to Home Screen gives you an icon and a full-screen game with no browser bars. A service worker caches the game on first visit, so it opens and plays with no connection at all. Saves were always in the browser anyway. Each deploy gets a fresh cache: content-hashed files are served straight from the cache, and everything else asks the network first, so an update never mixes new code with an old stylesheet.

Two testing traps. Chrome's "Offline" switch in DevTools emulation didn't reach the service worker, so my first offline test would have passed even if caching were broken. The honest version was to stop the server and reload. And a bottom sheet that was both rounded and scrollable made the 3D view disappear behind it in the test browser, even though reading back the pixels proved the frame was drawn. I can't prove that happens on a real phone, but the fix was cheap: the rounded card now clips, and a plain box inside it does the scrolling.

↑ Contents

Entry #10 · 26 September 2026

Not everyone is who they say they are

HR arrived, and so did the people it exists to catch.

The Staff panel: HR and Security status chips, then the team sorted by suspicion, with Grace Liskov at the top and a red suspicion bar.
With a Security Analyst on staff, the team list sorts by suspicion. One name has a very red bar.

HR Manager

A new role in a pink hoodie. Having one on staff means more candidates each morning (six instead of four, slightly more skilled), a slow boost to morale, and a 📋 Check button on every candidate. For $150 the HR Manager sits at a desk for 45 minutes and comes back with ✓ Clear or a red flag: a falsified certification, an undisclosed firing, a fraud conviction. People with a red flag work 15% slower and are grumpier. You can still hire them.

Insiders

About one candidate in seventeen is quietly malicious, and a background check only sees through them about a third of the time. They never do anything suspicious in front of you. Now and then an insider picks up a job with a perfectly boring label ("Firmware update on fw-01", "Log rotation on srv-03", "Inventory count in receiving"), walks over, fiddles for a bit, and leaves. Afterwards, one of these has happened:

  • 🦶 A cable "comes loose". It looks like the ordinary trip-over incident.
  • 🕵️ A firewall rule nobody added. An allow-any rule plus a 1:1 NAT that exposes a server's every port, which the tracer then flags on any contract that says "SSH must not be public".
  • 📦 Stock vanishes from the receiving shelves.
  • 💾 Customer data walks out, which costs a breach notification and customer trust once it's found.

Security audits

An audit's findings pop up as alerts; Grace's worker panel shows a Security file with a red suspicion bar and two evidence lines about a data copy and a firewall change.
An audit turns up a data leak and an unauthorised firewall change, and both land in Grace's security file. The rogue rule gets a ⚠ in the firewall.

Every few hours each Security Analyst sits down to review the access and change logs. Hidden sabotage gets found (not always on the first pass), turns into an incident, and adds to the culprit's suspicion, with a little noise so the list isn't a giveaway. Each person's panel has a security file listing the evidence in plain sentences. Let go of an insider and you get a 🎯 and the full list of everything they did. Fire an innocent person the team suspected and everyone's mood takes a real hit.

Morale

Everyone now has a mood, shown as an emoji. It drifts back toward "fine" by default, goes up a little with coffee, the kitchen and an HR Manager, and goes down with overtime and firings. It scales work speed from 80% to 110%, and someone at rock bottom will eventually quit.

A testing trap worth sharing: my "run for two days" loop recomputed its target from the current day on every step, so the finish line kept moving and it ran about 50 days. For a moment it looked like the insider had done 41 things in two days. The per-hour rate was fine; the test wasn't.

↑ Contents

Entry #9 · 26 September 2026

Lights on, everyone home

The datacenter at 22:00: a dark navy sky, the island in shadow, streetlamps casting warm pools on the road, the server room lit cool white, the office warm, the staff gone home and two cats still up.
22:00. Streetlamps on, the server room glowing cool white, the office warm. The staff have gone home; the cats have not.

Day and night. The game clock now drives the sky: warm peach at dusk, deep navy by 20:30, stars overhead. The sun fades to a cool moonlight and the island falls into shadow. At dusk the building's lights click on with a little warm-up flicker: cool white over the racks and in receiving, warm in the office, sconces on the back wall, and a row of streetlamps down the road. The monitors, the NOC screen and every blinking LED suddenly matter visually.

Working hours. Staff now work 07:00–19:00. After that they finish whatever job is in their hands (overtime is fine), walk out the front door, and come back in the morning with a wave. Nothing new starts after hours: a cable someone trips over at 21:00 shows 🌙 after hours and gets fixed at 07:00. That changes the tension. A UPS battery or a spare-parts shelf matters a lot more when nobody's around at 2am.

🍎 Micro-kitchen, the second office upgrade ($4,000): a counter with a mint fridge, a microwave, a fruit bowl, snack jars and a shelf of colourful boxes. People take snack breaks (with a new nibbling animation), so work runs 8% slower, but they're happy to stay until 23:00. That's four more working hours a day, which easily pays for the snacks.

On the roadmap

A few ideas from the same conversation went into the plan as M6 — Security & compliance: a front desk with a receptionist or guard, badged doors that slow everyone down a little, badge logs that help catch insiders, and SOC 1 / SOC 2 / PCI certification. Each control gets checked against the live sim, auditors walk the floor, and certificates unlock the big contracts.

↑ Contents

Entry #8 · 26 September 2026

Coffee is earned

New offices get a water cooler and nothing else. The ☕ coffee machine is now the first office upgrade, in a new section at the end of the Build menu. It costs $1,500 and goes through the same pipeline as everything else. It's ordered, arrives on a RocketBox truck, waits in receiving, and then a Facilities Tech carries it to its spot by the cooler and plugs it in.

Once it's installed, every job goes 10% faster. The Build menu card follows it along: price → 🚚 on its way → ✓ installed. Upgrades live in the save file and work with undo like any other purchase. This is the hook for the rest of the office upgrades still to come: better chairs, a snack wall, a proper espresso machine.

↑ Contents

Entry #7 · 26 September 2026

An island in the sky

The whole datacenter on a white board sitting on a floating green grass island dotted with tufts of grass, trees and flowers, with a brown soil edge dropping into a sky-blue void.
The building's board now sits on a floating island of grass, and past the edge there's just sky.

The diorama used to sit on an endless flat blue plane. Now it's a proper island: a thick slab of turf with rounded edges and layers of soil (with the odd pebble) stepping in underneath, floating in the blue. About 900 little grass tufts stick up, each a cluster of four thin blades leaning different ways, all drawn in a single instanced draw call along with a sprinkle of tiny flowers. The trees moved onto the grass. You can zoom out a little further now to see the island float.

Also

  • RackShip is now RocketBox, rocket logo and all.
  • Bat the red ball on the cat tree and it swings on its string: a damped pendulum on two axes, about one swing a second, dying away over a few seconds. It has a generous invisible hit area, because a 3.5 cm ball is hard to click.
  • Clicks now ignore anything hidden. With the dog chosen, the cat tree is invisible, and its toy used to be clickable anyway.

↑ Contents

Entry #6 · 26 September 2026

Poke the scenery

The office water cooler with a pale-blue irregular puddle spreading on the wooden floor in front of its taps.
Click the water cooler and it glugs, splashes, and leaves a puddle that dries up after five seconds.

Toys don't need a reason. Two new ones:

  • The water cooler: droplets arc out of the tap, bubbles rise in the bottle, the cooler wobbles, and a puddle spreads across the floor. Every puddle has its own wobbly outline, and it's gone after exactly 5 seconds. That's timed on the wall clock, not frame time, so a slow machine doesn't make it hang around.
  • Plants and trees: the potted plants and the trees outside shake when you touch them and drop a few leaves that flutter down and fade.

The cursor turns into a pointer over anything pokeable. None of it touches the game state, so it never ends up in a save or the undo history.

↑ Contents

Entry #5 · 26 September 2026

The cats have entered the datacenter

This one was a feature request with no economic value at all, so it went straight to the top of the list. The title screen now asks the important question: 🐶 Office dog or 🐱 Maine Coon cats?

Two fluffy Maine Coon cats in the office: an orange-and-white one standing with a big striped tail, and a tan-and-white one sitting by the blue couch. A purple carpeted cat tree stands nearby.
Posed: the orange-and-white one and the tan-and-white one. Both have tufted ears, a white ruff, whiskers and slit pupils, plus a tail like a feather duster. Picking cats also adds a cat tree to the office.

They're built from the same rounded primitives as everyone else, with a few Maine Coon signatures: lynx tufts on the ears, a big white chest ruff, cheek fluff, white socks, tabby stripes along the back, and a six-segment tail that gets fluffier toward the tip. It swishes as they walk and curls round them when they sit or sleep.

They behave like cats, which is to say they mostly sleep. They nap in the bed, perch on top of the cat tree, follow whoever's working, and sometimes they go looking for the warmest spot in the building. In a datacenter, that's the hot aisle behind your busiest rack.

Looking down a hot aisle between two rows of navy racks with the cooling overlay on: an orange Maine Coon is curled up asleep on a glowing yellow warm patch, with a CRAC unit at the far end.
Not posed: the cat found the hot aisle behind the GPU rack all by itself (it reads the same heat grid the cooling sim uses) and went to sleep there.

Click one and you get a Meow!, a Mrrrp? or a sleepy Mrrrp… 💤, which also wakes it up. Your choice is remembered per browser and saved with the game. Old saves keep their dog.

↑ Contents

Entry #4 · 26 September 2026

"I don't know how to install a server"

This was the best kind of playtest feedback: blunt, and it points straight at the core loop. Both answers existed, but you had to know where to look:

  • Installing gear meant clicking one of 42 thin, dark, unlabelled bars in the rack's elevation view before any choices appeared.
  • The Hacker-mode CLI was a button at the bottom of a device panel, and it didn't tell you what to type.
Rack 4 selected; the side panel starts with an Install gear section listing six devices with stock or shipping info, above the elevation.
Every rack panel now opens with ➕ Install gear, one click per item. Picking a slot is optional, and empty slots say "+ U34" on hover.
The srv-04 console with systemctl output and a Commands cheat sheet on the right grouped into Look around, Address it, Services and Test.
The console has a clickable cheat sheet for each device type. A click pastes the command with the IP pre-selected, so you just type over it.

Also new:

  • 💻 Open console sits at the top of every device panel, and T opens it for whatever is selected.
  • A ❓ Help panel (press ?) covers installing, power, cabling and configuring, plus the full command reference for servers, switches, routers and firewalls.
A bug this turned up: closing the console left its hidden input focused, so every hotkey was silently ignored until you clicked something else. Of course the shortcuts "didn't work".

↑ Contents

Entry #3 · 26 September 2026

Trucks, boxes, and things that break

Two systems this time, and they lean on each other. Shipping & Receiving means nothing appears out of thin air any more. Incidents means the datacenter keeps you busy after everything goes green. Repairs need parts, and parts come on the truck.

Shipping & Receiving

A white-and-purple RocketBox delivery van with a rocket logo, backed up to the striped dock door of the receiving room, with a Delivery! bubble above it.
A RocketBox van reverses up to the dock and the driver drops the load on the pad. (The couriers were called RackShip for about an hour before a rebrand.)

Clicking "install a server" used to spawn a server. Now it places an order:

  1. A truck arrives after the lead time: 45 game-minutes in Fun, 3 hours in Hacker. Orders placed close together share a truck.
  2. Boxes land on the dock. The new Shipping Clerk carries each one in, gives it an asset tag (RPC-1000, RPC-1001…) and shelves it. Small gear goes on the racking; crates and 4U boxes go to floor staging.
  3. If the box was ordered for something, like a rack slot, a placed UPS or a repair, a job appears. Someone walks to the shelf, picks the box up, carries it across the building and installs it.
Three workers in receiving: a Shipping Clerk in a purple hoodie carrying a wooden crate, a Sysadmin carrying a cardboard server box, and a Facilities Tech waving.
Posed for the camera (in play they're usually walking away from you): the clerk with a UPS crate and a sysadmin with a 1U server box. The crew waves back.

Spares change the pace. Anything on the shelf is used first and costs nothing extra, so installs from stock start right away. The rack panel now shows 📦 in stock ×2 or ships ~45 min for each item. Cancel something still in transit and you get a full refund. If it has already arrived, it just goes back into stock.

Incidents

Power overlay during a utility outage: the UPS label reads 73% on battery, the CRAC shows no power, a red alert reads disk failed on srv-01, and the Incidents panel lists a tripped-over cable, a disk failure and the outage, with Dispatch buttons.
A bad morning in Hacker mode: the grid is down (UPS at 73% on battery), srv-01 lost a disk, and someone kicked the uplink cable. The CRAC went dark because it was wired straight to the utility, not the UPS. That's a lesson.
IncidentWhat breaksThe fix
🌩️ Utility outageGrid power, for 25–90 minUPSes ride through on a 6 kWh battery (about 40 min at 9 kW). Anything wired straight to the utility goes dark.
🧊 CRAC compressorThat cooler stops coolingA compressor part plus a Facilities Tech
💽 Disk failureA server stops servingA spare disk plus a Sysadmin
🦶 Tripped-over cableOne link goes down (and turns red)A Network Engineer re-seats it
📈 Customer goes viralThat contract needs +1 server for 12 hAssign more capacity; they pay 1.5× while you keep up

Nothing breaks until your first customer is green, so the tutorial stays calm. Fun mode orders parts and dispatches people automatically. Hacker mode leaves it to you: a Dispatch button, a parts bill, and a dock that might be three hours from a delivery. A 🚨 badge on the dock counts what's open.

Verified this session

  • Full chain, stepped through the real sim: place a rack and a UPS → one truck → both crates received and tagged → fetched → built. Then order a server → delivered → the sysadmin carries it → installed.
  • Stock path: a spare switch on the shelf is used immediately. Cancel path: a server ordered then removed before delivery refunds the full $4,200.
  • Each incident forced and resolved end to end: a disk swapped from a shelf spare, a compressor ordered and fitted, a cable re-seated, the outage survived on battery, and a viral surge flips the contract red until capacity is added.
  • Undo of an order returns the money and removes the order. Saves from before this update migrate the wider heat grid.
A bug the new room caused: the office water cooler and coffee machine sat right in front of the new doorway into receiving, so nobody could path to the crates. Build jobs just said "can't reach it". They've moved along the wall.

↑ Contents

Entry #2 · 26 September 2026

Save, load, undo — and a floor that finally lines up

This was the first round of playtest feedback. Two things came back: "I need to be able to save", and "I wish the units lined up with the floor panels". Both are fixed.

The half-tile bug

Racks, a CRAC and a green placement ghost, each sitting neatly inside one raised-floor tile.
After the fix: each rack, the CRAC and the placement ghost sit inside exactly one raised-floor tile.

The game grid and the floor texture were both one metre per cell, just offset from each other by half a metre. Cell (x, z) covers x … x+1, but the floor plane was centred on the room's middle cell, so it started at x = 0.5. Every tile seam ran straight through the middle of a game cell, and every rack looked like it was straddling two tiles. The fix was one line per floor: centre the plane on whole-cell bounds.

Moral: when two systems share a unit, check they also share an origin.

Save and load

The Save and load panel with Undo and Redo buttons, an autosave, a quick-save slot, three manual slots, and Export/Import buttons.
The 💾 panel: autosave, quick save (⌘/Ctrl+S), three slots, and export/import to a file. The title screen now has a Continue button too.

The simulation already kept everything in plain, serialisable objects, and that decision paid off here: a save is basically JSON.stringify(state). Three wrinkles:

  • The heat grid is a Float32Array, so it gets tagged and revived.
  • Contract traces are derived data (hop lists, link paths). They're dropped from the save and recomputed on load, which also keeps a mid-game save around 20 KB.
  • Walkability lives outside the state, in the pathfinding grid, so it gets rebuilt from the loaded entities. Skip that and workers happily walk through a rack that was just loaded in.

The game autosaves every 30 seconds of play and whenever you leave the page. Browser storage can be missing or full, so every access is guarded, and the fallback advice is "export a file".

Undo that can't lie

Undo is snapshot-based: every player action records the state from just before it. That covers building, cabling, firewall rules, console commands, hiring and contracts. Undo swaps that snapshot back in. The clock rewinds too, and the toast says by how much ("Undid: Console: rule del 1 · rewound 6 min").

The alternative was writing an inverse for every action: refund the rack, cancel its job, unblock its cell, drop its power cables, and so on. There are dozens of those, and every one is a chance to leave the sim half-reverted. A snapshot can't get that wrong. It costs two serialisations per click, a few milliseconds each. Read-only actions, like show rules in the console, don't create an undo step at all.

One open question: in Hacker mode, undo can rewind you out of a breach. That's fine for now, but it probably wants a "no take-backs" rule later.

Verified this session

  • Place two racks by clicking → undo twice → money and walkability restored → redo re-places one.
  • Console rule del 1 → ⌘Z restores the rule; show rules creates no undo step.
  • Save to a slot → sell a rack and zero the cash → load: money, racks, workers and heat all back, and both contracts re-evaluate to green.
  • The title screen shows Continue with the newest save; importing a file works, and a junk file is rejected with a clear message.

↑ Contents

Entry #1 · 26 September 2026

From an empty folder to a server room that actually routes packets

TL;DR
  • A playable slice: build racks, run power, cable the network, keep it cool, hire people, sign customers.
  • Every character and prop is procedural Three.js — no imported models yet.
  • The network is honest: contracts pass only when a packet really gets from the internet to the right port and back.
  • Two modes on one simulation: Fun (forms and wizards) and Hacker (a real-ish CLI).
Isometric view of a bright, playful server room with racks, a UPS, PDUs, a CRAC cooler, workers, and an office with desks, a couch and a dog bed.
The whole building: server room on the left, NOC and break room on the right. The walls get lower toward the camera so you can always see in.

The brief was simple and huge: a datacenter tycoon that feels like a toy but plays like a job. You build the server room, install racks, run power and cooling, cable routers, switches and firewalls into servers, then configure them properly. And it has to be fun.

This first session was about the core loop, with nothing faked. Everything below runs in the browser from a folder of ES modules. There's no build step.

The look: chunky, soft, a bit silly

The art target was the Wolt illustration style: big round heads, big noses, puffy hoodies, chunky white sneakers, and a sky-blue world. Every character is built in code from spheres, capsules and rounded boxes, with a small joint rig (hips, shoulders, elbows, neck). Faces get eyebrows, a smile, and optional glasses, moustaches, beards, caps, beanies, hard hats and headsets. Hoodie colour tells you the role.

Five cartoon workers in coloured hoodies: one waving in a hard hat, one with crossed arms and glasses, one in a cap with a headset, one cheering with a beard, and one typing.
The crew, each in a different pose: waving, crossed arms, idle, cheering, typing. They also blink, breathe, glance around, and wave at each other when they pass.

Animation blends toward pose targets instead of using keyframes, so switching from walking to waving to working never snaps. Colleagues who pass each other sometimes stop and wave. There's also an office dog. It wanders, follows people around, naps in its bed, and says "Woof!" if you click it. It does nothing for the economy. It stays.

One lesson from this session: ACES tone mapping washed the candy palette out to grey-blue. Switching to Three's NeutralToneMapping brought the colours back in one line.

Nothing happens without people

Clicking "build" doesn't build anything. It places an order and queues a job, and a worker with the right role walks over and does it. Facilities Techs build racks, run power and reset breakers. Sysadmins rack and provision servers. Network Engineers install network gear and run cable. If nobody has the right role, someone else pitches in at half speed. If nobody at all is free, the job waits, and its bubble says who you need to hire.

Under construction, things render as a translucent blue ghost with a progress bubble. When the job finishes, the worker does a little cheer.

Power: Utility → UPS → PDU → Rack

Power overlay showing orange floor cables from the utility feed to a UPS, PDUs, racks and the CRAC, with load labels such as 3.0 / 6 kW.
The power overlay. Cables run under the raised floor and each node shows its load against its rating. Colour moves from orange to amber to red as a circuit fills up.

The power tool is click-source, click-target. Loads add up from the bottom: a rack's load is the sum of its gear, a PDU's is the sum of its racks, and so on. Go over a rating and the breaker trips. Everything downstream goes dark, alerts fire, and a Facilities Tech has to walk over and reset it once you've shed the load. Each rack circuit is 6 kW, which a single 4U GPU server (2.4 kW) eats a big chunk of.

Cooling: the heat map

Cooling overlay with blue floor, racks with inlet temperatures around 18 to 19 degrees.
CRAC running: inlets at 18–19°C. Hot air collects in the aisle between the two rows.
Cooling overlay after the CRAC tripped: the floor glows orange and pink, inlet temperatures near 40 degrees.
Same room seven game-hours after the CRAC's breaker tripped. Inlets near 40°C, and Fun mode shuts servers down at 45°C.

Heat lives on a per-cell grid. Racks breathe in at the front and exhaust out the back, so rotation matters and hot-aisle/cold-aisle layouts pay off. CRACs pull heat within a radius toward an 18°C setpoint.

Tuning took three tries. First the CRAC chilled the whole room to its floor temperature and the map was a sea of blue. Then it was 77°C in the hot aisle. The fix was to cap how fast a CRAC can pull down any one cell, falling off with distance. Air handling is local, and once that was in the model, hot aisles showed up where they should.

The network, honestly

This is where the game stops being point-and-click. Each device has ports, and you patch port to port from the rack panel. Cables render as drooping patch loops inside a rack and as overhead tray runs between racks. Little packets zip along any path that's currently serving a customer.

Network overlay with blue and yellow cables over the racks, IP labels per rack, and a side panel showing Rack 1's 42U elevation with a firewall, switch and two servers.
Network overlay plus the rack elevation panel. Click an empty U to install gear, click a device to configure it. Labels show hostnames and IPs per rack.

Under that sits a small, real network model:

  • L2: switches with access and trunk ports and VLAN tags. Broadcast domains come from walking the cabling.
  • L3: interfaces and VLAN sub-interfaces (ge1.20), connected and static routes, longest-prefix match, ARP on the egress segment.
  • Firewall: DNAT port-forwards (with proxy-ARP for public IPs), ordered stateful rules with default deny, and inside→outside masquerade.
  • Return path: a trace has to make the round trip. "Server has no default gateway" is a failure you'll meet.

One tracer drives the Fun-mode "Trace it" button, the CLI's traceroute, and every contract check. When a trace fails, it names the hop that failed and why.

Device panel for srv-02 showing a trace where HTTPS reaches srv-01 instead, with a hint to publish the service.
srv-02 runs HTTPS, but the only public forward points at srv-01. The tracer says exactly that.
The same panel after pressing Publish: the trace goes NAT, firewall rule, srv-02 answers.
One click on 🌍 Publish adds a NAT forward and an allow rule. The round trip goes green.

Hacker mode: do it the real way

Fun and Hacker share one simulation. In Hacker mode the forms become read-only and you configure devices from a console: Linux commands on servers, Cisco-ish commands on switches and routers, and a small purpose-built shell on the firewall. Servers arrive with no OS, so a Sysadmin has to provision them first. Thermals are stricter, SLAs cost money when you miss them, and exposed services can get breached.

A terminal window over the game showing systemctl status, a failed traceroute due to no default gateway, then a successful one after adding a route.
Delete the default route and the traceroute fails with a hint. Add it back and the packet goes out through the firewall's masquerade.
fw-01# nat add 203.0.113.9 -> 10.0.10.13
warning: 1:1 NAT forwards EVERY port (ssh included). Firewall rules still apply.
fw-01# rule add allow tcp from outside to inside port 22 dst 10.0.10.13
added rule #4

Do that and any contract with "SSH must NOT be reachable from the internet" goes red. In Hacker mode, attackers will eventually find it. Security Analysts lower the odds.

Staff and customers

Staff panel with rendered portraits of the team, a job queue, and candidates with Hire buttons.
Staff. Portraits are rendered from each person's actual 3D model. New candidates show up every morning.
Contracts panel with two green contracts, requirement checklists, assigned-server chips and a new offer.
Contracts. Assign servers and every requirement is checked by a live trace.

Customers pay per day while every requirement is green. Requirement types so far: a public service is reachable, N healthy servers, an internal flow (web → db:5432), and a service that must not be public. There's a hidden stat for later, too: each candidate already carries a background-check result, and a small chance of being a malicious insider. The HR department will make use of that.

Under the hood

PieceWhat it is
RuntimeNative ES modules plus an import map. Three.js r170 is vendored, and a 20-line Go file server does the serving. No bundler.
Simulationsrc/game/: plain serialisable state, a fixed one-minute tick for power, heat, jobs and contracts, and the tracer.
Renderingsrc/render/: procedural avatars and props, a state→scene sync keyed on signatures, overlays, HTML labels.
UIsrc/ui/: HUD, rack elevation, device config (forms or console), staff, contracts, objectives.
SizeAbout 5,500 lines, written in one session.
ScreenshotsEvery image here comes from the seeded ?scenario=demo state (fixed RNG seed), driven by script. They're reproducible, not hand-arranged.

What's next

StatusItem
doneServer room slice: build, power, cool, cable, configure, hire, sign contracts. Fun and Hacker modes.
nextSave/load, undo, moving things, a live 3D scene behind the title screen, sound.
nextA/B redundant power, UPS runtime during utility outages, VLAN-heavy contracts that need a router.
soonShipping & receiving: hardware arrives by truck, gets unboxed and asset-tagged.
soonHR: background checks that sometimes fail, and insiders you don't know about until Security catches them.
laterFinance (bills, depreciation, contracts), a sales office with a leads pipeline, more rooms.

The full plan lives in docs/PLAN.md.

↑ Contents