Syrillian is a magically simple 2D & 3D game engine in Rust. Built to feel frictionless while staying flexible. ✨
The goal is straightforward: simple high-level code, less boilerplate, more support.
If you like Rust because it’s high-level, clean, and safe, Syrillian tries to match that.
Syrillian is intentionally opinionated about one thing: Building your world should feel great!
That means:
- You can "just start" without learning hundreds of concepts first.
- Everything should look like simple, high-level Rust code.
- You shouldn’t need ages to get a window, a camera, and a cube.
- You should feel great settling into Syrillian, coming from Unity or Unreal Engine.
Syrillian is still actively evolving. Expect ongoing progress, occasional breaking changes, and a few “this will get nicer soon” spots as the API and features settle.
If you like the direction (especially the focus on simplicity), a ⭐ on the repo genuinely helps a lot. It makes the project more visible and keeps momentum going. Thanks for supporting it!
This project scopes far beyond what's usually done or expected in Rust to get all the simplicity and the cleanest Developer Interface possible.
A dedicated GUI editor is also underway.
cargo add syrilliangit clone https://github.com/Syrillian/syrillian.git
cd syrillian
cargo run --example my-mainYou’ll get a window with a pre-made rendered scene, we use for testing new features.
(NixOS folks: there are development flakes in the repo.)
This is the kind of setup Syrillian aims for: clear, tiny, and easy to extend.
use std::error::Error;
use syrillian::{AppState, CubePrefab, World};
use syrillian::SyrillianApp;
use syrillian_components::CubePrefab;
#[derive(Debug, Default, SyrillianApp)]
struct YourGame;
impl AppState for YourGame {
fn init(&mut self, world: &mut World) -> Result<(), Box<dyn Error>> {
world.set_window_title("Syrillian: hello cube");
world.new_camera();
// Spawn a couple cubes in a row.
for x in -2..=2 {
world.spawn(&CubePrefab::default()).at(x * 2, 0, -10);
}
world.print_objects(); // scene hierarchy to console
Ok(())
}
fn update(&mut self, _world: &mut World) -> Result<(), Box<dyn Error>> {
// Per-frame game logic goes here.
Ok(())
}
}Yes. This is the only code in the project to get a working application.
That’s it.
You’ve got ✨ a runtime, a multi-threaded world and renderer, and a scene you can iterate on ✨
Syrillian tries hard to ship useful tools so you can focus on game code:
- A "just get it started" workflow with a heavy focus on user-side simplicity.
- A growing set of presets (components / prefabs / compatibility helpers).
- Meshes + physics, plus visual debugging features.
- Game objects that are builder-extensible, so spawning + configuring stays smooth.
- Solid open-source foundations:
- Physics integration via Rapier
- Rendering abstraction via wgpu (Vulkan / Metal / DirectX + web via wgpu)
- Clean windowing and native input via winit
- Controller support by gilrs
An animated rabbit, in a multi-light scene.
Picking up a physics-enabled cube with an animated shader that emits a light source. From this example: syrillian_examples/examples/my-main.rs
You can request your own visuals too
Planning lives in GitHub Issues (including epics): Issues here
Contributions are welcome, especially anything that improves the "simple, fun, frictionless" feel:
- Open an issue (bug, idea, API rant, feature request; all welcome).
- Discuss options and direction.
- Send a PR if you want.
Before pushing, please run:
cargo fmt
cargo clippy --workspace --all-targets --features derive
cargo test --workspaceThis started as a hobby project (a personal gem), with hundreds of hours of solo development before early contributors showed up. It’s not monetized, and it’s not built for monetization.
If you possess the ability to make it better, more stable, and easier to use come join us.
Community: join us on Discord 👉 https://discord.gg/hZWycSwSm4
Syrillian Engine is distributed under the MIT License. See LICENSE for details.
Syrillian Engine ❤️ Building the backbone of your next great 2D & 3D experiences.

