Dual Scripting
Write game logic in Lua or JavaScript — same API, your choice of language. Hot-reload scripts during development.
Dual Scripting
Write game logic in Lua or JavaScript — same API, your choice of language. Hot-reload scripts during development.
Cross-Platform
Build for Windows (DirectX 12 / Vulkan), the Web (WebGPU, WebGL2 fallback) and Android (Vulkan, GLES fallback) from the same project.
Visual Editor
Tauri 2 + Svelte editor with scene tree, inspector, asset browser, viewport gizmos, and undo/redo.
Rust Performance
Powered by wgpu (GPU), hecs (ECS), rapier2d (physics), and glam (SIMD math). Native speed, even on WASM.
Full Game Systems
Physics, audio, animation, tilemaps, particles, lighting, navigation, UI, input actions, event bus, prefabs — batteries included.
Visual Scripting
Behavior Graph — node-based logic editor for building game behaviors without writing code. Zero VM overhead.
Visual Shader Editor
Shader Graph — node-based shader authoring with live preview. Compiles to WGSL, one shader for every backend.
Packages
Extend the engine in Rust: components, systems and script commands in a crate. Around fifty ship with it — see All packages.
AI-Ready
Machine-readable API specs and agent SDK docs let AI assistants create complete games programmatically.
| System | Description |
|---|---|
| Rendering | wgpu sprite batching in z order, texture atlases, meshes, lines, trails, signed-distance-field text, cameras that render to textures, pixel-perfect cameras, sprite masks |
| Lighting | Point, spot, directional and freeform lights, soft shadows from occluders, normal maps, specular, ambient occlusion, toon bands, light cookies, HDR with bloom and tonemapping |
| Post-processing | Bloom, vignette, blur, tilt-shift, light shafts, pixelate, CRT |
| ECS | hecs, with 100+ built-in components and Rust packages that add more |
| Scripting | Luau natively, real Lua 5.3 (Fengari) in the editor and on the web, plus JavaScript on desktop; namespaced API (Transform.get_position) |
| Physics | rapier2d — rigid bodies, colliders, joints, a character controller, raycasts and shape queries, contacts with impulses, fracture, area effects |
| Audio | kira natively, Web Audio in the browser — SFX, music, mixer buses with low-pass and reverb, spatial sound |
| Animation | Sprite sheets, property tweens, skeletons with blending, crossfades, IK and jiggle bones, cloth and rope |
| Tilemaps | Tiled import, orthogonal / isometric / hexagonal maps, autotiling, animated tiles, chunked colliders, A* pathfinding |
| Particles | CPU emitters with drag, turbulence, collision and sub-emitters; GPU particles in the hundreds of thousands |
| Navigation | Baked visibility graphs and agents that path around colliders |
| UI | Entity UI and JSON-defined .gui documents, scaled to any screen and safe area, controller navigation |
| Input | Keyboard, mouse, gamepads (with rumble), multi-touch, on-screen touch controls, action mapping |
| Localisation | String tables as data, plural rules, text that follows the player’s language |
| Visual Scripting | Behavior Graph — node-based logic, sharing the event bus with scripts |
| Shader Graph | Node-based materials compiled to WGSL, one shader for every backend |
| Networking | A lockstep relay for turn-based online play |
| Editor | Tauri 2 + Svelte: scene tree, inspector, asset browser, gizmos, undo/redo, build panel |
-- player.lua — move with the arrow keys, jump with spacelocal speed = 200local jump_force = 400
function init(entity) log("Player ready!")end
function update(entity, dt) local x, y = Transform.get_position(entity)
if Input.is_action_pressed("move_right") then x = x + speed * dt end if Input.is_action_pressed("move_left") then x = x - speed * dt end
Transform.set_position(entity, x, y)
if Input.is_action_just_pressed("jump") then Physics.apply_impulse(entity, 0, jump_force) endend