Three.js games your agent can build, test and ship

Plain Three.js and TypeScript that Claude and Codex already know, with playtests that prove every change. One codebase runs in the browser and ships native to desktop and Android.

Read the docs
  • Web, desktop and Android
  • WebGPU, with WebGL2 fallback
  • MIT licensed
Assembling VULTURE 0130%

VULTURE 013 · live Three.js

No WebView

On desktop and Android, the game renders in a native window. There is no WebView.

Plain Three.js

Scenes, meshes, materials and cameras are plain Three.js objects.

Game systems included

The game loop, input, physics, audio and asset loading come wired together.

One codebase

One gameplay codebase builds for the browser, Windows, macOS, Linux and Android.

Built with ThreeNative

Real games, not tech demos

Every frame below is a capture from a game built on the engine in TypeScript and Three.js. No renders, no mockups.

See every example
A fighter banks over a sunlit ocean with an enemy carrier below.
Midway: Open Pacific · flight combat
A fox on floating grass islands with a castle and a coin HUD.
Fox platformer · 3D platformer
Lantern-lit crates around a glowing seal tile in a stone vault.
Warden Vault · puzzle
A first-person view into a cave lit by a warm lantern, with a wet floor.
Soul Cave · first-person horror
Ribbed vaults and hanging chandeliers seen from the floor.
Vesper Hall · real-time GI
An isometric board with a winding path, towers and an armory panel.
Tower defense template
A race car on a circuit under a start gantry, with a lap HUD.
Racing template
A character leaves footprints in falling snow beside a weather panel.
Snow · weather and footprints
A standing stone in a clearing of sunlit ferns.
Wildwood · exploration

Plain Three.js

Your agent already knows the API

ctx.scene is a real THREE.Scene and ctx.renderer is a real WebGPURenderer. There is no editor state and no scene format to learn, so Claude and Codex write code they have seen a million times.

  • Every change is a TypeScript diff you can review
  • Drop down to raw Three.js whenever you want
  • An MCP server tells the agent what the engine already provides
A candlelit gothic nave with a shaft of light falling from the rose window.
Vesper Hall: GI, reflections and god rays on a plain Three.js scene.

Verified

The agent plays what it built

Playtest scenarios press keys, wait ticks and assert on game state, cameras, HUD, console errors, screenshots and draw calls. A feature is done when the game proves it, not when the diff looks right.

  • Deterministic scenarios in plain JSON
  • Screenshot and performance budgets fail closed
  • The same check runs in CI and in the agent's loop
A first-person test range with score 0 and ammo 30 of 90.
Before the scenario: score 0, ammo 30/90.
The same range after the scripted steps, with score 150 and ammo 29 of 90.
After: score 150, ammo 29/90. The playtest asserts both.

Native

One codebase, every screen

The same game runs in the browser on WebGPU and ships as a native app for Windows, macOS, Linux and Android. On native there is no WebView: the frame goes straight to the GPU.

  • Vite dev loop in the browser, native build when you ship
  • Physics, input, touch and gamepad wired the same everywhere
  • Measured on a real Pixel 8, not only an emulator
A first-person street with a native HUD, captured on an Android phone.
Bayview as a native Android app on a Pixel 8.
An aircraft over the sea with cockpit gauges and radar, in the native desktop host.
Midway in the native desktop host. No browser, no WebView.

The agent loop

From a prompt to a verified build

Every project ships with agent instructions and four MCP servers. The agent searches what exists, writes a small patch, then proves it in the running game.

Architecture

Thin engine, real Three.js underneath

Your game is ordinary TypeScript on top of a small set of packages. The engine owns the plumbing; the look and the gameplay stay in your source.

  • @threenative/core

    defineGame, the fixed-step loop, scenes, input, state and the build entry for web and native.

  • @threenative/physics

    Rapier physics: WebAssembly in the browser, a native binding on device.

  • @threenative/playtest

    Scripted gameplay scenarios with semantic, visual and performance assertions.

  • @threenative/ui

    React bindings for HUDs, menus and debug overlays over the game surface.

  • threenative-engine-mcp

    Lets an agent search every public engine API before it writes code.

  • @threenative/runtime-native

    The native host: V8, wgpu-native and Dawn, with no WebView.

import { type ICtx, Scene, defineGame } from "@threenative/core";import { BoxGeometry, Mesh, MeshStandardMaterial } from "three";class Play extends Scene {  override enter(ctx: ICtx) {    const material = new MeshStandardMaterial();    const cube = ctx.add(new Mesh(new BoxGeometry(), material));    return (_frame: ICtx, dt: number) => {      cube.rotation.y += dt;    };  }}export default defineGame({ scenes: { play: Play }, start: "play" });

That is
the whole game

defineGame runs the loop. Each scene adds Three.js objects in enter() and returns a function that runs every frame.

Read the docs

Performance

Measured, with the source linked

On native, three.js records each frame's GPU commands into one packed buffer that crosses into C++ once. Every number below links to the run that produced it.

Compare with Three.js and Unreal
An aircraft over the sea in the native desktop host.
Midway, native desktop: 57.6 to 58.3 fps at a 60 Hz cap, frame p50 14.8 ms.
A sailing ship near a palm island.
Caravel's playtest fails if p95 passes 33 ms or draw calls pass 140.
The fox platformer running in portrait as a native Android app.
Pixel 8, native: 60 fps across 253 windows.

Start your game with one command

One command scaffolds a project with the engine, agent instructions and MCP servers already wired.