Native where it must be fast. JavaScript where you iterate.
OpenStrike runs the classic maps with bots, lightmaps and recoil at a locked 60 fps on a 333 MHz PSP. The engine parts are Rust; the gameplay, HUD and menus stay JavaScript you can edit and rerun.
The split that ships
Pocket3D carries BSP worlds, visibility and a painter-sorted pipeline in the core. The HUD is a Solid app on the same native tree as every other PocketJS interface. OpenStrike, shipped →
A whole game in the guest
Pocket Voxel keeps world state, battles, scripts and saves in TypeScript inside QuickJS, while per-machine Rust renderers draw the diorama at a locked 30 fps. A creature-RPG from first principles →
Matches replay themselves
Input tapes make every run reproducible: the same tape gives the same frames, so a whole match replays frame for frame while you debug it.
OpenStrike on de_dust2: a locked 60 fps with bots on real PSP hardware.