agentleFS
chrisgliddonchrisgliddon/bevy-skills/skills/bevy-cargo-features/SKILL.md

bevy-cargo-features

Skill29 starsChanged 11 days agoMITView on GitHub

Use when picking Bevy 0.20 Cargo features — top-level `2d`/`3d`/`ui`/`audio`, mid-level `3d_api`/`3d_bevy_render`/`ui_api`/`common_api`, headless `default_app`, input opt-ins `mouse`/`keyboard`/`gamepad`, `bevy_curve` (was `bevy_math/curve`), `compressed_image_saver_universal`, `render_dev_tools`, or debugging missing UI/audio/window after `default-features = false`.

The file

We split this skill into the rules it gives an agent

1 rule. About 0 are common, 0 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Web texture compression: use compressed_image_saver_universal.

    line 130

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Bevy 0.20 — Cargo features

When to use this skill

  • Authoring or auditing a Bevy project's Cargo.toml.
  • Trimming the WASM bundle (the single biggest lever).
  • Building a headless server (no rendering, no windowing, no audio).
  • Writing a custom renderer that needs Bevy's data types but not its render pipeline.
  • Migrating a 0.18 or 0.19 manifest: ui, audio, bevy_window and custom_cursor moved collections.

Canonical patterns

Top-level collections (what default is made of)

# default = ["2d", "3d", "ui", "audio"]
[dependencies]
bevy = { version = "0.20", default-features = false, features = ["3d", "ui", "audio"] }
# 3D, no bevy_ui (bring your own UI):
bevy = { version = "0.20", default-features = false, features = ["3d", "audio"] }
# 2D, no bevy_audio (e.g. bevy_seedling):
bevy = { version = "0.20", default-features = false, features = ["2d", "ui"] }

2d, 3d and ui each imply default_app + default_platform + their *_bevy_render stack + scene + picking. Since 0.19 they imply neither ui nor audio; list those explicitly.

Mid-level: API without the default renderer

bevy = { version = "0.20", default-features = false, features = ["3d_api", "bevy_winit", "x11"] }
CollectionAddsUse for
common_apianimation, camera, color, bevy_curve, gizmos, image, mesh, shader, material, text, bevy_window, hdr, pngbase of every *_api
2d_api / 3d_apicommon_api + sprite, or + light, mikktspace, ktx2, morph, luts, zstdcustom renderer
ui_apidefault_app + common_api + bevy_ui + bevy_input_focuscustom UI renderer
2d_bevy_render / 3d_bevy_render / ui_bevy_render*_api + bevy_render + core pipeline + the stock renderers (3d also glTF, PBR, anti-alias, gltf_animation)stock renderer, no default_platform
default_appasync_executor, bevy_asset, bevy_log, bevy_state, reflect_auto_registerheadless
default_platformstd, bevy_winit, bevy_gilrs, bevy_clipboard, default_font, multi_threaded, webgl2, x11, wayland, custom_cursor, sysinfo_plugindesktop windowing
scenebevy_scene (BSN) + bevy_world_serialization (glTF spawning, WorldAssetRoot)any glTF scene
pickingbevy_picking + mesh_picking + sprite_picking + ui_pickingpointer events

Table derived from bevy-0.20.1/Cargo.toml.

Headless server

bevy = { version = "0.20", default-features = false, features = [
    "default_app",   # ECS + assets + state + log, no window
    "multi_threaded",
    "serialize",
    "scene",         # only if you spawn glTF / serialize worlds
] }
use bevy::prelude::*;

fn main() {
    // Headless: pair `default-features = false` + "default_app" with
    // `MinimalPlugins`, not `DefaultPlugins` (which needs the render features).
    App::new()
        .add_plugins(MinimalPlugins)
        .add_systems(Update, tick)
        .run();
}

fn tick(time: Res<Time>) {
    let _ = time.delta_secs();
}

Minimal client, opt-in input

bevy = { version = "0.20", default-features = false, features = [
    "3d_bevy_render", "bevy_winit", "x11",   # or "wayland"; "webgl2"/"webgpu" on web
    "mouse", "keyboard", "gamepad",          # input is opt-in without default_platform
    # "touch", "gestures", "bevy_gilrs" (= gamepad + gilrs backend)
] }

Dev-only extras

[features]
dev = ["bevy/dev"]   # = debug + bevy_dev_tools + render_dev_tools + file_watcher

render_dev_tools compiles RenderDebugOverlayPlugin into DefaultPlugins (disabled until you insert RenderDebugOverlayKeybindings { enable_keybindings: true, .. }). Without the feature the overlay is absent; stock DefaultPlugins do not include it.

Feature moves since 0.18

0.180.190.20
3d/2d/ui imply audioaudio separate, in defaultsame
3d/2d imply uiui separate, in defaultsame
bevy_window in default_appin common_apisame
bevy_input_focus in default_appin ui_apisame
custom_cursor in default_appin default_platformsame; also forwards to bevy_picking/custom_cursor (cursor module moved from feathers to picking)
bevy_picking implied bevy_input_focusno; ui_picking doessame
experimental_bevy_feathers / experimental_bevy_ui_widgetsbevy_feathers / bevy_ui_widgets (ui includes widgets)same
android-game-activity in defaultneither Android activity feature is default; add onesame
bevy_math/curve (default)samegone: enable bevy/bevy_curve (in common_api)
shader_format_wesl, shader_format_glslpresentremoved: WESL always on, GLSL gone; shader_format_spirv stays
compressed_image_saver = Basis Universalsame= BCn/ASTC via ctt; old behaviour is compressed_image_saver_universal
——bevy_shape is a non-optional dep (no feature); its serialize rides on bevy/serialize
bevy_transform/bevy_logremoved; tracing under tracesame
audio: vorbis default; wav, mp3, mp4, flac, aac, audio-all-formatssince 0.19 (rodio 0.22)same

Gotchas

  • default-features = false + 3d drops UI and audio. Stale 0.18 manifests then hit "no Node/AudioPlayer". Add ui and/or audio.
  • default_app has no window types. Window, WindowPlugin need bevy_window (common_api or explicit).
  • bevy_picking without ui_picking gives no UI focus-on-click. Add ui or ui_picking.
  • bevy_math/curve no longer exists. cargo fails with "feature curve not found"; use bevy/bevy_curve.
  • shader_format_wesl/shader_format_glsl fail to resolve in 0.20. Delete them; port GLSL to WESL.
  • Web texture compression: use compressed_image_saver_universal; the new compressed_image_saver output is BCn (desktop) or ASTC (BEVY_COMPRESSED_IMAGE_SAVER_ASTC=4x4), not one-file-everywhere.
  • multi_threaded implies std. no_std targets use default_no_std.
  • trace_tracy / trace_chrome are separate log sinks; enable one.
  • Asset sources: file_watcher (hot reload), embedded_watcher, http/https (ureq), web_asset_cache, asset_processor are all opt-in.

See also

  • bevy-wasm-webgpu — the trimmed WASM manifest and webgl2/webgpu.
  • bevy-assets — file_watcher, scene, compressed_image_saver* at runtime.
  • bevy-migration-0-18-to-0-19 and bevy-migration-0-19-to-0-20 — the upstream feature-move notes.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.