
One Rust engine for games, apps, websites and terminals.
Write it once. Keel renders it natively on desktop, web, Android and iOS, with no WebView in between, and your agents build it, see it, film it and replay it from the command line.
- 98Lighthouse performance of this page on mobile, 2026-09-28
- 175 KiBtransferred to load this page, before any interaction
- No WebViewKeel draws every pixel itself on desktop, Android and iOS
- Built with KeelExplore Cubeage's games →
Your agent can see, film, script and replay every scene.
An agent can't look at a window, so Keel gives it files and exit codes. One command captures a scene, films it, plays a script through it or replays a recording to the first frame that differs.

One scene as a PNG, with a report of its colours and coverage. It exits 1 on a panic, a blank frame or an error in the log. Wrote physics.png.
Every file here was written by one run of scenes/posters.sh on 2026-10-31, on AMD EPYC 9454 48-Core Processor, drawing with llvmpipe (LLVM 15.0.6, 256 bits) (vulkan), software, Keel 154fcc8ee. Same code, same pixels: 8 of 10 scenes drew byte-identical frames in two smoke runs.
One codebase. Three kinds of software.
The same Rust Component runs as a game, an app and a website, on six platforms. On the left is its whole source, the same code this page runs. On the right, three ways it comes out.
pub(crate) fn counter_view(props: &CounterProps) -> Component {
let count = signal(props.start);
let label = count.map(|n| match n {
1 => "1 launch".to_string(),
n => format!("{n} launches"),
});
div("counter", "counter")
.child(text(label).id("count").surface("count"))
.child(button("Launch").id("launch").on_press(move |_| {
count.update(|n| *n += 1);
}))
}A counter: a signal, a label that reads it, a button that changes it. Only the text that reads the signal updates.

A game scene: rigid bodies stepped at a fixed rate. Run one live in the gallery below.
Keel's nightly CI builds an example app for each of these platforms. It launches and screenshots the app on Linux, on macOS and in Chrome, and on the iOS simulator when the runner can boot one. Android and Windows builds are packaged and checked without being run yet.
NativeLinux, Vulkan: keel shot
BrowserChrome, WebGL2: this pageEverything a game or app is made of.
Press Run to start any scene; it pauses when you scroll away.

Rendering
Physically based materials from mirror to matte, lit by moving coloured lights, with bloom and filmic tone mapping.

Fluids
Position-based fluid particles, simulated every frame.

Animation
Springs and tweens drive motion with physical feel.

Physics
Rigid bodies and colliders from Rapier, stepped at a fixed rate. Click to drop a ball.

UI kit
Layout, text and controls drawn by the engine itself.

Audio
Press a pad and the engine's mixer plays its note, through Web Audio in the browser.

Networking
Rollback netcode: two peers, 120 ms apart, staying in sync.

World building
Layered noise shapes an island that rises out of the sea; the same seed builds the same world.
Measured, not claimed.
Every number names the run that produced it. The scene numbers come from the keel command line running this page's own scenes headless (scenes/posters.sh); the Lighthouse numbers from the last check of the live page after a deploy.
Lighthouse on this page
Performance, mobile, median of 3 runs against keelengine.dev on 2026-09-28 (post-deploy run 36468414441). Accessibility, best practices and SEO scored 100.
Page weight
Transferred to load this page, from the same run.
To open a scene
Median time to enter a scene and have it ready to draw, across all 10 scenes; the slowest took 2.6 ms (keel smoke).
Same code, same pixels
Scenes that drew byte-identical frames in two separate runs of 120 frames each. The clock is simulated, so a replay is exact.
Scene numbers measured 2026-10-31 with keel smoke on a server processor (AMD EPYC 9454 48-Core Processor) drawing with a software renderer (llvmpipe (LLVM 15.0.6, 256 bits) (vulkan), software), Keel 154fcc8ee; 10 of 10 scenes ran 120 frames clean. These are not numbers from a phone or a graphics card; none are published yet.
Where Keel leads Unity, Godot and Bevy, and where it trails.
One codebase for games, apps and websites, and agents that can see, film, script and replay every scene, against a much smaller community, no editor and no console export yet.
- Real HTML websites, as well as games and apps:
- Native on desktop and mobile, no WebView:
- Agent commands in the engine (shot, film, listen, play, replay):
- Rust end to end:
- Visual editor (Keel has none, by design):
- Console export:
- Large public community:
- — means the project's public pages do not say, so the cell is left unmarked. Keel's cells are checked against its own capability list.
Keel and Unity
Unity centres on a visual editor and a C# runtime. Keel is code-first Rust, compiled natively.
Keel and Godot
Godot has a scene editor, its own scripting language and no licence fee. Keel has no editor and is licensed by agreement.
Keel and Bevy
Bevy is also a Rust ECS engine, with a much larger community. Keel is newer.
Game clients and the site you are reading.
Cubeage builds game clients with Keel. This website runs on the same engine, from HTML pages to live 3D scenes.
Big Two and mahjong with Cubeage
Cubeage is developing Keel clients for Hong Kong and Taiwan Big Two and Taiwan 16-tile mahjong. Explore the publisher's games and store listings.
See the games at cubeage.com →This site
Keel pages, Keel scenes, Lighthouse 98 on mobile. Every page you are reading is a Keel Component rendered to HTML.
See the numbers →Build your next game, app and site on Keel.
Keel Engine is licensed to teams by agreement. Tell us what you're building: write to us, and we'll talk about a license.