01 Play Now
Warehouse IT is a browser game. It started as a terminal roguelike, but the web client is where it lives now — and where all development effort goes. No downloads, no setup, no excuses.
Chrome or Firefox recommended. No account needed — just pick a name.
Why the shift?
What You Get
The full Warehouse IT experience, rendered on an HTML5 Canvas with visuals that go well beyond what you'd expect from a browser game:
- Full game — warehouse, jungle, offices, tunnels, bosses, tickets, loot
- Smooth movement — free pixel movement with wall-sliding
- Mouse aiming — left/right click for gadgets, free aim
- Drag & drop inventory — paperdoll equip, dual-window trading
- Ticket system — GPS breadcrumbs guide you across zones
- Chat & party — in-browser chat, party system, multiplayer
- 3D cube walls — extruded walls with depth sorting and transparency
- Pixel art sprites — 40+ enemy types, bosses, NPCs, items
- Particle VFX — real fire, lightning, frost, plasma, acid
- Dynamic lighting — per-tile light map with gadget glow
- 52-track soundtrack — per-biome music with crossfades
- Mobile touch controls — dual joysticks, works on phones
VFX Showcase
The web client takes advantage of canvas rendering to deliver visual effects that make you forget you're playing in a browser:
Particle-based flames with heat gradients, ember trails, and smoke wisps. Flamethrower cone spread rendered with hundreds of particles.
Recursive midpoint-displacement arcs with branching, glowing core, and outer halo effects for Arc Welder and EMP blasts.
Blue-to-white frost fill with ice crystal particles. Diamond-shaped shards that shimmer and fade.
Dark vortex centers with swirling purple rings and inward-pulling particle streams.
Glowing projectile trails, splash effects, and corroding particle clouds with additive blending.
Pseudo-3D orbital energy rings around your character when firing gadgets. 9 unique styles that layer when dual-wielding.
The web client renders everything on your computer using your GPU. The server only sends lightweight game state as JSON. This means we can support far more simultaneous players than the old terminal architecture ever could.
AI Testing Bots
We've programmed AI bots to do automated test runs across the entire game — exploring tunnels, fighting enemies, buying gear, testing drops. This helps us dial in economy balance, drop rates, and overall game feel while accelerating rapid development. When you see suspiciously perfect play patterns on the scoreboard, that's probably a bot.
02 What's Different
Under the hood it's a single-process Node.js server with the same world, mechanics, and save files for everyone. The web client is the face on top of that engine.
Enhanced Visuals
The web client has evolved well beyond colored ASCII. Full pixel art sprites, 3D extruded walls, a particle VFX engine, and drawn tile rendering make this look less like a terminal game and more like something that escaped from a server room with ambitions.
| Pixel Art Sprites | Full spritesheets for player, 40+ enemy types, NPCs, bosses, items, and projectiles — no more ASCII entities |
| 3D Cube Walls | Extruded cube-style walls with south face, north face, corner pieces, and transparent top faces for depth |
| Canvas Drawn Tiles | All biome walls and floors rendered with fillRect using per-biome color palettes — no fillText |
| Square Tiles | 10×10 square tile grid (upgraded from the original 10×20 rectangles) for proper proportions |
| Raytraced Light Bounce | Light hitting wall faces bounces onto adjacent floor tiles as colored glow puddles |
| Particle VFX | Real fire with embers, recursive lightning, frost crystals, plasma trails, gravity vortex |
| Dynamic Lighting | Light sources cast glow that blends with biome color grading |
| Smooth Movement | Client-authoritative free pixel movement at 25 tiles/sec — no tile-snapping, full wall-slide collision |
| Persistent Fog of War | Four-zone visibility with LOS blocking, smooth color blending, and persistent discovery |
| 3D Gadget Auras | Pseudo-3D orbital rings around the player when firing gadgets — 9 unique styles |
| Death Cinematics | Visual death sequence with particle effects |
| Boss Telegraphs | Ground cracks and screen shake for incoming boss attacks |
Mouse Aiming
Left click fires Gadget 1, right click fires Gadget 2. Aim with your mouse cursor for directional gadgets. Keyboard controls still work exactly the same.
Settings Panel
The web client has a settings panel where you can tune visual quality to match your hardware:
| VFX Quality | Overall particle quality and count (Low / Medium / High / Ultra) |
| Particles | Toggle particle effects on/off |
| Screen Effects | Post-processing and color grading |
| Screen Shake | Camera shake on impacts and explosions |
| Dynamic Lighting | Real-time light sources and glow |
| Damage Numbers | Floating damage values on hits |
| GPU Particles | Hardware-accelerated particle rendering |
| 3D Walls | Extruded 3D wall rendering with perspective (enabled by default) |
| Light Bounce (RT) | Raytraced light bouncing off 3D walls onto floors |
| Particle Bounce | Particles reflect off walls with sparks instead of dying |
| Bloom | Glow bleed from bright light sources |
| CRT Filter | Retro scanline overlay for terminal nostalgia |
| Shadows | Wall shadow casting |
| Color Grading | Per-biome color tinting and atmosphere |
| Parallax | Multi-layer parallax depth effect |
| Sound | Toggle all audio on/off (quick button in top-right HUD) |
| Music | Toggle MP3 soundtrack on/off (separate button in top-right HUD) |
| Music Volume | Independent volume slider for soundtrack |
| Mono Mode | Downmix stereo to mono (both speakers play the same audio) |
03 Pixel Art Sprites
Every entity in the game has been upgraded from ASCII characters to full pixel art spritesheets. Your @ is now an actual character. That M that used to kill you is now a visually distinct monster that kills you with much more flair.
Player Sprite
896×512 spritesheet with 8-direction walk, attack, and hit animations. The sprite faces the direction you're moving using your actual velocity, not just the last key pressed. Walk animates at 125ms/frame, sprint at 75ms/frame. Split HP/stamina arcs render around the sprite — 100° left for HP, 100° right for stamina.
Enemy & Boss Sprites
21 unique spritesheets cover all 40+ enemy types through color-tint variants. Every warehouse enemy, tunnel creature, biome-specific monster, and boss has a distinct visual identity. Bosses render at 1.5x scale so you can see your impending doom from further away. Enemies smoothly interpolate between tiles at 4 tiles/sec instead of teleporting from cell to cell.
NPC & Vendor Sprites
Vendor NPCs have 8-directional breathing-idle sprites and will turn to face you when you open their shop. After 20 seconds of being ignored, they turn back south — probably to judge the next customer. The prestige vendor has a purple radial glow. Regular vendors get white.
Item Icons & Projectiles
| 128 Item Icons | AI-generated pixel art icons for every item in the game — visible in inventory grid and as ground drops |
| 5 Projectile Types | Spam, Corrupt, BSOD, and Malware as static PNG sprites rotated by flight direction — Firewall as procedural animated fire |
| 33 Environment Sprites | Mushrooms, crystals, trees, tentacles, server racks, tesla coils, and more — all drawn on canvas via drawFn |
Depth & Anchoring
All sprites use a feet anchoring system — the visual feet (row 50 of each 64px frame) anchor at the bottom of the tile. This means sprites render with proper depth sorting: your character walks in front of walls to the south and behind walls to the north. The days of floating ASCII characters are over, though we do sometimes miss the simplicity of a well-placed @.
Bloom Entity Masking
The bloom and heat haze post-processing effects used to create ghost sprite duplicates — a fun bug if you enjoy seeing double. An entity mask system now tracks all sprite draw rects and blacks them out from the bloom source, so glow effects enhance the environment without cloning your character.
04 VFX Engine
The web client's particle VFX engine renders real-time visual effects on an HTML5 Canvas layer composited on top of the monospace game grid. Every gadget, every boss attack, every environmental effect has a unique particle system.
1,200 pre-allocated particle objects recycled via object pool. No garbage collection pressure during gameplay. Each particle has position, velocity, lifetime, color, size, and opacity.
Glow effects use additive canvas blending — overlapping particles brighten instead of occlude, creating convincing fire glow, lightning flashes, and energy effects.
Heat gradient particles with ember trails rising from the flame source and smoke sub-emitters that fade to gray. Temperature drives color from white-hot core to orange to deep red.
Lightning bolts generated via midpoint displacement algorithm with recursive branching. Each branch spawns sub-branches with decreasing intensity, wrapped in a bright glow pass.
Frost crystal particles with angular velocity and faceted shapes. Cryo nova expands as a ring of ice shards that shatter on impact.
Spiral particle trajectories pulled toward the vortex center with increasing speed. Debris particles orbit and eventually collapse inward.
Plasma trails leave lingering energy wisps. Acid clouds use randomized drift patterns with corrosive green particle sprays and drip effects.
Boss telegraph cracks split the ground with fracture-line particles. Screen shake on impact scales with damage. Cone attacks sweep particles across the telegraph zone.
Adaptive Performance
The VFX engine auto-scales particle count and quality based on your frame rate. If FPS drops below target, particle LOD (level of detail) reduces automatically — fewer particles, shorter lifetimes, simpler physics — to maintain smooth gameplay. You can also manually tune effects via the settings panel.
Biome Color Grading
Each tunnel biome applies a unique color tint to the entire screen. Magma biomes cast a warm red-orange glow. Ice biomes shift toward cool blue. Datastream biomes pulse with cyan-green. The grading is subtle but gives each biome a distinct atmosphere beyond just the tile colors.
05 Information for Nerds
Technical breakdown of how the web client was built, for those who want to know what's happening under the hood.
Architecture
HTML5 Canvas renderer with square 10×10 tiles, pixel art sprites, 3D extruded cube walls, and a particle VFX overlay composited on top. Walls and floors use fillRect with per-biome color palettes (no fillText for tiles). Sprites render with offscreen buffer compositing for tint effects. VFX particles draw with additive blending for glow effects.
Connection
The browser connects via WebSocket at /ws. Nginx reverse-proxies this to port 7778 on the game server. The server uses a WebSocket adapter pattern — incoming WS connections get wrapped in a TCP-like socket interface (write(), on(), destroy()) so the existing game logic doesn't need any changes. The same authoritative server handles both terminal and web players identically.
State Synchronization
The server pushes game state as newline-delimited JSON with aggressive bandwidth optimization. Map data uses versioning (only sent on change). Log messages use delta delivery. Enemies and items use entity delta compression — only changed entities are included, with removal arrays for entities leaving view. Spatial filtering culls entities beyond 33 tiles. Static data (vendors, buildings, safe zone) is cached and only re-sent on zone change. A fast position channel sends ~20-byte position updates immediately after movement, bypassing the full ~5KB state snapshot entirely. Together these optimizations cut bandwidth by roughly 90%.
Rendering Pipeline
The renderer draws a square tile grid where walls and floors are colored rectangles and entities are pixel art sprites. Everything composites in strict priority order (combat VFX > status effects > trails > telegraphs > health rings > ambient > biome coloring > base tiles). 3D cube walls render in a multi-pass system with north face occlusion replayed after sprites for proper depth. Transparent second-cube top faces render post-entity for the 2.5D depth illusion. The camera follows the player's smooth position with zoom support (0.5x–3.0x).
Smooth Movement
The web client uses client-authoritative free pixel movement at 25 tiles/sec — no tile-snapping whatsoever. The client moves the player in the input direction, checks per-axis wall-slide collision independently (so you glide along walls instead of stopping dead), and sends syncPos updates to the server every 40ms for validation. The server confirms walkability and distance but does not correct the client's position — the client is the authority. Diagonal movement is normalized to the same speed as cardinal. Sprint doubles the visual speed to match server 2-tile moves. Teleports over 8 tiles snap instantly.
Input System
WASD for movement, mouse for gadget aiming (left click = gadget 1, right click = gadget 2), keyboard for overlays. The input module tracks which overlay is currently open (inventory, shop, chat, look mode, party, tickets) and blocks conflicting keys. This prevents movement while typing in chat or accidentally firing gadgets while browsing the shop.
Adaptive Framerate
The client drops framerate after periods of no input to save battery and CPU. Any keypress or mouse movement instantly snaps back to full framerate.
File Structure
| File | Lines | Purpose |
|---|---|---|
game.js | ~2,600 | Main loop, WebSocket, state transform, syncPos, audio hooks, movement |
renderer.js | ~9,100 | Canvas renderer, sprites, 3D cube walls, drawn tiles, fog of war, lighting |
vfx.js | ~6,600 | Particle VFX engine, gadget auras, bloom mask, 30+ effect types |
audio.js | ~1,800 | MP3 music + procedural SFX + MP3 gadget SFX + spatial audio |
input.js | ~515 | Keyboard, mouse, and touch input with overlay mode tracking |
hud.js | ~5,000 | Floating panels, grid inventory, vendor, chat, party, tickets, tutorial |
constants.js | ~140 | Biome colors, enemy characters, shared data |
palette.js | ~60 | xterm-256 color to RGB lookup table |
VFX Engine Internals
The VFX engine (vfx.js) manages a pre-allocated pool of 1,200 particle objects. Particles are recycled — never created or destroyed during gameplay — eliminating garbage collection pauses. Each particle carries position, velocity, acceleration, lifetime, color, size, and opacity. Per-frame physics updates run before the draw pass. Fire uses heat gradients with ember and smoke sub-emitters. Lightning uses recursive midpoint displacement. Each of the 14+ gadget and environmental effect types has its own particle system configuration.
Rate Limiting & Performance
The server enforces a cap of 20 messages per 100ms per connection, preventing input flooding from affecting game state or other players.
State broadcasts use a 33ms flush interval (~30 updates/sec) with spatial filtering and entity delta compression. Multiple state changes within a single tick are coalesced into one broadcast.
ws npm package on the server side for WebSocket support. Every file loads directly in the browser as-is.
06 3D Cube Walls
Every wall in the game renders as an extruded 3D cube — south face, north face, and corner pieces, all contained within the wall tile. A transparent top face hovers over edge walls for a 2.5D depth illusion. Walls work in all zones including the outdoor jungle. It's a lot of visual infrastructure for what is fundamentally a rectangle, but we respect rectangles here.
How It Works
After the base tile grid is drawn, a multi-pass 3D wall renderer runs across all wall tiles within 28 tiles of the player:
| South Face | Bottom 84% of the wall tile with 2-band gradient shading (near) or flat fill (distant LOD). This is the main visible face of each cube. |
| North Face | Top 16% — fills the space above the south face. Slightly lighter than south for differentiation. |
| Corner Pieces | Aligned with the south face inside the tile for clean intersections at wall junctions. |
| Transparent Top Face | 50% alpha top rendered one tile ABOVE every edge wall, post-entity. Creates the illusion of wall height — you can see sprites through it. |
| Light Tinting | Nearby light sources (gadgets, fire, explosions) tint wall faces toward the light color. Fire glow on tunnel walls is unreasonably satisfying. |
| Light Bounce (RT) | Lit wall faces cast colored glow puddles onto adjacent floor tiles. Secondary bounce extends 2 tiles out with diminishing intensity. |
Depth Sorting
Sprites render with proper depth relative to 3D walls. Walk south and your character appears in front of the wall. Walk north and the wall's north face occlusion pass replays over your head — but only for walls below your position, so it never clips your head when approaching from the south. Interior walls (surrounded by other walls) skip the transparent top face entirely, which is both correct and a significant performance win in dense areas like warehouse rack rooms.
Performance LOD
Walls beyond 17 tiles use a simplified flat-fill renderer instead of the full 2-band gradient with edge highlights and specular. Light source lookups are also skipped at distance. The result: 3D walls render across the full 28-tile fog of war range without melting your GPU. On Ultra quality, all LOD bypasses are disabled — every wall gets the full treatment, because you asked for it.
Raytraced Light Bounce
When a light source (flamethrower, arc welder, explosion) illuminates a 3D wall face, the light bounces back and illuminates nearby floor tiles. The bounce color matches the light source — fire casts warm orange puddles, cryo casts cool blue. A secondary bounce extends the effect 2 tiles further at reduced intensity. This creates realistic indirect illumination that makes tunnels feel like they have actual atmosphere instead of just attitude.
Particle Wall Reflections
VFX particles that hit walls no longer just disappear. With Particle Bounce enabled, fast-moving particles reflect off wall surfaces with 45-55% energy loss and spawn bright spark sub-particles on impact. Flamethrower embers bounce off corridor walls, lightning sparks scatter from surfaces, and explosions send debris ricocheting through rooms. It's physics, but the fun kind.
07 Persistent Fog of War
The web client features a four-zone fog of war system with smooth color transitions, line-of-sight blocking, and persistent discovery.
Four Visibility Zones
| Bright (≤15 tiles) | Full biome colors, full detail. Walls, floors, enemies, items, and sprites render at their true colors. This is where you live. |
| Dim (15–22 tiles) | Biome colors smoothly blend toward gray using _lerpColor() interpolation — no harsh edges. Entities get alpha dimming; tiles use color blending only (no alpha) to prevent brightness seams at zone boundaries. |
| Fog (22–28 tiles) | Two-layer render: very dim discovered base plus fog gray overlay fading from full to zero alpha. Uses biome wall characters for seamless texture transition into darkness. |
| Beyond (>28 tiles) | Discovered tiles show as barely visible outlines. Undiscovered tiles are pure black — the void does not appreciate your curiosity. |
Line-of-Sight Blocking
Barrier gates (B tiles) and locked doors (D tiles) block line of sight, preventing you from seeing what's behind them until they're opened. The LOS check uses Bresenham ray casting with a diagonal corner-clipping fix — on diagonal steps, both adjacent corner tiles are checked so walls can't be peeked through diagonally.
Persistent Discovery
As you explore, the fog of war remembers where you've been. Explored areas remain visible as a faint outline even after you move away — you can always glance back and see the shape of corridors and rooms you've already traversed. Undiscovered areas remain completely black.
Smooth Transitions
Unlike a hard cutoff between visible and hidden, the web client uses per-tile color interpolation to blend smoothly between zones. A player-centered vignette darkening layer matches the fog zone radii (15–28 tiles). The key design principle: tiles use color blending only (no alpha), entities use alpha dimming. This prevents brightness jumps at zone boundaries — the kind of visual seam that would keep a rendering engineer up at night.
08 3D Gadget Auras
When you fire a gadget, pseudo-3D orbital rings appear around your character — four tilted half-ellipses that arc over the player and fade at the floor plane. Each of the 9 gadgets has a unique aura style, because apparently we couldn't stop at just one.
| Flamethrower | Smooth fire rings with warm orange-red glow |
| Acid Sprayer | Blobby dripping rings in corrosive green |
| Arc Welder | Jagged lightning bolt arcs with electric blue flash |
| Cryo Cannon | Hexagonal ice crystal formations |
| Railgun | Precise tech nodes with sharp geometric edges |
| Gravity Well | Spiral vortex pulling inward |
| EMP | Glitchy holographic interference pattern |
| Plasma Whip | Chaotic energy wisps with purple-white shimmer |
| Spark Pistol | Subtle dim flickers — modest weapon, modest aura |
Both gadget slots render auras simultaneously if you're firing both, and each fades independently 300–800ms after release. Aura ring lights bypass wall line-of-sight checks (they're elevated above the walls), so your gadget glow illuminates over walls instead of being clipped by them. It's technically cheating the lighting system, but it looks too good to fix.
09 Touch Controls
Full touch control system for phones and tablets. Toggle via the “Touch” button in the top HUD bar — works on any device, not just touchscreens.
Controls
| Left Joystick | Movement with speed ramp — tap for single tile, hold to accelerate |
| Right Joystick | Directional combat aiming, independent of movement direction |
| ATK / G1 / G2 | Toggle attack mode: melee, gadget 1 (mouse 1), gadget 2 (mouse 2). Can fire simultaneously with movement |
| Utility Row | Buttons for inventory, chat, look mode, relic, consumable, and rest. Hold-to-repeat rest button |
| Overlay Navigation | Inventory, shop, and biome picker scrollable via touch joystick (up/down scroll, left/right filter). Biome picker has tappable confirm. Close buttons on all panels |
10 Audio
The web client has a hybrid audio engine: 52 original MP3 music tracks generated with Suno AI for the soundtrack, and a fully procedural WebAudio SFX engine that synthesizes all sound effects in real time from oscillators, noise buffers, and filters.
MP3 Soundtrack
52 tracks provide context-aware music that changes based on your location. Every biome has 3–7 shuffle variations with 2-second crossfade transitions between zones. Boss fights have 6 unique battle tracks. Victory and level-up play as one-shot stingers layered over the current music.
| Warehouse | 7 chill ambient tracks |
| Cave / Maintenance | 5 dark atmospheric tracks |
| Ice / Cold Storage | 4 ethereal ambient tracks |
| Magma Core | 4 intense orchestral tracks |
| Server / Office / Rack | 5 tense electronic tracks |
| Datastream | 4 synth/chiptune tracks |
| Boss Fight | 6 epic battle tracks |
| Victory / Level Up | Fanfare stingers |
Sound Effects
A hybrid system: MP3 SFX for held gadgets (flame, arc, cryo cannon — with startup, loop, hit, and end clips) and procedural WebAudio synthesis for everything else. All sounds use spatial audio — stereo panning and distance-based fade within a 12-tile range:
| MP3 Gadget SFX | Flame (14 clips), Arc Welder (13 clips), Cryo Cannon (17 clips) — startup → crossfade loop → hit layers → end |
| Procedural Gadgets | Railgun crack, EMP charge-discharge, gravity vortex hum, plasma lob, spark zap |
| Gadget Loops | Held gadgets play continuous MP3 loops (or procedural fallback), stopping with a fade-out + end clip on release |
| Combat | Melee hits, enemy deaths, player hurt/death, boss telegraphs, barrier break |
| World | Footsteps (tile-aware), item pickups, gold, materials, quest completion, tunnel enter/exit |
| Ambient | Per-biome atmospheric background (dripping water, wind, machinery hum, data static) |
Audio Controls
Two independent toggles in the top HUD bar: Sound: ON/OFF controls all audio, Music: ON/OFF controls just the soundtrack (when off, no MP3 files are downloaded — saves bandwidth on mobile). A Mono Mode option in Settings downmixes stereo to both speakers. Music volume has an independent slider. All preferences persist across sessions.
11 Demo Mode
The login page includes a Demo Mode button that lets you try the web client without creating an account. Demo mode connects to the real game server and spawns you into a custom sandbox tunnel with pre-placed enemies and Mk.III gadgets equipped.
What's Included
| Sandbox Tunnel | Custom 60×50 map with multiple rooms, corridors, and environmental tiles |
| Pre-spawned Enemies | 9 enemies of various types to test combat against |
| Equipped Gear | Mk.III Flamethrower and Mk.III Arc Welder — the two most visually impressive gadgets |
| God Mode | Demo player takes no damage so you can focus on exploring the VFX and controls |
| Full VFX | All particle effects, 3D walls, ray tracing, and visual features are active |
12 Where It Started
Warehouse IT started as a terminal game. Pure ASCII, rendered in a blessed TUI over Telnet and SSH.
Players connected to a Linux server, got a terminal full of @ symbols and # walls,
and fought printers with nothing but text characters and imagination. That was the whole game.
The idea came from a love of classic roguelikes — the kind where a D is a dragon
and a * is treasure, and your brain fills in the rest. I wanted to build something
like that, but multiplayer, and set in an IT warehouse because that’s what I know. The terminal version
was the proof of concept: combat worked, tunnels generated, bosses had telegraphs, the ticket system
functioned. All in a monospace grid.
But terminals have limits. Color is constrained to 256 values. Rendering eats server CPU per player. There’s no sound, no smooth movement, no particle effects. Every visual trick is a hack against a system designed for reading email in 1985. When the web client prototype worked — same game, same server, but with a Canvas renderer, spatial audio, and pixel art sprites — the path forward was obvious.
The terminal version is where Warehouse IT was born. Every system in the game — the tunnel generators, the combat, the ticket quests, the relic shrines — was designed and tested in ASCII first. That foundation is still running under the hood. The web client just gives it a face.