What I learned building a 3D browser RTS with three.js and no build step A developer shipped Singularity Rush, a free browser-based real-time strategy game built from roughly 6,700 lines of plain JavaScript with three.js r186 and no bundler or framework, using an import map as the entire toolchain. The project keeps the simulation free of rendering and DOM dependencies via a build check that enforces seeded randomness, enabling headless AI-vs-AI matches in CI, and adds a post-build content-hashing step to work around CDN cache TTLs that could serve mismatched ES modules. I recently shipped Singularity Rush https://webgamerush.com/game/singularity-rush , a free real-time strategy game that runs in the browser. Four fictional AI labs are racing to train a Gen 5 model. Engineers mine data, datacenters on power sites produce compute, researchers speed up training, and rival red teams try to wreck the whole operation. It's about 6,700 lines of plain JavaScript. No framework, no bundler, just three.js and CC0 models from Kenney. I'd make most of the same technical choices again, but a few of them came with catches I didn't see until the game was in production. The game is a folder of ES modules. index.html has an import map, and that's the entire toolchain: