ignifx
GitHubnpm · soon

Open source · TypeScript · WebGPU

Ignite your next game.

ignifx is an open-source TypeScript game engine built on WebGPU. Write your game as code, run it in the browser or on the desktop, and ship with physics, audio, input, UI and animation already in the box.

WebGPU: checking…

Runs wherever WebGPU does: Chrome and Edge 113+, Safari 26+, Firefox 141+ on Windows and 145+ on Apple Silicon. Desktop through Electron.

A detailed metal spaceship crossing the frame nose-down, seen from slightly below and in front: a warm key light picks out its worn hull plating, a rim light behind it burns the wing edges, its engines glow, and behind it a faint pool of light falls away to black at the corners.
Open standalone

` devtools

Physically based rendering — a glTF model lit by an image-based environment, with bloom and tone mapping. Drag to orbit.

Open this example

Why ignifx

  • Code first

    Your game is TypeScript, not a project file. Entities, components and scripts with typed, schema-declared fields. One obvious way to do each thing, and no decorators, globals or magic.

  • WebGPU only, by design

    ignifx renders through Babylon Lite on WebGPU alone. One render path means PBR materials, image-based lighting, shadows and post-processing that behave the same everywhere WebGPU runs, and nothing to test twice.

  • Batteries included

    3D physics on Havok. 2D physics on Rapier. Spatial audio with a real mixer. Action-based input with rebinding. A DOM UI layer. Animation state machines, navigation meshes, sprites and tilemaps. Each one is a line in createApp.

  • Browser, desktop and headless

    The same game runs in a browser tab, in a hardened Electron window, and headlessly in Node for your tests and tools. Saves, settings and rebinds persist on all three.

  • Open source, from a studio that ships with it

    Apache-2.0, developed in the open, and used by Astrum Forge Studios for its own games and projects.

This is a complete ignifx app

A camera, a shadow-casting light, a ground plane and a spinning cube, every asset created in code. There is no hidden project file behind it. This sample is compiled and run by the engine's documentation checks, so it cannot go stale.

  • Typed fields, no decorators. Script.define({ speed: f32(90) }) is a serialisable, inspectable field.
  • One frame, six phases. A fixed step for simulation, update for the rest, and every callback in a documented order.
  • Extensions in one line. createApp({ extensions: [input(), physics(), audio()] }).
main.ts
import {  Camera,  Light,  MeshAsset,  MeshRenderer,  Script,  createApp,  createMaterialAsset,  f32,  pbrMaterialDefinition,} from "@ignifx/core";import type { ScriptCallbacks } from "@ignifx/core";class Spinner extends Script.define({ speed: f32(90) }) implements ScriptCallbacks {  static typeId = "demo/Spinner"; // `speed` is a serialized field, degrees per second  update(dt: number): void {    this.transform.rotate({ x: 0, y: this.speed * dt, z: 0 });  }}const canvas = document.querySelector("canvas");if (!(canvas instanceof HTMLCanvasElement)) {  throw new Error("ignifx needs a <canvas> element on the page.");}// Shadows are a Babylon Lite opt-in, declared before the scene is registered (IGX-0704).const app = await createApp({ canvas, settings: { rendering: { features: { shadows: true } } } });app.registerComponents([Spinner]);const eye = app.world.createEntity("Main Camera");eye.transform.localPosition.set(0, 2.5, -4.5);eye.transform.lookAt({ x: 0, y: 0.6, z: 0 });eye.addComponent(Camera, { fov: 55, far: 100 });const sun = app.world.createEntity("Sun");sun.transform.localPosition.set(3, 6, -2);sun.transform.lookAt({ x: 0, y: 0, z: 0 });const light = sun.addComponent(Light, { type: "directional", intensity: 3 });light.shadows.enabled = true;const ground = app.world.createEntity("Ground");ground.addComponent(MeshRenderer, {  mesh: MeshAsset.ground(app, { width: 20, height: 20 }),  castShadows: false,});const ember = createMaterialAsset(  app,  pbrMaterialDefinition({ name: "ember", baseColor: { r: 0.93, g: 0.42, b: 0.16, a: 1 }, roughness: 0.35 }),  [],);const cube = app.world.createEntity("Cube");cube.transform.localPosition.set(0, 0.65, 0);cube.addComponent(MeshRenderer, { mesh: MeshAsset.box(app, { size: 1.3 }), materials: [ember] });cube.addComponent(Spinner, { speed: 120 });await app.start();
compiled by the docs harness

Everything a game needs

Twelve subsystems, one API style, one version number. Add the ones you use.

  • @ignifx/core

    Rendering

    PBR materials, image-based lighting, shadows, bloom and SMAA through Babylon Lite.

    See it
  • @ignifx/core

    Scenes and prefabs

    One JSON format for scenes and prefabs; instances keep their overrides.

    See it
  • @ignifx/core

    Assets

    Addressed, typed, reference-counted, cancellable, and hot-swappable in development.

    See it
  • @ignifx/physics

    3D physics

    Rigid bodies, colliders, triggers, a character controller and queries, on Havok.

    See it
  • @ignifx/physics-2d

    2D physics

    Bodies, colliders, one-way platforms and a platformer controller, on Rapier.

    See it
  • @ignifx/2d

    Sprites and tilemaps

    Atlases from TexturePacker and Aseprite, tilemaps from Tiled and LDtk, pixel-perfect.

    See it
  • @ignifx/3d

    Characters and cameras

    Third- and first-person rigs, an orbit camera that stays out of walls.

    See it
  • @ignifx/3d

    Animation and navigation

    State machines with blend trees on glTF skeletons; navmesh agents on Recast.

    See it
  • @ignifx/input

    Input

    Keyboard, mouse, gamepad and touch become named actions you can rebind at runtime.

    See it
  • @ignifx/audio

    Audio

    A bus tree, positional one-shots, music, and browsers that start locked, handled.

    See it
  • @ignifx/ui

    UI

    Menus, dialogs, toasts, HUD and world-space text, virtual gamepad, translations.

    See it
  • @ignifx/electron

    Desktop

    A hardened Electron window, a typed bridge, and file-system saves. One flag to build.

    See it

Start from a playable game

Four templates, each a small finished game: title screen, pause menu, settings, rebinding, saves, and keyboard, gamepad and touch controls. Copy one and replace the game.

A top-down pixel-art courtyard with stone paths and grass, a character in the centre and lit shrines, with a heads-up display along the top.

2D top-down

A tilemap with collision, Y-sorted props, a dead-zoned camera and shrines to light.

  • Keyboard
  • Gamepad
  • Touch
  • Mouse
Play
A pixel-art dusk landscape: a hill and a treeline behind a grass-topped dirt tilemap, a wooden plank and a brick platform with gold coins hanging above them, the character standing on the left, and a chip in the top corner that reads No coins.

2D side-scroller

Parallax bands, slopes and one-way platforms, coins, and a pixel-perfect camera.

  • Keyboard
  • Gamepad
  • Touch
  • Mouse
Play
A grey tiled courtyard ringed by dark panelled walls under a pale sky: the rigged character stands in the middle among scattered wooden crates, three beacon posts sit around the floor, and a chip in the top corner reads the player's speed and the companion's distance.

3D third-person

A character on a capsule, an orbit camera that avoids walls, an animated rig, a companion.

  • Keyboard
  • Gamepad
  • Touch
  • Mouse
Play
A first-person view across a grey tiled room ringed by dark panelled walls: blue-grey crates and three pedestals stand ahead, a small crosshair sits at the centre of the frame, the view model and its teal prop fill the bottom corner, and a chip in the top corner reads that no pedestals are lit and nothing is in reach.

3D first-person

Walk, sprint, crouch and jump with pointer lock, a view model, and things to push.

  • Keyboard
  • Gamepad
  • Touch
  • Mouse
Play

Built by a studio that ships with it

ignifx is developed by Astrum Forge Studios, an independent game studio, and it is the engine behind the studio's own games and projects. Features arrive because a game needed them, and they stay because a game still does.

astrumforge.com

Get started in a minute

shell
git clone https://github.com/astrum-forge/ignifx.gitcd ignifx && pnpm install && pnpm buildpnpm --filter ignifx-template-3d-third-person dev

ignifx is not on npm yet. Until the first release, clone the repository and run a template from the workspace. Watch the repository to hear when the packages ship.

Read the guide

Runs wherever WebGPU does: Chrome and Edge 113+, Safari 26+, Firefox 141+ on Windows and 145+ on Apple Silicon. Desktop through Electron.