
New Working Groups: WESL, First-Party Tilemaps
2025-05-05
A number of new working groups have been created, alongside progress from existing groups!
The Bevy WESL-ification has begun! or rather, the working group to figure out what migrating would look like and do some testing has been created. Will WESL be enough for Bevy's needs? Tune into the working group to find out.
WESL (pronounced "weasel") is an extended version of WebGPU’s WGSL shading language that is fully compatible with WGSL. It also contains a number of features Bevy needs already, including imports, so is a potentially great choice to participate in the wider WebGPU ecosystem if it works out.
A new Tilemap Rendering working group has also started up, focusing on a rendering abstraction for 2d tilemaps. #18866 is the first work-in-progress PR to come out of the working group.
The bevy_cli: please clap
working group has also produced bevy_lint
0.3.
The Bevy Linter is a custom linter, like Clippy, that checks for Bevy-specific idioms, optimizations, and footguns. 0.3 brings 2 new lints, Bevy 0.16 support, a Github Action for installing the linter in CI, documentation improvements, and more!

Showcase
Bevy work from the #showcase channel in Discord and around the internet. Use hashtag #bevyengine.

Cosmos
showcase
Cosmos is a game where you can create your dream spaceship that you can pilot through space. This showcase demos in-progress space stations.



Planet Level of Detail
showcase
This is a seamless progressive LOD in a fully procedurally generated planet. The video demonstrates this by first viewing a small truck in a ditch before zooming out to show the entire planet.

Shadow Sneak
showcase
Hide yourself in the shadows in order to avoid the knights in Shadow Sneak! Shadow Sneak is a game jam entry that makes use of the difference of gaussians crate also mentioned in this issue.


Boidsy: Flocking Simulation
showcase
Boidsy is a real-time 2D and 3D boid (flocking) simulation. It showcases emergent behavior through local rules such as alignment, cohesion, and separation. It takes advantage of bevy_spatial.

10000+ units over UDP
showcase
This is a research project/proof of concept replicating thousands of units over UDP using bevy_replicon as the base replication framework and renet as the transport layer, all on an unreliable channel. Current goals of the project are:
- Increase update rate on important (visible) units
- In theory this should then allow for a more realistic & rigid crowd simulation

Streaming Video Assets: Big Buck Bunny
showcase
Playing Big Buck Bunny by only loading a few frames at a time, keeping the memory used under control and initial load instant. This is a demo of functionality in vleue_kinetoscope.

Pop Mania!
showcase
Pop Mania! is a new casual, 2d physics-based iOS game. Shoot balls down to prevent enemies from reaching the end!

Data driven dialogue engine
showcase
An early look at a data-driven dialogue system for Bevy. It supports variables, conditionals (if/else/match), input, output and more. There is a completely custom working runtime, which can evaluate expressions, format fstrings, and more. All while supporting hot reloading. It is designed to also support animation instructions, which are planned. Meaning it is not just for dialogue, but you can actually script visual novel in this. (It also uses Bevy Lunex for positioning)


Extended Difference of Gaussians
showcase
The difference of gaussians (that is, subtracting one blurred version of an image from another less blurred version of an image) can be used for edge detection and extensions to this approach can be used to create stylized images.
This showcase recreates an implementation from Acerola (Unity) for Bevy with a couple of effects.


Warhammer: Dark Omen
showcase
A Warhammer: Dark Omen implementation in Bevy. This week brings a number of updates, including
- Rank changes
- animation variations for units
- unit formations
- scriptable lua-based campaign mode, including meeting points, travel map, battles, and debriefs


Lumina on Itch!
showcase
Lumina, a top down, fast paced, objective based, PvP game, showcased at Malaysia's Indie Jam event.
You can check out the gameplay on YouTube and give it a play over on Itch.io

Crates
New releases to crates.io and substantial updates to existing projects

Bevy Color VSCode extension
crate_release
Bevy Color is an extension for VS Code to preview colors declared in rust files using the Bevy game engine. It also allows adjusting them with the integrated color picker.

Yarn Spinner for Rust 0.5.0
crate_release
bevy_yarnspinner is the Bevy plugin for the Rust port of Yarn Spinner, the friendly tool for writing game dialogue.
In 0.5, Yarn functions can now be regular Bevy systems! This means that your functions can query the ECS directly.
Dialogue like this:
<<if get_player_money() < 3>>
Shopkeeper: Sorry, you don't have enough cash on hand
<<else>>
Shopkeeper: Pleasure doing business with you!
<<subtract_money 3>>
<<endif>>
===
Can be powered by a function like this:
fn get_player_money(
wallet: Single<Wallet, With<Player>>
) -> usize {
wallet.available_money()
}
simple_bevy_template
crate_release
simple_bevy_template is a Bevy game template that automatically sets up fast-compiles, including Mold, Cranelift and parallel compiler frontend.
cargo generate laundmo/simple_bevy_template --allow-commands
If you don't have cargo-generate, you can get it here.

