Interactive Typst content creator using Vello and Bevy.
Rust
270
107 commits
updated Sep 22, 2026
Interactive Typst content creator using Vello and Bevy.

Associated example here!
Velyst renders Typst content using Typst functions.
This example shows you how to render a simple white box in the center of the screen.
To get started rendering a simple box, create a function inside a .typ file:
#let main() = {
place(center + horizon)[
#box(width: 10em, height: 10em, fill: white)
]
}
Then, in your .rs file, load your Typst asset file and register your function.
use bevy::prelude::*;
use bevy_vello::prelude::*;
use velyst::prelude::*;
fn main() {
App::new()
.add_plugins((
DefaultPlugins,
bevy_vello::VelloPlugin::default(),
velyst::VelystPlugin,
))
.register_typst_func::<MainFunc>()
.add_systems(Startup, setup)
.run();
}
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn((Camera2d, VelloView));
commands.spawn((
VelystFunc::new(
asset_server.load("typst/box.typ"),
MainFunc::default(),
),
WorldScene::default(),
));
}
typst_func!(
"main",
#[derive(Default)]
struct MainFunc {},
);
Associated example here!
Velyst is also compatible with bevy_ui interactions.

Associated example here!
You can join us on the Voxell discord server.
velyst is dual-licensed under either:
This means you can select the license you prefer! This dual-licensing approach is the de-facto standard in the Rust ecosystem and there are very good reasons to include both.
Rust
100.0%
Interactive Typst content creator using Vello and Bevy.
Rust
270
107 commits
updated Sep 22, 2026
Interactive Typst content creator using Vello and Bevy.

Associated example here!
Velyst renders Typst content using Typst functions.
This example shows you how to render a simple white box in the center of the screen.
To get started rendering a simple box, create a function inside a .typ file:
#let main() = {
place(center + horizon)[
#box(width: 10em, height: 10em, fill: white)
]
}
Then, in your .rs file, load your Typst asset file and register your function.
use bevy::prelude::*;
use bevy_vello::prelude::*;
use velyst::prelude::*;
fn main() {
App::new()
.add_plugins((
DefaultPlugins,
bevy_vello::VelloPlugin::default(),
velyst::VelystPlugin,
))
.register_typst_func::<MainFunc>()
.add_systems(Startup, setup)
.run();
}
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn((Camera2d, VelloView));
commands.spawn((
VelystFunc::new(
asset_server.load("typst/box.typ"),
MainFunc::default(),
),
WorldScene::default(),
));
}
typst_func!(
"main",
#[derive(Default)]
struct MainFunc {},
);
Associated example here!
Velyst is also compatible with bevy_ui interactions.

Associated example here!
You can join us on the Voxell discord server.
velyst is dual-licensed under either:
This means you can select the license you prefer! This dual-licensing approach is the de-facto standard in the Rust ecosystem and there are very good reasons to include both.
Rust
100.0%