Bevy 0.19.0 was released on 2026-06-19. Target bevy = "0.19" and validate
against the latest 0.19 patch release. Apply the official migration guide from top
to bottom; this skill prioritizes changes most likely to affect game code and sibling
skills.
First-pass checklist
- Update the engine and every Bevy ecosystem crate together. A crate built on Bevy 0.18 cannot share ECS/assets/render types with Bevy 0.19.
- Rebuild with the project's real
default-featuresand target triples. - Fix resources and broad-query conflicts before chasing secondary system errors.
- Update scenes, text, assets, rendering, lights, and UI focus.
- Regenerate persisted animation target IDs and serialized world data.
- Compile representative examples and exercise native and web/platform builds.
High-impact changes
| Bevy 0.18 | Bevy 0.19 |
|---|---|
#[derive(Component, Resource)] |
Split into distinct types; Resource: Component |
broad query plus Res<T> |
Filter resource entities with Without<IsResource> when appropriate |
init_non_send_resource |
init_non_send |
SceneRoot / DynamicScene |
WorldAssetRoot / DynamicWorld |
old world serialization in bevy_scene |
bevy_world_serialization |
TextFont { font: Handle<_>, font_size: f32 } |
FontSource and FontSize |
TextLayout::new_with_justify |
TextLayout::justify |
LoadContext::loader() |
LoadContext::load_builder() |
custom Reader with AsyncSeekForward |
required Reader::seekable() |
ViewNode and camera render-graph nodes |
systems in Core2d / Core3d schedules |
Replace, on_replace |
Discard, on_discard |
set_executor_kind(ExecutorKind::...) |
set_executor(...) with an executor instance |
light shadows_enabled |
shadow_maps_enabled plus optional contact_shadows_enabled |
Atmosphere on a camera |
separate bevy::light::Atmosphere entity |
public InputFocus.0 |
get, set, and clear methods |
The render-node API is gone, but the top-level non-camera schedule named
bevy::render::renderer::RenderGraph still exists. Do not replace that schedule name
blindly.
Text and scenes
TextFont {
font: asset_server.load("fonts/FiraSans-Bold.ttf").into(),
font_size: FontSize::Px(24.0),
..default()
}
commands.spawn(WorldAssetRoot(
asset_server.load("models/level.glb#Scene0"),
));
Parley/fontique now provide shaping and fallback. Installed-family discovery requires
the system_font_discovery feature. The old serialization system was renamed to make
room for BSN; glTF roots still use WorldAssetRoot, not BSN scene types.
See text and fonts and scene serialization.
Resources and generic queries
Res<T> and ResMut<T> remain the normal APIs. The semantic change is that resource
values live on singleton entities and #[derive(Resource)] also implements
Component. As a result, broad component queries can conflict with resource access or
unexpectedly include resource entities.
fn inspect_entities(
entities: Query<EntityRef, Without<IsResource>>,
settings: Res<GameSettings>,
) {
// ...
}
Do not add Without<IsResource> mechanically to every query; narrow only queries that
are truly intended to inspect ordinary entities. See
resources as components.
Features and ecosystem crates
[dependencies]
bevy = { version = "0.19", default-features = false, features = [
"3d", "ui", "audio"
] }
audiois no longer implied by2d,3d, orui.uiis no longer implied by2dor3d.- Profile collections must be used with
default-features = false; otherwise default features remain enabled by Cargo feature unification. - Native controller events need the
bevy_gilrsbackend when defaults are disabled. bevy_capture 0.6andbevy_hanabi 0.19target Bevy 0.19. Verify every other dependency's declared Bevy version rather than guessing from its crate version.
Other source migrations
InputFocusis initialized byDefaultPlugins. In Bevy 0.19.1, callfocus.set(entity, FocusCause::Navigated); the one-argument 0.19.0 example is patch-stale.- Recalculate serialized
AnimationTargetIdvalues: its hash/ID algorithm changed. - A glTF
#Material0label now returnsGltfMaterial; append/stdfor aHandle<StandardMaterial>when PBR conversion is enabled. - Advanced loads now go through
AssetServer::load_builder; nested loads useLoadContext::load_builder. EasyScreenRecordPluginmanual literals needoutput_dir;..default()already supplies it.FeathersPluginbecameFeathersCorePlugin, whileFeathersPluginsremains the plugin group.
See rendering, assets, and APIs.
Validate the migration
cargo check --all-targets
cargo test
cargo tree -d | rg 'bevy(_| )'
Treat duplicate Bevy majors/minors as a compatibility problem, not harmless Cargo
noise. Also build every supported feature profile and target; a default desktop build
does not validate default-features = false or WASM.