Skip to main content
Back to posts

Gamedev.js Jam 2026 · 13 days

Orb Knight: a 3D browser roguelite in 13 days

Gamedev.js Jam 2026 gave everyone the same theme, Machines, and the same 13 days. I had a decade of production web work behind me and no shipped games, so I set out to build a real-time 3D action game that runs in a browser tab. A friend, Arseny Yankovski, added the laser charge-up and three enemies. The result is Orb Knight: a brass machine with a sword, a gun and a laser, cutting its way out of a foundry. It took 6th in Gameplay and 12th overall out of 483 ranked entries.

01 · The result

6th in Gameplay, 12th overall

The category I care about most is Gameplay: how the game feels in your hands. Orb Knight scored 4.027/5 there, 6th across the whole jam, and players mostly praised the controls and the feel. Overall it finished 12th of 483 ranked entries.

#6 Gameplay · 483 ranked
#12 Overall
13 days of jam
104 commits by the deadline
The public itch.io result card: 37 ratings, 4.027 for Gameplay, 3.670 overall. Click to zoom.
Category scores out of 5
Gameplay #6 4.027
Overall #12 3.670
Graphics #34 3.811
Theme #25 3.784
Audio #29 3.486
Innovation #79 3.243

02 · What shipped

A machine knight and the foundry it escapes

The submitted build is a complete run: fight through seeded foundry rooms, collect gears, rebuild your machine at the loadout bay, survive the shop keeper's prices, beat the Gate Keeper, and break out onto the castle road. Roughly 56k lines of TypeScript and Svelte and 104 commits by the deadline, in one browser tab: SvelteKit and Svelte 5 runes for the shell, Threlte and Three.js for rendering, Rapier for physics, Bun for everything else.

Combat that carries the game

Third-person movement, a sword, a gun and a chargeable laser against 9 enemy types and 3 bosses. The last of them, the Gate Keeper, fires triple shots and sweeps an arc laser you have to jump.

Seeded runs

29 room templates across 7 kinds (combat, challenge, treasure, shop, secret, boss and a training polygon), validated with Zod and stitched into seeded dungeon layouts. Gears buy modules: 10 of them, across attack, body, melee and utility slots, reshape your build mid-run.

Synthesized sound effects

Every sound effect is synthesized in Web Audio at runtime: noise buffers and oscillators through a compressor. The laser windup, door grind and metal-shatter death are all code; the music tracks are separate recordings.

Mid-run combat pressure
The loadout bay between rooms
Boss arena, moments before regret

03 · Build log

13 days, compressed

From the commit history: 104 commits between April 15 and the April 26 deadline, and nine more after it.

  1. Apr 15–16

    First Threlte prototype

    A capsule, some targets, projectile shooting and a crosshair. Not a game yet, but it renders and shoots.

  2. Apr 17–21

    Rooms move into data

    Room templates move into JSON with a Zod schema, dungeon layout gets seeded generation, and the first real enemies start applying pressure.

  3. Apr 22–23

    The outside world

    Overworld chunks derived from the dungeon seed, road and grass shaders, a vegetation registry. The foundry gets somewhere to break out to.

  4. Apr 24

    Loadout bay and adaptive music

    The machine module bay lands — swap attack, body, utility and melee modules mid-run — and the soundtrack starts reacting to game state.

  5. Apr 25

    The 25-commit day

    Laser beam with charge-up, the shop and its keeper NPC, the Gate Keeper boss, the core prison setpiece and a full pass of procedural sound effects. Late that night, the first performance work: a pixel-ratio cap, shadow-pass cuts and lights that mount only in the active room.

  6. Apr 26

    Submitted

    Material pre-warming, the itch.io build and the submission, ahead of the 17:00 CEST deadline. Some players still saw lag on weaker machines.

  7. Apr 26–27

    After the deadline

    Nine more commits for the hosted build: performance fixes, warm-ups, room transitions and run state that survives the menus.

04 · Live scenes

Poke the actual game

These are the same Storybook fixtures I used to build Orb Knight, embedded live — real production renderer, physics and AI with pinned state, so you can play with one system without fighting through a run to reach it. They're full WebGL apps, so only one runs at a time; there's also the complete Storybook if you want everything.

Scene 01 · Laser

Charge-up laser, live

Open full scene

The Laser Beam module in its weapon lab. Hold fire to charge, sweep the beam through targets, switch to the other five builds (default rivet, split arc, wave, lob and rockets) in the panel. The electric windup you hear is synthesized in Web Audio. Arseny Yankovski built the charge-up and this weapons playground.

Scene 02 · Final boss

Gate Keeper sandbox

Open full scene

The final boss with its full moveset, without the run to reach it: triple shots, and a sweeping arc laser you jump over like the world's angriest skipping rope. This fixture is where its timings were tuned. The Combat Preset panel swaps in the other eleven fights, from a line of scrap runners to the Mine Herald.

Scene 03 · Rooms

All 29 rooms, one dropdown

Open full scene

Every room is a JSON template checked by a Zod schema, and this previewer builds any of the 29 the way a run would. It opens on the treasure vault, relief-mapped floor and a module on the pedestal; the panel swaps in lava lanes, catwalks, the forgeyard, the shop or the boss arenas, enemies included.

Scene 04 · Loadout

Try-on bay with live stats

Open full scene

The module try-on fixture: swap any of the 10 modules and watch the character model, damage, fire rate, health, magazine and reload react instantly. Seeing the numbers next to the model caught bugs in both.

05 · How it was built

One change, one playtest

Codex and Claude Code wrote a lot of the code. What decided the result was everything around it: cutting systems into changes small enough to review, keeping the boundaries between combat, rooms, progression and UI clean so a bad implementation was cheap to throw away, and playing after every change, because only playing tells you the camera feels wrong. Scope, game feel and the release call stayed with me.

06 · Notes to future me

What I'd keep, what I'd change

01

One observable behavior per loop

The unit of work that survived: one behavior, one implementation pass, one browser check. Every time I batched more into one change, review cost grew faster than the code was worth.

02

Correct is not the same as good

Combat can satisfy every stated rule and still feel like hitting cardboard. Feel only comes from playtesting and tuning, over and over.

03

Storybook was the highest-leverage tool

Deterministic fixtures turned "run to the boss and hope" into "mount the boss with fixed state". Most changes got reviewed inside these scenes — the same ones embedded above.

04

Innovation cannot be patched in later

A competent roguelite loop is buildable in 13 days — a distinctive mechanic has to be there from day one, and mine was not.