bevy_ratatui_camera 0.13.0
crate_release
Render your bevy app to the terminal using ratatui.
Recent features include:
- Subcameras and transparency support for compositing cameras together.
- Edge detection now works for all text conversion strategies
- Support for terminals with limited color support: 16-color, 256-color, and true-color options
bevy_app_compute
crate_release
bevy_app_compute attempts to improve the experience of developing compute shaders for Bevy applications.
bevy_rand v0.10
crate_release
Bevy Rand is a plugin to provide integration of rand ecosystem PRNGs in an ECS friendly way.
0.10 brings improved developer experience due to relations, observers, and a new commands-based API; resulting in less boilerplate. It also implements no_std support.

bevy_sun_move
crate_release
bevy_sun_move
is a utility crate that supports the new Atmosphere functionality in 0.16.
- Calculate physically correct sun trajectory to achieve desired day lengths, night lengths, and maximum sun heights (noon altitude). This allows you to quickly specify game timings (like day/night cycle duration and peak sun height) while ensuring a physically plausible sun trajectory on the sky.
- Animate a directional light (the "sun") across the sky based on astronomical principles (latitude, year fraction, time of day). (For example sun does not always rise in the east:D)
let timed_sky_config = TimedSkyConfig {
sun_entity: sun_id,
day_duration_secs: 10.0,
night_duration_secs: 5.0,
max_sun_height_deg: 60.0,
planet_tilt_degrees: 23.5,
..default()
};
commands.spawn((
SkyCenter::from_timed_config(&timed_sky_config).unwrap(),
));
bevy_flair v0.2
crate_release
Bevy Flair enables developers to style Bevy UI interfaces using familiar CSS syntax.
bevy_lint 0.3.0
crate_release
The Bevy Linter, a project built as part of the bevy_cli: please clap
working group! bevy_lint is a custom linter, like Clippy, that checks for Bevy-specific idioms, optimizations, and footguns. 0.3 brings 2 new lints, Bevy 0.16 support, a Github Action for installing the linter in CI, documentation improvements, and more!
View the release page for installation instructions
bevy-butler 0.6.1
crate_release
bevy-butler is a set of procedural macros for reducing boilerplate and making Bevy plugins and systems more self-documenting.
0.6.1 changes up a LOT of the macro syntax, since custom parsing code has been replaced with deluxe to simplify implementations in the future.
crowdsim 0.1.0
crate_release
A multiplayer crowd simulation binary crate that is barebones with minimal dependencies.
Documentation is in-progress
immediate_stats
crate_release
Game stats that reset every frame, inspired by immediate mode rendering.
bevy_fix_gltf_coordinate_system
crate_release
A tiny plugin to fix the fact that Bevy does not respect the GLTF coordinate system.
use bevy::prelude::*;
use bevy_fix_gltf_coordinate_system::prelude::*;
App::new()
.add_plugins(DefaultPlugins)
.add_plugins(FixGltfCoordinateSystemPlugin);
glTF uses +Z as forward, while Bevy uses -Z. However, the glTF importer ignores this fact and pretends that glTF and Bevy use the same coordinate system. The result is that all glTFs imported into Bevy are rotated by 180 degrees. This plugin fixes that.
This fix may be upstreamed in the future perhaps by you?

bevy_blockout
crate_release
bevy_blockout is a triplanar blockout texture made from a combination of The Best Darn Grid Shader Yet and some simple checkerboards.
The blockout material is a StandardMaterial extension, which means you can set whatever color, reflectance, etc variables you want. Its usable directly in bevy as well as in editors that use reflection data using a special component with hooks that consume a StandardMaterial and create the extension.
wasvy
crate_release
wasvy is a bridge between Bevy and the WASM component model. You can create new components and register systems from a WASM component and doing it is as simple as adding another plugin to your game!
The crate is currently in alpha-status

