Slingshot: A 3D Physics Game in the Browser Where Every Level Is Proven Winnable Before Anyone Plays It
Pull, aim, let go: knock six targets down in a room where everything falls for real. A 3D physics game for desktop and phone browsers, built by us end to end, with 100 levels that a computer has already played and won.
Pull, aim, let go: knock six targets down in a room where everything falls for real.
A browser game for desktop and phones, in English, Spanish and Russian, with no install and no sign-up.
How It Plays
- Pull the ball back and let go. The pull sets the power and fine-tunes the aim, and a dotted line shows where the ball will fly and where it will bounce first.
- Turn all the way round: you stand in the middle of a living room, kitchen, kids’ room, study or bedroom, with doors open onto other rooms whose things can be targets too.
- Knock down the six things the yellow arrows point at. Some ride on robot vacuums driving round the floor, and in most levels one or two stand behind a glass screen that no straight shot can pass, so you bank the ball off a wall, or off two.
- Everything else reacts as well: cups and vases shatter, window panes break, the TV screen cracks, a hard hit tears the chandelier off its chain, doors swing shut, the fridge opens, the tap runs, toast pops up and the light switch really turns off the light.
- All six down in six shots earns three stars. Coins pay for new balls and trails in the shop, and a daily gift grows with every day in a row.
Slingshot is our own product: the kind of engineering we sell, in something anyone can understand in a second.
Real Physics in a Real Room
A game like this lives or dies on whether things fall the way the eye expects. So nothing is faked: every book, cup, toy and chair is a body in a real physics engine (Rapier, compiled to WebAssembly), stepped 60 times a second. The ball uses continuous collision detection, so even at full power it cannot pass through a thin shelf. Pottery and glass break into real fragments, each with its own physics, and a cup knocked off a table breaks on the floor but survives a landing on the rug.
How a thing looks and how it collides are kept apart in the code. That let us replace the whole look of the game, from a pencil-sketch style to bright, glossy toy rooms with soft shadows and a night mode, without touching a single level: after the redesign, the proof shots of all 100 levels (see below) came out byte for byte the same.
Levels Generated, Then Furnished by Hand
A level is data, not a scene drawn by hand: the room’s size, its windows and doors, the furniture and where it stands, and the six targets. A generator builds rooms from a seed and a theme, with what each kind of room needs (a sofa or TV, a kitchen run, a bed, a desk), and keeps the floor around the player clear so nothing blocks the view.
Generated rooms were a starting point. We then went through the levels and furnished them as a person would: furniture against the walls where it belongs, shelves and pictures on bare walls, a radiator under every window and nowhere else. The pictures on the walls are children’s paintings. A layout audit catches what a human eye misses: furniture past the end of a wall, over a window, in a door’s swing or half on the rug. A level can be locked, and from then on the generator never rewrites it.
Every Level Proven by a Simulated Shot
The worst thing a puzzle game can do is ask for something impossible. So no level ships on trust. The same code that builds a room in the browser also runs in Node, outside the browser, with the same physics, and checks each level:
- the room stands still for 2.5 seconds of simulation, and anything that slides or tips over on its own is removed;
- every target can be seen from the player’s place;
- every target is actually knocked down by a simulated shot fired in a copy of the world;
- a target behind glass is out of reach of any straight throw and is knocked down by a bounce: the check mirrors the target in nearby walls and furniture sides, scans the aim degree by degree, and then fires the best throws for real.
Hand edits go through the same check, so a moved bookcase cannot quietly make a target unreachable. The native app runs the same levels on a different physics engine, and where it could not knock a target down, we replaced that target in the web levels too, until both versions passed all 100.
Light Enough for a Phone Browser
A browser game has seconds to start before a player leaves. The physics engine’s WebAssembly used to be inlined in the script as text; it now loads as its own file, compiled while it downloads, so the script the browser must parse before anything runs went from about 1.4 MB to 277 KB compressed. The first room needs only the models it shows, about 1.15 MB in total, and the rest load behind it.
Inside a frame, the fixed furniture of a room is merged into a few meshes, which cut draw calls in a level-50 room from 1,120 to 619. On a desktop emulating a phone with a processor six times slower, level 100 went from about 49 frames a second to a steady 60. The game also adapts by itself: it measures its own frame times and, on a device that cannot keep up, steps down the resolution and the shadows. We have not yet measured the web version on real phones.
A Finished Game, Ready for Portals and Stores
Around the core there is everything a game needs to be played rather than just shown: a tutorial hand that teaches the pull and the look without words, stars, the level list, coins, a shop of 12 balls and 6 trails, a daily gift, music and sounds, and day and night themes. One build switch adds the SDK of the games portal Poki, with ad breaks at natural pauses and an optional ad for double coins, following that portal’s rules.
A native Android version in Unity is built and plays the same 100 levels from the same files. On a Samsung Galaxy S23 the levels we measured hold 60 frames a second, the heaviest one 54–55, and its store page, graphics and data-safety forms are prepared.
What This Means for Your Project
- We build interactive 3D for the browser: product configurators, room planners and showrooms where things behave like the real objects, built and tested to load fast and to run on ordinary devices.
- When a system generates a lot of content, such as layouts, quotes, schedules or levels, we build the automatic check that proves every piece works before a customer sees it, so the content can be trusted at scale.
- One product can live on the web and as a native app, sharing data and rules between the browser and the phone, so a change made once reaches both and is checked on both.
Status
Slingshot is complete and playable, but not yet public: the web build is not published on any site or portal, and the Android app is ready for the store but not released.
Tech Stack
- Client: TypeScript + Vite, Three.js (WebGL), soft shadows, day and night lighting
- Physics: Rapier (Rust compiled to WebAssembly), 60 Hz fixed step, breakable objects
- Levels: generator from a seed and a room theme, then furnished by hand; one data file per level
- Level check: the same room code and physics in Node, simulated shots and ricochets
- Performance: merged static meshes, adaptive quality from measured frame times
- Meta game: coins, shop, daily gift, progress in local storage
- Portal build: Poki SDK behind a build switch
- Native app: Unity 6, C#, PhysX, the same level files
- Languages: English, Spanish, RussianResult
A 3D physics game that opens in a browser, where a shelf of books collapses the way you expect, and where every one of the 100 levels has already been won by a computer before a player ever sees it.




