- Replaced the sandbox's perfect maze with a new generator: thin partition walls in an open floor, irregular rooms from recursive splits with 1–3 openings per wall, walls that stop short, open-plan wall fragments, pillar halls on a fixed grid, and long parallel corridors. Openings make loops, so you can circle back instead of hitting dead ends.
- The world now streams in 28.8 m chunks around you and has no edge.
?seed=in the URL picks the layout; R rolls a new one; M shows a top-down map of the walls around you. - Frame rate: the old sandbox's scene was light (about 7k triangles, 2 draw calls); its cost was per pixel, multiplied by MSAA, the PBR material and a pixel ratio of up to 2. On a software WebGL renderer it measured 35 ms a frame at 1080p and 133 ms at pixel ratio 2. The rebuild uses an unlit material with baked vertex light, skips MSAA on software renderers, and scales the render resolution to hold the frame rate. It measures 0.7 ms a frame at 2560×1440 on a desktop GPU and 7–18 ms on the software renderer, depending on resolution.
- Collision is now box-based instead of grid cells, so walls can be thin; added Shift to run.
// build log
Devlog
The open technical log for escapethebackrooms.us — a browser Backrooms game built in the open. This page tracks how it's actually made and what changed, in plain technical terms. No hype, no roadmap; just the build and the changelog.
The stack
- Three.js r0.169
- Vanilla ES modules
- No build step
- Static · GitHub Pages
- Deploy = git push
- MIT-licensed code
Everything ships as hand-written HTML/CSS/JS with Three.js vendored in and loaded through an
import map — there is no bundler, no framework, and no compile step. You can read every line that
runs by viewing source. The whole site is static and deploys by pushing to main.
What's live right now
The landing page (/) — a fluorescent holding page while Level 0 is rebuilt.
/experience/sandbox/ — the layout testbed. An endless, seeded, chunk-streamed floor plan of yellow rooms, partition walls, pillar halls and long corridors under one drop ceiling, free-walked with pointer-lock + WASD on desktop or a virtual stick + drag-look on touch. Still flat colour: no textures, no effects, no entity.
The on-rails Level 0 demo and the choose-your-path spike came off the site on 2026-10-30. Both are kept whole in the repository's git history (tags archive/level0-onrails and archive/cyoa-spike).
How it's built
- Chunked, seeded generation. The world is 28.8 m chunks, each rebuilt from the seed and its own coordinates alone, so the map has no edge and the same seed always gives the same layout.
- One mesh per chunk, baked light. Each chunk is a single mesh with per-vertex lighting baked from the light-panel grid and one unlit material, so the whole view is about 10–25 draw calls of the cheapest shader three.js has.
- Kinematic movement. The free-walk controller is axis-by-axis box collision with wall-sliding: cheap, predictable, and enough to judge feel before any physics engine.
- Zero-asset first. No textures or models yet, only flat colours, so the download is three.js plus a few kilobytes of code.
Changelog
- Took the on-rails Level 0 demo and the parked choose-your-path spike off the site; both are kept at git tags.
/experience/now redirects to the homepage, and the homepage no longer links into a build. - Removed the three.js post-processing add-ons, which only the archived demo used. The site now loads three.js core and nothing else.
- An experimental NPC decision layer with a stand-in pursuer was built for the sandbox but not shipped; it's kept at a git tag for after the rebuild.
- Pruned superseded planning docs and retired the old
/loredoc archive; trimmed the internal build notes down to shipped facts.
- Fixed a reversed strafe vector (A and D were swapped) in the free-walk controller; reconciled the internal docs to the shipped build.
- New graybox testbed at
/experience/sandbox/: recursive-backtracker maze (33×33, fixed seed), pointer-lock + WASD / touch stick + drag-look, per-axis grid collision with wall-sliding, all walls in oneInstancedMesh(~2 draw calls), high frame rate on desktop. - Added the MIT license for the code plus an explicit all-rights-reserved notice for written and visual content.
- Audited every internal doc against the shipped build; confirmed the renderer is one hand-written GLSL VHS pass on stock
EffectComposer(not a plugin stack). - Evaluated Gaussian splatting for the environments and dropped it for now — flat, textureless Backrooms surfaces are a worst case for 3D Gaussian splats.
- Added a 2D top-down level-design tool for laying out mazes as data.
- Parked a choose-your-path interaction prototype at
/experience/cyoa/.
- Winding instanced-cell-grid corridors and a "Turn" room; DOM caption layer; runtime canvas textures (no image payload). Custom domain went live.
- Coming-soon lobby page. Static GitHub Pages, no build step — the shape it still has today.
Open source & licensing
This project is built in the open. The split is deliberate:
- Code = MIT. The source that makes the site run is free to read, learn from, and reuse.
- Content = © 2026 Josh Hickson, all rights reserved. The writing, lore, story/world design, level design, and any visual or audio assets are not open — they're here to experience, not to reuse.
Short quotations from and descriptions of A24's Backrooms (2026) appear for criticism and
commentary (fair use); that film remains the property of its rights holders. Full terms live in the
repository's LICENSE and README.