About bevy
bevy is a routing skill for working on Bevy 0.20 projects. It directs developers to focused sibling skills for engine topics and highlights version-specific patterns and migration pitfalls.
Key features
- 01Routes tasks to focused Bevy skills
- 02Covers core engine and ECS topics
- 03Lists migration skills for older versions
- 04Highlights Bevy 0.20 API changes
- 05Provides guidance on common pitfalls
Use cases
- 01Find relevant guidance for a Bevy task
- 02Check patterns before writing Bevy 0.20 code
- 03Review changes when upgrading from earlier versions
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ chrisgliddon/ bevy-skills --skill bevyAfter installing, type/bevyin Claude Code to confirm it loaded.
Details
From the project READMEBevy 0.20 — Router
Read this first when working on a Bevy project. All sibling skills assume Bevy 0.20 (0.20.0 released 2026-10-08; current patch 0.20.1, requires rustc 1.97.1). If the user's Cargo.toml pins a different version, stop and confirm before applying patterns from this collection.
Smallest valid app
use bevy::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.run();
}
fn setup(mut commands: Commands) {
commands.spawn(Camera3d::default());
}
When to use which skill
| Task | Skill |
|---|---|
App / Plugin / Schedule basics, Update vs FixedUpdate, exclusive systems (&mut World anywhere in 0.20) | bevy-core-concepts |
#[derive(Component)], #[require(...)], observers (On<E>, On<Add<T>>), hooks (on_add/on_discard), storage | bevy-ecs-components |
Query, With/Without/Or, Changed/Added, par_iter, iter_many(..).matched(), query lenses | bevy-ecs-queries |
SystemParam, SystemSet, .run_if, ordering, .chain_weak(), remove_systems_in_set | bevy-ecs-systems |
Cargo.toml features: 2d/3d/ui, *_api, bevy_curve, compressed_image_saver*, WASM trim | bevy-cargo-features |
Upgrading from 0.19 — On<Add<T>>, PointerClick, Hovered/Pressed, WESL, set_if_different | bevy-migration-0-19-to-0-20 |
Upgrading from 0.18 — FontSource/FontSize, bevy_world_serialization, resources-as-components | bevy-migration-0-18-to-0-19 |
Upgrading from 0.17 — MessageReader, On, RenderTarget, GlobalAmbientLight | bevy-migration-0-17-to-0-18 |
AssetServer, Handle<T>, load_builder, hot-reload, WorldAssetRoot for glTF scenes | bevy-assets |
Writing an AssetLoader (Reader::seekable is required) | bevy-custom-assets |
| WASM build pipeline, WebGPU vs WebGL2 | bevy-wasm-webgpu |
Camera3d, Projection, RenderTarget component, Tonemapping::Linear, ScreenSpaceTransmission, FreeCamera, PanCamera | bevy-cameras |
StandardMaterial, MaterialPlugin<M>, AsBindGroup, WESL custom shaders, lighting, atmosphere | bevy-pbr-materials |
GPU particles (bevy_hanabi), Gaussian splats, flipbooks, custom VFX materials | bevy-vfx |
AnimationPlayer, AnimationGraph, AnimationTransitions, AnimationMask, AnimationEvent, easing curves | bevy-animation |
Recording a camera to MP4 or PNG sequences (bevy_capture) | bevy-capture |
Voxel meshing with block-mesh-rs, chunk pipeline, greedy quads | bevy-voxel-pipeline |
| RON block definitions, palette, KTX2 atlas baking | bevy-voxel-data |
Rebindable actions, entity Gamepads, hot-plug, deadzones, Steam Deck, input into FixedUpdate | bevy-input-actions |
AudioPlayer, PlaybackSettings, AudioSink, spatial listeners, mix groups, browser unlock | bevy-audio |
| Rapier bodies, colliders, fixed-step ordering, events, scene queries, joints, determinism | bevy-physics |
| Built-in vs external/headless rendering, forward vs deferred, render systems | bevy-rendering |
DiagnosticPath, DiagnosticsStore, info_span!, RenderDiagnosticsPlugin, CPU/GPU timings | bevy-diagnostics-profiling |
| Stable IDs, versioned save DTOs, atomic native/browser writes, snapshots | bevy-save-load |
Deterministic App::update stepping, TimeUpdateStrategy, MessageCursor, headless tests | bevy-testing |
| Screen readers, adaptive controllers, remapping, captions, contrast, motion safety | bevy-a11y |
| Voxel edit → remesh runtime: dirty/halo fan-out, revision tokens, bounded uploads | bevy-voxel-runtime |
es-fluent-manager-bevy i18n — FluentText<T>, BevyFluentText, LocaleChangeEvent, i18n.toml | bevy-fluent |
Node, ui_widgets::Button + Hovered/Pressed, children![], TextFont/FontSize, Val::Em, Node::border_radius, InputFocus | bevy-ui |
| Porting from Unity, Unreal, Godot, Phaser, Flash, Defold, Roblox, GameMaker | bevy-porting |
Detecting copy-paste / near-duplicate Rust code before committing (similarity-rs --cross-file) | similarity-rs |
Cardinal rules (every Bevy 0.20 task)
- Events are messages.
EventReader<E>/EventWriter<E>becameMessageReader<M>/MessageWriter<M>in 0.17. Observers useOn<E>, neverTrigger<E>. - Lifecycle observers carry the bundle on the event.
On<Add<Player>>, notOn<Add, Player>(changed in 0.20).ReplacebecameDiscardin 0.19. - Pointer events are flat.
On<PointerClick>,click.pointer.position; notOn<Pointer<Click>>(0.20). - UI interaction is
Hovered+Pressed.ui::Interactionandui::widgets::Buttonare deprecated in 0.20; spawnui_widgets::Button. - Text is
FontSource+FontSize.TextFont { font: handle.into(), font_size: FontSize::Px(24.0) }(0.19). Default size isFontSize::Rem(1.)(0.20). - Shaders are WESL.
.wesl,import a::b;,@if(DEF). naga_oil#import/#ifdeffail at asset load in 0.20. - Resources are components (0.19).
Res<T>still works, but one type cannot be bothComponentandResource. - Scenes: glTF spawns with
WorldAssetRootfrombevy_world_serialization;bevy_sceneis BSN (0.19). - No
.unwrap()in systems. Uselet ... else { return };or a real error path. - Schedule order is explicit. Ambiguities are ignored by default (
ScheduleBuildSettings::ambiguity_detectionisLogLevel::Ignore); opt intoLogLevel::Errorto catch them. Built-in sets use.chain_weak()in 0.20, so cross-set ordering through channels or atomics needs an explicit.after().
Gotchas
- Bevy's training-data footprint is dominated by 0.10–0.16 code. If a snippet feels obvious, check it against the three migration skills before trusting it.
bevy::prelude::*doesn't re-export everything.Hoveredisbevy::picking::hover::Hovered;Pressedis the markerbevy::ui::Pressed(query withHas<Pressed>);Tonemappingisbevy::core_pipeline::tonemapping::Tonemapping;ScreenSpaceTransmissionisbevy::pbr::ScreenSpaceTransmission.- The
bevycrate re-exports many subcrates (bevy_camera,bevy_light,bevy_material,bevy_extract,bevy_curve,bevy_shape,bevy_world_serialization,bevy_ui_widgets,bevy_feathers). Subcrate APIs are stable points to depend on for plugins. - Deprecations (
Interaction,set_if_neq,AssetId::invalid()) compile with warnings in 0.20 and will be removed later. Fix them now.
See also
bevy-migration-0-19-to-0-20— the latest catalogue of renames and breaks.bevy-cargo-features— what to put inCargo.tomlbefore any of the above will compile the way you want.
Comments
Markdown supported