Local flight recorder for browser games

Make the bug play itself.

Capture input timing, your random seed, and the checkpoints that matter. Get one tiny replay file—not a screen recording, not a surveillance stack.

Test the recorder

  • Zero runtime dependencies
  • 128 KB default cap
  • No network calls
Input sequenceSame sequence
An illustrated cream and petrol flight recorder passing the same sequence of game-event shapes from one side to the other.
Seed + inputs + timing, packed into one bounded artifact.
01ArmUser opts in
02CaptureInputs + timing
03ReproduceGame applies events

Bench test / live package

Record a failure. Replay it exactly.

Arm the recorder, then steer the probe with arrow keys or click/tap the scope. Hit a red fault cell, export the capsule, and import it again. Your path is driven by the library—not a video.

Capture controls

Ready
Bench ready Arm recording to begin a new seeded run.

steer · pointer moves probe · avoid fault cells

No input has been captured yet. Your run stays only in this tab until you download it.

Built for the smallest useful report

Enough evidence. No exhaust trail.

Engine-neutral events

Apply normalized inputs to your own game adapter. No synthetic DOM magic and no lock-in to a framework.

A hard byte ceiling

The recorder stops before it crosses the configured cap, keeping reports portable by construction.

Timing you can control

Replay at real speed or accelerate it in a debugger. Pause, resume, and stop are part of the public API.

Three calls, no backend

Wire it into your game loop.

recorder.ts
import { createRecorder, downloadCapsule } from '@sociobot/replay-capsule'

const recorder = createRecorder({
  seed: world.seed,
  target: game.canvas,
  maxBytes: 128_000
})

reportButton.onclick = () => recorder.start()
recorder.checkpoint('level-loaded', { level: 7 })
downloadCapsule(recorder.export())
Works with CanvasPhaserKaplayPixiJSDOM games