A bamboo raft is not one boat — it is six poles lashed together, and the river takes them one at a time. Clip a limestone boulder hard enough and a lashing parts: you lose a pole, the raft gets narrower and twitchier, and the only way back is to run down floating bamboo and lash a fresh one on. Nine bends of karst river, built end to end by AI agents on Cocos Creator, headless on Linux, and measured against the 4 MB WeChat mini-game cap every build.
Drag left / right, or A D, or the arrow keys, to pole against the current · S brakes · P pause · M reduced motion · N mute
Payload 2,818,942 B raw / 1,067,030 B gzip · loads and plays in a few seconds · portrait, desktop and phone
The concept sheet is generated first and the build is audited against it, region by region, until they agree. Not "inspired by" — the palette on the right is the palette on the left, and when the build drifted to grey water during the art pass that counted as a defect and was fixed, not explained.
The whole game played to completion in grey primitives before a single sprite existed — but the physics was real from the first frame, because the entire design rides on it. The blind readability check also ran here, at the blockout, rather than after ship: three reserved channels (what kills you, what is scenery, where the water goes) had to separate by value and shape while everything was still grey.
Thirteen props are code-modelled in Blender from the callout sheet and rendered top-down at one shared scale of 96 px per metre, each with a matching camera-space normal pass. Nothing is hand-drawn and nothing is stock. Two review rounds were failed on purpose before this one passed — the first put the bank masses at the same value as the limestone hazards, which is backdrop wearing the hazard's clothes.
A skilled pilot that never crashes cannot prove a crash mechanic. The audit therefore ships a second, deliberately named collision probe that steers at hazards and never collects bamboo — a stress probe, not a simulated player. It fails the build unless ropes actually part, poles are actually lost, and the wreck state is actually reached.
Every number below is measured on the build that shipped, with its conditions stated. The unflattering rows stay in — including the one where the builder's own default assets were eating a fifth of the entire budget.
| Measurement | Value | Condition |
|---|---|---|
| WeChat main package | 2,902,096 B (2.77 MiB) | 69.2% of the 4,194,304 B cap |
| Headroom remaining | 1,292,208 B | 30.8% of the cap, unused |
| Engine core | 1,966,613 B | 17 modules, minified, Box2D included |
| Cost of real Box2D | 415,693 B | 9.9% of the cap; measured against the same build without it |
| Prop atlas | 283,524 B | albedo + camera-space normal, 640×512 |
| Audio | 203,452 B | 5 mono MP3s from sampled instruments |
| Unused fonts pruned per build | 868,140 B | 20.7% of the cap the builder ships by default and this piece does not use |
| Web build | 2,818,942 B raw / 1,067,030 B gzip | web-mobile target |
| River length | 131 m over 9 bends | 12,600 world px at 96 px/m |
| Verified playthrough | bend 9/9, 0 errors | desktop 1280×720 and phone 390×844, Playwright |
| Device verification | PENDING | WeChat devtools are Windows/macOS-only; see the note below |
What is not proven. This piece has never run on a handset. The WeChat package is structurally valid and the same code plays cleanly under headless GL, but that proves coherence and rendering, not that it boots inside WeChat. That check needs operator-side credentials and a device, and until then the claim is not made.
A piece that could ship on a plain canvas unchanged is a failed concept. Remove the physics here and there is no game left.
Six dynamic bodies, not one boat. The raft's flex and twist are simulation, not animation.
Five limited hinges. Destroying one is how a rope parts; a pole with none left becomes debris.
Cocos joints have no break force, so the rope threshold reads solved contact impulses directly.
A fixed midday sun rakes the camera-space normal pass, so a boulder reads as a mass from directly above.
Rocks, snags and sensor pickups spawn and retire in a window around the raft.
The river sweeps itself and deletes rocks until every point admits a 190 px raft.
6 poles, 5 lashings lashing breaks at 320 kg·m/s lash stiffness 165 spin cap 1.6 rad/s flow 210→444 px/s steer 330 px/s channel 250→172 half-width min gate 190 px 96 px per metre