Educational
Tutorials, deep dives, and other information on developing Bevy applications, games, and plugins
Intro to Relationships in Bevy 0.16
educational
A followup to How to spawn objects in Bevy 0.16, this is an introduction to the new Relationships by examining some of the ChildOf/Children behavior and then a custom Inventory example
Hooks and Observers in Bevy 0.16
educational
A video covering using Component Hooks and Observers. This is more beginner focused and covers using them rather than implementation details.
Update spin requirement from 0.9.8 to 0.10.0 authored by mnmaita
Removed conversion from pointer physical coordinates to viewport local coordinates in bevy_picking make_ray function authored by KrzysztofZywiecki
bevy_reflect: Re-reflect `hashbrown` types authored by MrGVSV
Fully qualify crate paths in `BevyManifest` authored by jnhyatt
Fixes #15389, added docs to RawHandleWrapper::_window field authored by mhsalem36
Added derive Reflect to UntypedHandle and UntypedAssetId authored by fredericvauchelles
Make `AccessConflicts::is_empty` public authored by angelthorns
fix new nightly lint on mikktspace authored by mockersf
Fix a few subcrate import paths in examples authored by rparrett
Change the default visual box for `OverflowClipMargin` to `PaddingBox` authored by ickshonpe
Expose deferred screen edges setting for ios devices authored by yonson2
Add a method to clear all related entity to `EntityCommands` and friends authored by Brezak
Audio sink seek adopted authored by taj-holliday
Want to contribute to Bevy?
Here you can find two types of potential contribution: Pull Requests that might need review and Issues that might need to be worked on.
Pull Requests Opened this week
Expose a new function for ViewTarget and MainTargetTextures authored by aojiaoxiaolinlin
Allow entities to be added to a relationship using the new spawn api authored by Freyja-moth
Fix occlusion culling not respecting device limits authored by greeble-dev
Platform-specific docs about the web's CursorGrabMode authored by jf908
Rename Events<E>::send methods to Events<E>::write. authored by shwwwa
refactor ui/borders example to use new children! macro authored by ChristopherBiscardi
Remove upcasting methods + Cleanup interned label code authored by tim-blackbird
UI render graph setup refactor authored by ickshonpe
Distinguish .target() and .target in Trigger<Pointer<E>> authored by Zeophlite
Strip unused features from `bevy_asset` dependencies authored by bushrat011899
Add `get_attributes_mut` for `Mesh` authored by hukasu
Add 'observe_target' method to 'RelatedSpawner' authored by Glory2Antares
Remove `parking_lot` from `bevy_asset` and `bevy_macro_utils` authored by bushrat011899
Force all components of an entity that had `Disabled` removed to be marked as changed authored by hukasu
Make SystemChangeTick Clone authored by cBournhonesque
Improve visibility of debug picking node authored by benfrankel
Improve error for when you try running a one-shot system with wrong `SystemId` type authored by hukasu
Expose CustomCursorUrl authored by UkoeHB
Fix `rotate_by` implementation for `Aabb2d` authored by kyon4ik
Sprite picking docs fix authored by akimakinai
Add support for OpenType features in text (e.g. ligatures, smallcaps) authored by hansler
Add TextureAtlas convenience methods authored by mnmaita
Update `sysinfo` version to `0.35.0` authored by GuillaumeGomez
Prevent exclusive systems from being used as observers authored by chescock
Procedural Atmosphere PBR integration authored by mate-h
Ignore RUSTSEC-2023-0089 until postcard is updated authored by Zeophlite
Fixed memory leak in bindless material authored by SarthakSingh31
Allow using `RenderPlugin` and `WinitPlugin` with `WindowPlugin` being disabled authored by hukasu
Change datastructure in Components authored by Trashtalk217
Allow entities to be added to a relationship using the new spawn api (remade) authored by Freyja-moth
Track spawn `Tick` of entities, offer methods, query data `SpawnedTick` and query filter `Spawned` authored by urben1680
Issues Opened this week
Gamepad input example doesn't detect buttons, only some axes authored by Blechlawine
New atmosphere crashes if hdr: true is not specified authored by Sigma-dev
Lagging bevy window while dragging it (Windows) authored by Arleo-dev
Implementation of `rotate_by` on `Aabb2d` is incorrect authored by kyon4ik
Only one `BindlessMaterial` gets rendered at a time when sharing image handles. authored by herbertgithubaccount
Mesh not showing(or updating) in alter_mesh example authored by dearfl
Rename Events<E>.send() to Events<E>.write() authored by shwwwa
Trigger `OnRemove` has conflict result with `Has` authored by tnthung
Debug picking is drawn at Z index 0 authored by benfrankel
SSAO+SSR produces shadow artifacts. authored by starwolfy
Entities spawned with `Disabled` do not render when `Disabled` is removed authored by Henauxg
Wasm build hits panic on unwrap in `specialize_material_meshes` authored by janhohenheim
Tracking Issue: `no_std` for `bevy_asset` authored by bushrat011899
Corrupted rendering with Integrated Intel GPUs + Vulkan + Indirect authored by jf908
Add a first query filter authored by Freyja-moth
StandardMaterial::emissive units not documented authored by JMS55
No instructions on building for Android or iOS under examples/mobile authored by steven-johnson
There is no viable alternative to `HierarchyEvent` authored by Zeenobit
#[reflect(opaque)] remote type fails to register at runtime, making ReflectSerializer unusable authored by chengts95
`Entities::resolve_from_id` of freed entity makes `Entities::contains` return `true` authored by urben1680
`System` should be an `unsafe trait` authored by ItsDoot
"Always Strong" Asset Handles / Remove asset weak handles authored by andriyDev
Adding the same asset label multiple times to `LoadContext` does not return an error. authored by andriyDev
WebGPU Example 3D Rendering / Texture has error in the WebGL2 version authored by Drvanon
Web Builds hosted on Itch.io return 403 for invalid asset paths rather than 404 authored by QueenOfSquiggles
Window freezes when `FileDragAndDrop` Event is triggered in the `drag_and_drop` example authored by jakemoran
3D WGPU Rendering not working with Vulkan ? authored by sambrus
Performance quickly drops when using `get_mut` on `Assets<StandardMaterial>` authored by hukasu
Update the `accesskit_winit` dependency for `bevy_winit` to `0.26` authored by LikeLakers2
Allow for multiple relationships on one component authored by Freyja-moth
Option::unwrap panic in `specialize_material2d_meshes` authored by fatho