Bevy 0.20 Drops Its Own Shader Dialect for WESL and Lists 75 Migration Items
Software / news
Bevy 0.20 Drops Its Own Shader Dialect for WESL and Lists 75 Migration Items
Custom shaders must be renamed from .wgsl to .wesl, scene syntax changes again, and the pathtraced Solari renderer reaches macOS without a denoiser.

Bevy 0.20 shipped on October 8, 2026 with 817 pull requests from 227 contributors, according to the project's release post. The cost of upgrading is the story: the engine removed its own shader dialect, changed its scene syntax and flattened its pointer events, and the migration guide lists 75 items.
The release is tagged v0.20.0 on GitHub, where the notes link to a diff against v0.19.1. The release post says it credits 227 contributors in one place and 226 in another.

WESL replaces Bevy's shader preprocessor
The largest break is in shaders. Bevy had its own extended dialect of WGSL, the WebGPU shading language, built on a preprocessor. In 0.20 that is gone. The post says custom shaders "need to be translated to WESL and renamed from .wgsl to .wesl", and adds that "plain WGSL files with no preprocessor directives will keep working."
WESL describes itself on wesl-lang.dev as "lightweight extensions to the WebGPU shading language" and "a strict superset of WGSL", adding imports, conditional compilation and packages. The page lists no game engines among its adopters, so Bevy is moving onto a standard whose own site does not yet name it.
The migration guide spells out the mechanics. #define_import_path is removed. Imports end with a semicolon and come first in the file. Module paths change, so bevy_pbr::mesh_view_bindings becomes bevy_pbr::render::mesh_view_bindings. @if, @elif and @else replace the old #ifdef family, and the shader_format_wesl Cargo feature disappears because WESL is always on. GLSL support is removed.
BSN changes again, and the file format is next
BSN, Bevy's scene notation, arrived in 0.19. This release changes its syntax in ways that break written scenes. Scene references need an @ prefix, list entries are separated by -- instead of commas, and enums must specify every field now that VariantDefaults is gone. The post says the syntax "should largely be nailed down" and that a .bsn file format is the next step.
| Change | Before 0.20 | In 0.20 |
|---|---|---|
| Scene references | no prefix | @ prefix |
| Entities in lists | commas | -- |
| Enum fields | defaulted per field | all fields specified |
| Pointer events | Pointer<Press> | PointerPress |
Two other items from the guide can change how a scene looks without a compile error. ScreenSpaceTransmission is no longer a required component of Camera3d, so it is off by default, and Tonemapping::None is now a full passthrough.
Solari on macOS, DLSS and the hardware catch
Solari, Bevy's realtime pathtraced renderer, now runs on macOS through Metal. The post is direct about the gap: "there is currently no built-in denoiser included in bevy_solari for macOS." It floats MetalFX Ray Reconstruction as a possible fix.
On Nvidia hardware, the dlss_wgpu crate moves to DLSS-RR 4.5. Anyone upgrading must download the newest DLSS SDK or hit compiler errors, and Solari users who relied on ReSTIR, a light-sampling technique, must turn it back on with SolariLighting::restir, since it is now off by default. Mesh shaders also landed, but "are not supported on web platforms".
The engine team's one speed table is for despawn_all, measured on an AMD Ryzen 9 9950X3D, median of five runs. These are the project's own figures and no independent party is named as having reproduced them.
- 100 entities1.3 x
- 1,000 entities1.65 x
- 10,000 entities1.7 x
- 100,000 entities1.53 x
Source: Bevy 0.20 release post, project-supplied, accessed 2026-10-09
At 100,000 entities the post lists 3.17 ms for despawn and 2.07 ms for despawn_all.
Who pays for the upgrade
A project with stock materials and no custom shaders moves over mostly by renaming. A project with a library of #import shaders has to rewrite each file and re-test it, and a project that has authored BSN scenes by hand has to edit them. The post did not state a minimum supported Rust version, and the guide text this report read did not either; check Cargo.toml before bumping. For Rust-side context, see our reports on Rust GPU kernels for CUDA and Rust 1.99.

The next dated step is the .bsn file format, which the post says follows now that the syntax has settled. It gives no release date.
Sources
- 04WESL
More in Software
- 01Linux 7.3 Ships With 18,765 Commits, a Filesystem That Fails Everything and Per-Cgroup BPF SchedulersLinus Torvalds released the kernel on Oct. 18 after a final week he called uneventful, with the biggest figures coming from storage and memory fixes.
- 02KiviDB Claims 21.2 Million GETs a Second, but Its Own Table Has Dragonfly Ahead Without PipeliningThe Rust, AGPL-licensed Redis-compatible store has 208 GitHub stars, no named authors and a benchmark run by its own company.
- 03Google Research's Harness2 Has 10,700 Stars and Three Commits, and Publishes No Absolute ScoresThe recursive agent-harness framework reports gains of up to 11.8 percentage points, but its README and arXiv page give no baselines, no cost per run and 16 open bugs.
- 04Deno Gets 12 Months of Releases and Deploy Gets Six After Cloudflare Deal, and Two Forks AppearFeature pull requests are being closed unmerged, and the community fork called Ende wants to drop the Node compatibility that Ryan Dahl now calls a constraint.