Real SNESera physics.
In your browser.

$2,500 competition

Play it, build levels for it, or write a bot that beats it.

ForwardJumper is playing — press any key to take over

Booting the engine…

The whole game, four beats

Real physics

Bit-accurate SNES-era movement at 60Hz. No approximations.

Infinite levels

Every level is generated and solver-proven beatable.

Bots welcome

Write a little program that plays. Watch it try.

$2,500

Two weeks, two tracks, real prizes.

Trending levels

Make your own levels

  • SNES-style physics & collisions
  • Multi-room levels, pipes and doors
  • Test instantly in the browser
  • Publish when the solver proves it's beatable
Open the level maker

AI assist

“add a coin trail over the gap”

Write a bot to play it

Your code gets the whole world — positions, physics, a forward model — and 40ms a frame to think.

  • Full game state & controls
  • Deterministic, verifiable replays
  • Compete on the nightly leaderboards
/** Hold one mask for PROBE_FRAMES on a forked world and report how it went. */
function rollout(tools: AgentTools, mask: InputFrame): Rollout {
const sim = tools.fork()
// Frame 0 has to clear a stale jump bit, or a probe "presses" a button that was already held and
// measures a jump that would never have happened.
const stale = sim.world.player.prevInput & BTN_JUMP
let reachedPx = sim.world.player.xPx
 
for (let frame = 0; frame < PROBE_FRAMES; frame++) {
sim.tick(frame === 0 ? mask & ~stale : mask)
const player = sim.world.player
if (player.xPx > reachedPx) reachedPx = player.xPx
if (player.dead !== 0 || doomed(player.yPx)) return { reachedPx, died: true }
}
return { reachedPx, died: false }
}