Skip to content

Gameable Engine

Gameable Engine (aos-gameable-engine) is a browser game engine where the world is a gaussian splat, the renderer is WebGPU, and all game logic is a WebAssembly component.

Status

Milestones M0–M3 and M5 have shipped: splat worlds render on WebGPU and on the WebGL fallback, the wasm guest ticks at 0.19 ms, physics and input work, the first-person template is playable, and splat characters animate on both rig backends. npm create aosengine is not published to npm yet, so the quickstart below runs from a checkout. M4 (third-person template) and M6 (docs and the small-model eval) are in progress.

The 60-second quickstart

sh
npm create aosengine my-game -- --template fps
cd my-game
npm run dev

That gives you a splat arena you can walk around, three capsule enemies you can shoot, an ammo and health HUD, and a win condition — with zero edits and no Git LFS.

Then open src/game.ts. It is one defineGame call:

ts
import { defineGame, input, physics, hud } from '@aosengine/sdk';

export default defineGame({
  assets: './assets.json',
  world: 'arena',
  player: { spawn: [0, 1.7, 0], speed: 5, jump: 4.5 },
  systems: [
    (ctx) => {
      if (input.pressed('fire')) {
        const hit = physics.raycast(ctx.camera.origin, ctx.camera.forward, 100);
        if (hit) ctx.damage(hit.entity, 25);
      }
      hud.set({ ammo: ctx.player.ammo, health: ctx.player.health });
    },
  ],
});

Edit it, save, and the guest hot-reloads through a snapshot/restore cycle. That is the whole loop.

Where to go next

You want toRead
Play the examples in your browserPlay
Install the toolchainInstall
Build a first-person gameBuild your first FPS
See the whole architecture at onceConcepts
Understand how a frame worksThe engine loop
Understand the wasm splitThe wasm boundary
Do one specific thingRecipes
Look up a functionAPI reference
Know why something is the way it isADRs
Fix an error messageTroubleshooting
Decode the jargonGlossary

If you are a language model

Read llms-fps.txt or llms-third-person.txt at the repository root before writing any game code. They are task-scoped bundles built for exactly this. The full corpus is llms-full.txt; the index is llms.txt. The hard rules are in AGENTS.md.