2026-05-01 engine changes worth tracking

Scene Components — landmark architectural merge

  • Scene Components (#24008, by cart) is the most significant architectural PR since Required Components. It introduces the SceneComponent trait and derive macro, enabling a Bevy component to be bound to an associated scene that is expanded through BSN inheritance syntax such as :Player. This bridges the long-standing gap between ECS components and the scene system.
  • Architecture: scene logic lives in bevy_scene (not bevy_ecs), with a new bevy_ecs_macro_logic crate for reusable derive logic. Spawning a SceneComponent without its scene logs an error.
  • Uses BSN (Bevy Scene Notation) inheritance syntax (:). Scene parameterization uses props structs selected by attributes such as #[scene(PlayerProps)], then set at the inheritance site with @field syntax.
  • Future static enforcement of “never spawn scene component without scene” deferred to 0.20.
  • Community controversy: NicoZweifel argued scene logic doesn’t belong near ECS; resolved by cart moving it to bevy_scene.

Text input — Chinese text jitter fixed

  • EditableText scrolling and cursor fixes (#24032, by ickshonpe) fix the Chinese text cursor jitter issue (#23931) and partially address cursor racing during text deletion (#23933).
  • API change: TextLayoutInfo::cursor: Option<Rect>Option<(bool, Rect)> where the boolean indicates cursor visibility.
  • Remaining issues: mixed Japanese/English on the same line still has slight vertical movement; drag-highlight with no_wrap loses selection during scroll.

Rendering — dynamic light shadow fix

  • PR #24038 (by kfc35, merged by alice-i-cecile) fixes ExtractedView and Frustum not updating when ExtractedPointLight changes. This caused shadows from dynamic (moving/rotating) point and spot lights to disappear or glitch.
  • Combined with the earlier “render once” optimization (#23713), this completes the shadow map sharing feature for 0.19: shadows render once per light AND update correctly when lights move.

0.19 milestone approaching release

  • 96% complete (349/363 closed, 14 open). Up from 93% with 21 open on 2026-04-28.
  • 0.20 milestone already created (5/15, 33%), indicating the release team is planning ahead.
  • Most remaining 0.19 issues are platform-specific rendering regressions (Vulkan, DX12, WebGL2, Safari WebGPU, Android Pixel 10).

2026-05-02 engine changes

  • Mesh view bind group layout on demand (#23982): Removes exponential pre-allocation of mesh view bind group layouts, fixing WebGL2 3d_scene regression. Layouts now created on demand with a ViewKeyCache mechanism. Slight performance trade-off in get_view_layout.
  • TextLayout API rename (#24049): Breaking change — new_with_justifyjustify, new_with_linebreaklinebreak, new_with_no_wrapno_wrap. Aligns with fluent API convention.
  • 0.19 release readiness: 349/363 closed (96%), 14 open issues remain.

Watch-only: AppExit hang on 0.18.1

  • Issue #24035 reports an AppExit hang on macOS Metal (Bevy 0.18.1) when adding per-frame systems after screenshot queuing, or when overwriting init_resource via insert_resource. Workarounds: use Startup system + ResMut mutation instead of insert_resource, and don’t add per-frame systems after screenshot queuing.

2026-05-03 engine changes worth tracking

Rendering — CAS + SMAA flickering fix

  • PR #24066 (JMS55, merged May 2) fixes a screen flicker when contrast-adaptive sharpening (CAS) is combined with SMAA anti-aliasing at non-zero sharpening strength. Not a major API change, but relevant for any project using post-processing effects.

0.19 release preparation

  • 0.19 release notes being drafted (#24029 by Trashtalk217, merged Apr 30). First pass includes images for post-processing effects and parallax correction. This is a clear signal that the release team is in final preparation mode.
  • Milestone status: 359/381 closed (94.2%), up from 349/363 on 2026-05-02. 10 new issues closed but 18 new issues added — the total milestone scope expanded. Open issues rose from 14 to 22 as edge cases were filed for the release. This is expected behavior.
  • 0.20 unchanged: still 5/15 closed (33%).
  • Asset pipeline batch updates: ~20 previously-merged asset-related PRs from andriyDev were batch-updated on May 2. These include single-threaded asset processor support, AssetSources sharing, and Assets::insert error return. Likely label/status cleanup or stabilization review ahead of 0.19.

2026-05-05 engine changes worth tracking

Feathers API final form

  • bevy_experimental_feathersbevy_feathers (#24108). The feathers widget system architecture is now complete, driven by Scene Components (#24008). No longer experimental. This is a major milestone for Bevy’s UI layer. Feathers widgets now provide a first-class bsn!-based UI toolkit.

Rendering — wgpu 29.0.3 bump

  • wgpu bumped from 29.0.1 to 29.0.3 (#24064). Should fix the DX12 black meshes regression (#23573), one of the longest-standing 0.19 blockers. Also fixes #23220. This is a critical rendering fix for Windows/DX12 users.

ECS — resource storage optimization

  • Resources now stored on sparse sets (#24077). ~10% faster resource::get (6.38ns). The SparseSet storage type proved faster than the previous Table-based approach for resource access patterns. Internal change, no API impact.

ECS — Commands::insert_resource_if_neq

  • New API (#24082): Commands::insert_resource_if_neq. Mirror of EntityCommands::insert_if_neq for resources. Prevents redundant change detection triggers when resource values haven’t actually changed.

UI — From<Val> for Fontsize

  • FontSize now implements From<Val> (#24076). Enables using Val::px(16.), Val::vh(5.), etc. directly in bsn! font size declarations. Val::Auto maps to FontSize::Rem(1.); Val::Percent(x) maps to FontSize::Rem(x/100.).

Windowing — resize events fixed

  • WindowResized, WindowBackendScaleFactorChanged, WindowScaleFactorChanged now correctly pushed to bevy_window_events (#24046). These events were previously only available via dedicated MessageReader channels, making WindowEvent matching incomplete. Fixes #15268.

Rendering fixes

  • WebGL2 background motion vectors (#24067): Gated to DownlevelFlags(INDEPENDENT_BLEND), fixing Forward+Prepass on deferred_rendering example for WebGL2.
  • Volumetric fog regression (#24090): Atmosphere example fixed after #23982 mesh bind group layout change. Uses ViewKeyCache instead of manual key calculation.
  • SSAO SyncComponents (#24086): SSAO resources now properly synced, fixing #24084.
  • LTC LUT feature gate (#24065): Rect light LUTs gated behind feature flag, reducing default dependency footprint (no longer always requires ktx2+zstd).

Platform support

  • Android Pixel 10 (#24101): GPU preprocessing limited to no-culling mode as workaround for #23754 driver bug.

0.19 release status

  • 384/396 (97.0%), 12 open issues. 3 new issues filed. No release yet.

2026-05-06 engine changes

  • Disabled/Enabled state scoped components (#24142). New DisableWhen, DisableOnEnter, DisableOnExit, EnableWhen, EnableOnEnter, EnableOnExit mirror the DespawnWhen pattern. Cleaner state-driven entity toggling.
  • Prepass indirect parameters fix (#24113). Fixes rendering when early prepass is active without depth/shadow prepass (e.g. motion_blur without shadow map). 0.19 milestone.
  • clip_check_recursive optimization (#24135). UI/picking: skips clip containment test when no clipping, uses try_inverse. Performance improvement for UI-heavy scenes.

2026-05-07 engine changes worth tracking

Rendering — Quit on RenderErrors default behavior

  • #24131 merged: Applications now quit by default on any RenderError instead of silently degrading. This is the final resolution of a long-standing debate about error handling policy. Most impactful for WebGL2/wasm where device loss is more common.

Scenes — bsn! codegen reduction

  • #24124 merged: cart combined bsn! scene implementations into a single SceneFunction, reducing codegen and debug symbol size. Performance improvement for projects with large bsn! macros.

ECS — Disable/Enable recursive fix

  • #24158 merged: Entity disabling/enabling now correctly recurses over Children hierarchy. Previously, only the targeted entity was disabled; children would continue operating. This is a correctness fix for the #24142 feature merged on May 6.

Rendering — EnvironmentMapUniform removed

  • #24095 merged: EnvironmentMapUniform removed; rotation now stored in LightProbesUniform. Breaking change with migration guide.

UI — ImageNode and clip rect fixes

  • #24154 merged: OverflowClipMarginBox renamed to VisualBox. ImageNode now has a visual_box field for drawing inside border/padding.
  • #24138 merged: ComputedNode::resolve_clip_rect margins fix — inflates clip rect by OverflowClipMargin margin value.

Performance — ShaderDefVal allocation elimination

  • #24037 merged: ShaderDefVal now uses Cow<'static, str> instead of String, eliminating heap allocations for static shader define names.

0.19 milestone — 99% complete (May 7 snapshot)

  • 395/398 closed, 3 open issues. All three are rendering regressions. Release is imminent.

2026-05-08 engine changes worth tracking

Animation — AnimationClip curve sampling

  • #24152 merged: sample_clamped method added to AnimationClip and AnimationCurve trait. Enables sampling animation properties at arbitrary times — first step toward root motion support (#23355). Relevant for projects with custom animation systems or motion blending.

Rendering — RenderVisibleEntitiesClass public API

  • #24180 merged: added_entities, prepare_for_new_frame(), and update_cpu_culled_entities() on RenderVisibleEntitiesClass are now public. Third-party rendering crates (e.g. bevy_mod_outline) can build custom visibility systems without workarounds. Additive change.

ECS — World::register_resource deprecated

  • #24168 merged: World::register_resource deprecated (missed in prior cleanup). Grep and replace with recommended alternative before upgrading to 0.19.

Docs — Render graph as systems release notes

  • #24167 merged: Documentation improvement for the “render graph as systems” feature heading into 0.19 release notes.

0.19 milestone — 98.5% (slight regression in % from new issues)

  • 398/404 closed, 6 open issues. 3 new issues filed since May 7, 0 closed. Release still imminent.

0.19 milestone — 99.3% complete (May 9 snapshot)

  • 417/420 closed, 3 open issues. All three are visibility-range shadow rendering regressions. Release is in the “any hour now” zone.

2026-05-10 engine changes worth tracking

Quiet day — release freeze

  • Only one trivial PR merged (#24214, typo fix). The merge train has slowed as the release team enters final freeze.
  • 0.19 milestone: 418/423 (98.8%), 5 open issues. Up from 417/420 (99.3%, 3 open) on May 9 — 1 issue closed, 2 new issues added to milestone scope. Release remains imminent.

2026-05-11 ~ 2026-05-13 engine changes worth tracking

Rendering — flickering shadows fixed

  • #24216 merged (JMS55, May 12): Fixes #24215 — Windows 11 Vulkan shadows flicker for one frame after window minimize/restore. Follow-up to #24162. Fix involved adjusting logic in PrepareAssets.

0.19 milestone — release gate on GPU culling revert decision

  • 423/431 closed (98.1%), 8 open issues. Five issues closed since May 10, but three new issues added to milestone scope.
  • **The biggest open question is 24252 (kfc35, May 11, open/approved): whether to revert #23115 (GPU visibility range culling) as the pragmatic path for 0.19. JMS55 and Zeophlite approved. If merged, this removes the GPU culling feature from 0.19 to avoid shadow regressions, with a future partial revert planned for non-shadow views.
  • Several D-Trivial PRs are queued for final review: #24225 (fxaa/smaa public), #24265 (RenderGraph in prelude), #24222 (resources-as-components trait tags).

Misc merged PRs

  • shadow_pass split migration guide (kfc35) — docs for shadow pass architecture.
  • RunGeometry bounds fix (ickshonpe) — UI/Text correctness fix.
  • DespawnOnExit/DespawnOnEnter log spam fix (Pronoiai, 0.18) — state-scoped component log spam fixed.
  • free camera controller local Y controls (TinyZilla) — dev-tool camera improvement.
  • lz4_flex 0.12 → 0.13 (dependabot) — dependency bump.

2026-05-14 engine changes worth tracking

🚨 Bevy 0.19.0-rc.1 Released

  • v0.19.0-rc.1 published May 13 by mockersf. First release candidate for the 0.19 cycle. 36 community reactions. This is the milestone moment — after 3 months of development and ~440 issues/PRs, the 0.19 release candidate is live.
  • Known rc.1 issues: bevy_settings fails to compile (#24282), crates.io naming conflict for bevy-settings crate (#24279), tileset y-axis revert pending (#24275).

GPU visibility range culling revert — release gate resolved

  • #24252 MERGED (kfc35, May 13). Rolls back #23115 (GPU visibility range culling) to avoid shadow regressions in 0.19. This was the single tracked release gate since May 11. JMS55 and Zeophlite approved the pragmatic revert. Future partial re-introduction planned for non-shadow views in 0.20.

UI — EditableText drag selection fix

  • #24260 MERGED (ickshonpe, May 13, 0.19). Fixes drag selection behavior in editable text fields. Bug fix, no API change.

Rendering — RenderGraph prelude + migration guide

  • #24265 MERGED (kfc35, May 13, 0.19). Adds RenderGraph to bevy_render::prelude and specifies its location in the migration guide. Usability improvement for projects using custom render graphs.

Rendering — FXAA/SMAA systems made public

  • #24225 MERGED (komadori, May 13, 0.19). Makes FXAA and SMAA system symbols public so users can apply system ordering constraints. Additive change — no breakage.

Minor PRs

  • #24249 — ECS documentation fixes (eswartz, 0.19). C-Docs.
  • #24222 — Update trait tags for resources-as-components (SpecificProtagonist, 0.19). C-Docs.
  • #24271 — Fix typo (mamekoro). C-Docs.

0.19 milestone status

  • 433/440 closed (98%), 7 open issues. Up from 423/431 (98.1%, 8 open) on May 13. 10 more issues closed, 1 new issue added. Remaining: mostly trivial docs/fixes + 2 SME-blocked items (crates.io naming, tileset y-axis).

2026-05-15 engine changes worth tracking

Rendering — Solari BRDF layering improved

  • #24243 MERGED (dylansechet, May 15). Improves energy distribution between specular and diffuse lobes in the Solari BRDF. The old layering formulation was broken; the new one is inspired by OpenPBR equation 42, substituting Filament’s multiscattering correction. Breaks reciprocity but acceptable for Bevy’s unidirectional path tracer. White furnace test confirms improved energy conservation.
  • Performance: hoists F_AB texture sampling to avoid redundant lookups.
  • Split from #23818. Related open PR: #24246 (energy conservation improvement).
  • 31 review comments. Approved by JMS55 and SparkyPotato.

Post-rc.1 freeze — merge queue active but no new merges

  • No new PRs merged since May 14. The merge train is frozen post-rc.1. Multiple approved PRs are in the merge queue but blocked on CI failures.
  • 0.19 milestone: 434/443 (97%), 9 open items. Unchanged from May 14.

pcwalton’s proper visibility range shadow fix — architectural significance

  • #24289 (pcwalton, May 14, S-Needs-Review) introduces ShadowLodOrigin component for shadow map visibility range resolution. This is the correct architectural fix for #23991, replacing the temporary GPU culling revert (#24252) merged on May 13.
  • Key concepts: visibility ranges for directional light shadow maps resolve relative to the associated camera; point/spot light shadow maps resolve relative to a “shadow LOD origin” (new concept); new lod_view_world_position field in GPU View uniform.
  • New component: ShadowLodOrigin — allows developers to customize the shadow LOD origin. Default heuristic: prefer origin coinciding with cameras rendering to a window.
  • If this lands in 0.19, the team may un-revert #23115 (GPU visibility range culling). If deferred to 0.20, the revert stands.
  • 209 additions / 24 deletions across 10 files. 12 comments on the PR.

UI — SelectAllOnFocus opt-in (in merge queue)

  • #24278 (ickshonpe, approved by alice-i-cecile, in merge queue). Text input select-all-on-focus is now opt-in via SelectAllOnFocus component, not default behavior. CI failed once; retrying.

Migration guide — TextLayout constructor renames (in merge queue)

  • #24286 (urben1680, approved by mnmaita, in merge queue). Adds migration guide for TextLayout constructor renames (new_with_justifyjustify, etc.) and fixes Access deprecation messages. Community contribution from a user migrating to 0.19-rc.1.

RC-blocking issues

  • #24279 — crates.io naming conflict: bevy-settings cannot be renamed to bevy_settings. alice-i-cecile suggests asking crates.io team for override. SME-blocked.
  • #24282bevy_settings fails to compile in rc.1 due to missed renames from #24279. D-Trivial, S-Ready-For-Implementation.

2026-05-16 engine changes worth tracking

New issues worth tracking

  • #24311 — UiGlobalTransform incorrect with padding (ehllie, May 15, C-Bug). UiGlobalTransform returns incorrect positioning data when padding, margin, border, or preceding sibling nodes are present. The min bound of a node incorrectly affects UiGlobalTransform.translation. Reproduced on macOS Metal (Bevy 0.18.1). No fix yet. Relevant for any project using UI node positions to constrain world entities.
  • #24314 — Fallible component lifecycle hooks (musjj, May 15, C-Feature). Feature request to make component lifecycle hooks return Result so users can use ? operator instead of .unwrap(). Currently ComponentHook accepts fn(DeferredWorld<'_>, HookContext) with no error propagation.
  • #24309 — Remove .bsn asset format mentions from 0.19 docs (laundmo, May 15, C-Docs, 0.19 milestone). alice-i-cecile prefers adding warnings everywhere rather than removing references, as the examples are essential for the intended mental model. This is now a 0.19 milestone item.
  • #24300 — bevy_dylib incompatible with panic = “abort” (dlight, May 15, C-Feature). Dynamic linking via bevy_dylib fails to compile with panic = "abort" due to panic runtime mismatch. Workaround: patch locally.

0.19 milestone status

  • 434/445 (97%), 11 open. Two new issues filed since May 15: #24306 and #24309. Milestone scope expanded but progress unchanged.
  • #24289 (ShadowLodOrigin) now S-Ready-For-Final-Review — approved by jasmine-nominal and kfc35. If merged, this is the architecturally correct fix that could enable un-reverting GPU visibility range culling.
  • SME-blocked items unchanged: #24279 (crates.io naming), #24275 (tileset y-axis).
  • No rc.2 or 0.19 final published yet.

2026-05-17 engine changes worth tracking

Quiet day — merge train still frozen post-rc.1

  • 0 new merged PRs since May 16. The merge train remains frozen after the rc.1 release. No changes to user-facing API.
  • 0.19 milestone: 434/446 (97.3%), 12 open issues. One additional open issue since May 16. Still no rc.2 or 0.19 final.^[https://github.com/bevyengine/bevy/milestones]

New issues worth tracking

  • #24320 — ScenePatchInstance fails silently with bsn! (Semihazah, C-Bug). ScenePatchInstance fails silently when spawning via bsn! macro — the scene simply does not spawn, with no error message. Works correctly when spawning via Commands::spawn. Directly relevant to bsn workflows and any project using queue_spawn_scene.^[https://github.com/bevyengine/bevy/issues/24320]
  • #24318 — Snapdragon Game Super Resolution (SGSR) support (beicause, C-Feature). Feature request to add Qualcomm’s SGSR upscaler. BSD-3 licensed, cross-platform shaders. Would complement existing DLSS support.^[https://github.com/bevyengine/bevy/issues/24318]

Notable active open PRs

2026-05-18 engine changes worth tracking

BSN — EntityTemplate in scene functions (landmark BSN merge)

  • #24174 MERGED (laundmo, May 17, D-Complex, X-Contentious). Enables passing EntityTemplate (entity name references) into scene functions (-> impl Scene) and Scene Component @props. This is a significant expansion of BSN’s compositional power: scene functions can now receive and use named entity references, enabling parameterized scene composition where templates reference named entities in the scene hierarchy.^[https://github.com/bevyengine/bevy/pull/24174]
  • Prior to this PR, scene functions could not receive entity name references — only literal values. This was a fundamental limitation for compositional scene patterns.
  • Tagged X-Contentious: the approach of using entity indices/identifiers as stable references was debated. The final implementation builds on #24173.

0.19 milestone — scope expanded to 449 items

  • 435/449 (96.9%), 14 open. Up from 434/446 (97.3%, 12 open) on May 17. Three new items added to milestone scope, two items closed.^[https://github.com/bevyengine/bevy/milestones]
  • **New milestone item 24336 (pcwalton): Adds const and unsafe block support to bsn! macro. Expands BSN macro expressiveness — enables embedding const expressions and unsafe operations directly within bsn! blocks.^[https://github.com/bevyengine/bevy/pull/24336]
  • **New milestone item 24334 (SpecificProtagonist, A-ECS, S-Ready-For-Implementation): Architectural proposal that required components should not be resources. ECS boundary discussion.

New issues

  • #24337 (ganluu960214, C-Bug): PresentMode::AutoVsync, Fifo, FifoRelaxed, Mailbox all fail — application runs at max FPS instead of vsync. Affects frame pacing.
  • #24338 (Wtoll, C-Feature): ComponentInfo extensions — requests additional metadata API on component registration. Potentially useful for dynamic ECS introspection.
  • #24330 (musjj, C-Feature): Despawning resource entities — feature request for despawning entities that are also registered as resources.
  • #24325 (hsnoil, C-Bug): Touch position issues in WASM builds.

2026-05-19 engine changes worth tracking

Rendering — pcwalton’s shadow visibility range fix MERGED

  • #24289 MERGED (pcwalton, May 18). The architecturally correct fix for #23991 has landed. Introduces ShadowLodOrigin component for shadow map visibility range resolution and adds lod_view_world_position to the GPU View uniform. Key insight: visibility ranges for point/spot light shadow maps now resolve relative to a “shadow LOD origin” instead of the view.^[https://github.com/bevyengine/bevy/pull/24289]
  • This was the single most important open 0.19 PR. Its merge paves the way for #24343 (re-apply GPU-driven HLOD evaluation), which would effectively un-revert the GPU visibility range culling that was rolled back in #24252.
  • 209 additions / 24 deletions across 10 files. 12 comments on the PR.

Text — bevy_text index type change (potential migration impact)

  • #24274 MERGED (ickshonpe, May 19). Changes line and section indices from usize to u32 in bevy_text. Performance/memory improvement.^[https://github.com/bevyengine/bevy/pull/24274]
  • Migration impact: Code that stores or passes these indices as usize will need type adjustments. If code converts between usize and the old index types, check for truncation.

Picking — Reflect support for picking resources

0.19 milestone — scope expanded to 450 items

  • 436/450 (96.9%), 14 open. Up from 435/449 on May 18. One item closed (#24289), one new item added to milestone scope (#24343 — pcwalton’s GPU-driven HLOD re-application).^[https://github.com/bevyengine/bevy/milestones]
  • #24343 (pcwalton, S-Ready-For-Final-Review) is the follow-up to #24289 — it re-applies GPU-driven HLOD evaluation using the new ShadowLodOrigin architecture. If this merges before release, GPU visibility range culling returns to 0.19 with correct semantics.
  • 0.20 milestone: 8/23 (34%), 15 open.

New issues

Still no rc.2 or 0.19 final

  • v0.19.0-rc.1 (May 13) remains the latest pre-release. 14 items remain open in the 0.19 milestone.
  • SME-blocked items: #24279 (crates.io naming — rename PR #24317 now open as a possible workaround), #24275 (tileset y-axis revert).

2026-05-20 engine changes worth tracking

Rendering — GPU-driven HLOD evaluation re-applied (landmark resolution)

  • #24343 MERGED (pcwalton, May 19). Undoes the #24252 revert and restores GPU visibility range culling (#23115) using the new ShadowLodOrigin architecture from #24289. The two-commit PR first reverts the revert, then aligns GPU-driven visibility range evaluation to use the same HLOD view origin semantics as the CPU path.^[https://github.com/bevyengine/bevy/pull/24343]
  • This is the landmark resolution of the 0.19 release’s biggest architectural controversy. GPU visibility range culling is back with correct shadow LOD behavior. Shadows now properly reflect the LOD of the model when using --no-cpu-culling.
  • Testing: cargo run --example visibility_range -- --no-cpu-culling, zoom out behind the flight helmet, watch the shadow.

Crash regression — RenderShadowLodOrigin without PBR

  • #24352 (laundmo, May 19, P-Crash, 0.19 milestone). bevy_render unconditionally requires Res<RenderShadowLodOrigin> in prepare_view_uniforms, but the resource is only initialized by PbrPlugin (behind bevy_pbr feature flag). 2D-only apps or custom feature sets that include bevy_render but omit bevy_pbr will panic on startup with “Resource does not exist”.^[https://github.com/bevyengine/bevy/issues/24352]
  • Root cause: cross-crate feature gate mismatch introduced by #24289.
  • Fix options: make prepare_view_uniforms conditionally depend on RenderShadowLodOrigin (only when PBR enabled), or move resource initialization into bevy_render.
  • This is now a 0.19 release blocker for 2D apps.

New issues (May 19-20)

  • #24356 (nic96, A-UI, C-Bug): FeathersNumberInput doesn’t work when spawned in the Update schedule. Widget initialization issue.
  • #24350 (ethanuppal, C-Bug): Incorrect rounding in pixel_grid_snap example. Directly relevant to bevy-pixel-perfect-rendering.
  • #24348 (norablackcat, C-Docs): docs.rs build failure for 0.19.0-rc.1. Documentation availability issue.
  • #24346 (Jengamon, C-Bug): “CommandQueue has un-applied commands” warning when exiting with delayed commands. ECS lifecycle issue.
  • #24353 (jiangheng90, C-Feature): Request for CoordSystemTransform support in atmosphere rendering. Feature request.
  • #24354 (GasparKral, C-Bug): Incorrect Buffer type on RenderPass.set_vertex_buffer. Closed same day.

Milestone status

  • 0.19 milestone: 437/452 (96.7%), 15 open. Up from 436/450 (96.9%, 14 open) on May 19. One item closed (#24343), two new items added (#24352, #24355).^[https://github.com/bevyengine/bevy/milestones]
  • 6 PRs community-approved (S-Ready-For-Final-Review): #24278 (SelectAllOnFocus), #24286 (TextLayout migration guide), #24294 (text input example fixes), #24295 (text input navigation), #24322 (require attribute), #24336 (bsn! const/unsafe).
  • RC-blocking issues now include #24352 (2D crash) in addition to #24282 and #24279.

2026-05-21 engine changes worth tracking

Rendering — RenderShadowLodOrigin 2D crash FIXED

  • #24359 MERGED (pcwalton, May 20, P-Crash, P-Regression). Fixes the #24352 crash regression where 2D-only apps or custom feature sets omitting bevy_pbr would panic because bevy_render unconditionally required Res<RenderShadowLodOrigin>. The resource is now treated as optional during View construction.^[https://github.com/bevyengine/bevy/pull/24359]
  • Root cause: #24289 (ShadowLodOrigin) introduced RenderShadowLodOrigin resource, only initialized by PbrPlugin. The View GPU structure is shared between 2D and 3D paths.
  • Approved by JMS55, Zeophlite, laundmo. alice-i-cecile review still pending at merge time.

Naming — bevy_settings renamed to bevy-settings (rc.1 blockers resolved)

  • #24317 MERGED (mockersf, May 20). Renames the crate/directory from bevy_settings to bevy-settings (hyphenated), keeping the Cargo feature exposed as bevy_settings (underscore).^[https://github.com/bevyengine/bevy/pull/24317]
  • **Closes 24282 (compile failure in rc.1) and **resolves 24279 (crates.io naming conflict). The team confirmed that asking the crates.io team for a rename override was not possible. The local rename was the pragmatic solution.
  • Cargo normalizes - to _ automatically, so downstream bevy_settings feature references continue to work.

BSN — const/unsafe block support in bsn! macro

  • #24336 MERGED (loreball, May 20, 0.19 milestone). Adds const and unsafe block expression support inside the bsn! macro. async block support was attempted but removed due to type system limitations — async futures produce unnamable types that can’t satisfy the Clone + Default requirements of bsn! structs.^[https://github.com/bevyengine/bevy/pull/24336]
  • cart commented: “A bit of a hack, but I think this is the right move for now. Ultimately I’d like to find a way to capture all of these cases by treating things in this position as normal rust expressions.”

ECS — require attribute in Resource derive

  • #24322 MERGED (musjj, May 20, 0.19 milestone). Exposes the require attribute in the Resource derive macro. Since resources are now components, they should be capable of requiring other components.^[https://github.com/bevyengine/bevy/pull/24322]
  • Approved by SpecificProtagonist and cart.

Migration — TextLayout migration guide

0.19 milestone status

  • 448/457 closed (98%), 9 open. Up from 437/452 (96.7%, 15 open) on May 20. 11 issues closed, 5 new items added to scope.^[https://github.com/bevyengine/bevy/milestone/40]
  • RC-blocking issues all resolved: #24282 ✅, #24279 ✅, #24352 ✅. Path clear for rc.2.
  • Remaining 9 open items: 6 UI/Text fixes (5 by ickshonpe, 1 by nic96), 3 docs items.
  • No rc.2 or 0.19 final published yet. v0.19.0-rc.1 (May 13) remains latest.

2026-05-22 engine changes worth tracking

BSN — Prefix overhaul (breaking syntax change)

  • #24367 MERGED (laundmo, May 21, D-Macros, A-Scenes). Complete BSN prefix redesign to eliminate the misleading “inheritance” concept. Changes:^[https://github.com/bevyengine/bevy/pull/24367]
    • @Template~Template (tilde for template patching)
    • :SceneComponent@SceneComponent (at-sign for SceneComponent disambiguation)
    • : now means “cacheable” (not “inheritance”); terminology updated to “include”/“included”
    • Caching is NOT yet enabled — this PR is groundwork only
  • Approved by cart, Zeophlite, mockersf. Cart pushed minor error handling tweaks. 7 review comments.
  • Zeophlite raised concern: ~Thing and potential future -Thing (removal patches) are visually similar.
  • Breaking for all BSN code — every bsn! invocation using : with SceneComponents or @ with Templates needs syntax migration.

Unsafe — MovingPtr unsoundness FIXED

Rendering — GPU batching bugfix

  • #24365 MERGED (issam3105, May 22, 0.19 milestone). GPU preprocessing now respects AUTOMATIC_BATCHING = false for sorted phases. Fixes Transmissive3d ordered chunk rendering. RenderDoc verified.^[https://github.com/bevyengine/bevy/pull/24365]

Rendering — Solari light leak prevention

Docs — SpotLight Frustum warning

UI — FixedNode new component

  • #24323 MERGED (ickshonpe, May 21, A-UI, M-Release-Note). New FixedNode marker component for viewport-relative UI positioning (like CSS position: fixed). Treated as UI root in Taffy, breaks out of parent layout/clipping/transform context. Requires Node + OverrideClip. Closes #9564. Primary use case: modal dialogs portaled from deep UI hierarchy.^[https://github.com/bevyengine/bevy/pull/24323]

Scenes — SceneList for Vec (usability)

  • #24242 MERGED (chronicl, 0.19 milestone, A-Scenes). impl SceneList for Vec<Box<dyn SceneList>> — enables spawning variable amounts of SceneLists as Children, e.g. for dynamic grid layouts.^[https://github.com/bevyengine/bevy/pull/24242]

Text/UI — TextLayoutInfo centralization + regression

Rendering — spotlight shadow fix

  • Spotlight shadow basis reconstruction fix (JeroenHoogers, A-Rendering, C-Bug). Fixes incorrect basis reconstruction causing spotlight shadow rendering artifacts.

Rendering — Premultiplied Alpha for OIT

  • Premultiplied Alpha for OIT (Schmarni-Dev, A-Rendering, C-Bug). Bug fix for order-independent transparency — implements proper premultiplied alpha compositing. 13 review comments.

Rendering — Solari BRDF energy conservation

  • Solari BRDF energy conservation improvement (dylansechet, A-Rendering, D-Shaders). Further improvements to Solari BRDF energy distribution between specular and diffuse lobes.

ECS — entity_commands on EntityWorldMut

  • entity_commands method (WeiTheShinobi, A-ECS, C-Usability). Adds entity_commands() method to EntityWorldMut for easier access to the entity command builder pattern.

Rendering — ShaderDefVal allocation elimination

  • ShaderDefVal Cow optimization (beicause, A-Rendering, C-Performance). ShaderDefVal uses Cow<'static, str> to eliminate heap allocations for static shader defines.

Rendering — morph shader descriptor index

  • Morph shader descriptor index (komadori, A-Rendering, D-Shaders). Changes bevy_pbr::morph shader functions to use descriptor index for better compatibility.

0.19 milestone status

  • 462/472 closed (97.9%), 10 open. Up from 448/457 (98%, 9 open) on May 21. 14 issues closed, milestone scope expanded by 15 items.^[https://github.com/bevyengine/bevy/milestone/40]
  • 10 open issues visible include: #24278 (SelectAllOnFocus, in progress), #24283 (Bevy Book Release Note), #24348 (docs.rs build failure), #24356 (FeathersNumberInput bug), plus 6 more UI/Text/docs items.
  • Still no rc.2 or 0.19 final published. v0.19.0-rc.1 (May 13) remains latest.

2026-05-23 engine changes

🚨 v0.19.0-rc.2 released

Rendering — Skybox cleanup fix

  • #24389 (issam3105, May 22, 0.19, C-Bug). When Skybox was moved to bevy_light (#22682), SyncComponentPlugin was accidentally dropped due to orphan rules. Removing a Skybox component from a camera had no effect in the render world — the extracted skybox persisted. Fix: manually register SyncComponentPlugin<Skybox>. Verified with anisotropy example.^[https://github.com/bevyengine/bevy/pull/24389]

UI/Text — SelectAllOnFocus now opt-in

  • #24278 (ickshonpe, May 22, 0.19). Single-line text inputs no longer auto-select-all on focus. Add SelectAllOnFocus component explicitly for the old behavior. Design discussion: jordanhalase (original feature author) preferred HTML-aligned defaults, but ickshonpe argued that the existence of SelectAllOnFocus implies removing it should disable the behavior. NiklasEi and kfc35 supported the opt-in approach.^[https://github.com/bevyengine/bevy/pull/24278]

Reflection — opaque type generic info fix

  • #24382 (MrGVSV, May 22, C-Bug, D-Trivial). Opaque types (e.g. Arc<T>) were not capturing generic type information in reflection metadata. The #[reflect(opaque)] attribute and impl_reflect_opaque! macro now capture generics when possible. Fixes #24235.^[https://github.com/bevyengine/bevy/pull/24382]

Release management — 0.19 branch created

  • #24276 (mockersf, May 22, D-Trivial). Release notes and migration guides cleared from main. The 0.19 release branch has started; main now targets 0.20. alice-i-cecile noted this makes hybrid fix+migration-note PRs harder, but it was necessary to unblock 0.20 work.^[https://github.com/bevyengine/bevy/pull/24276]

0.19 milestone status

  • 466/474 closed (98%), 8 open. Remaining items: #24356 (FeathersNumberInput Update bug), #24362 (FontSource resolution), #24369 (bevy_ui_widgets deps), #24283 (Bevy Book Release Note), #24285 (Immutable resources migration guide), #24320 (ScenePatchInstance silent fail), #24299 (bsn! macro docs), #24377 (Diagnostics overlay broken).^[https://github.com/bevyengine/bevy/milestone/40]
  • rc.2 is LIVE — all critical blockers resolved. 0.19 final release is imminent.

2026-05-24 engine changes

Assets — AssetId::invalid() deprecated

  • #24392 (greeble-dev, May 23, M-Migration-Guide). Progresses #19024 (removing UUID handles). AssetId::invalid() is now deprecated in favor of AssetId::default(). Last internal usage in custom_phase_item example replaced. Initially planned as hard removal, changed to deprecation after ChristopherBiscardi’s review feedback about pub visibility.

App/Plugin — plugin_group! accepts function plugins

  • #24345 (Jengamon, May 23, X-Uncontroversial). plugin_group! macro now supports function plugins via new @fn block. Functions with fn(&mut App) signature already implement Plugin but couldn’t be used in plugin groups. Syntax uses @fn sigil because macro parsing cannot backtrack. Declaration order preserved in build order.

Rendering/Text — Text2d size fix

  • #24399 (ickshonpe, May 23, C-Bug). Fixes #24384 — the TextLayoutInfo::scale_factor change from #24245 broke multi_window_text example. The layout size is stored in physical pixels, so anchor offset calculation now correctly multiplies by inverse scale factor. Text2d bounds changed to logical (not physical) size.
  • ⚠️ #24245 (physical) vs #24399 (logical): TextLayoutInfo::size remains in physical pixels; only text2d bounds were changed to logical. When accessing layout info directly, apply inverse scale factor manually.

0.19 milestone status

  • 466/478 closed (97.5%), 12 open. Scope expanded slightly since May 23. No new critical blockers.
  • Still no 0.19 final. rc.2 (May 22) remains latest pre-release.

2026-05-26 engine changes

Quiet day continues — milestone scope grows, no merges

  • 0 new merged PRs since May 23. Merge train remains frozen for 3rd consecutive day post-rc.2.
  • 0.19 milestone: 466/485 (96%), 19 open. Down from 466/480 (97%, 14 open) on May 25. Scope expanded by 5 items with 0 closed — progress percentage dropped for the first time since tracking began.^[https://github.com/bevyengine/bevy/milestone/40]

New rc.2 regressions — gizmos broken

  • #24429 — Scale gizmo breaks when target entity is scaled to 0. Filed against v0.19.0-rc.2. Editor/debugging workflow regression.
  • #24431 — Transform gizmo local space snapping renders gizmo unusable. Filed against v0.19.0-rc.2. Both issues affect the editor-like dev experience that Feathers/BSN tools depend on.
  • Potential release blockers if the 0.19 final ships before these are fixed.

Open PRs in the pipeline (11 total, none merged)

PRAuthorDescriptionStatus
#24362ickshonpeResolve FontSources on changesIn progress
#24402laundmobsn: fix accidental scene entity deduplication25/42 checks
#24404kristoff3rRename SortedRenderPhase add to add_retained26/40 checks ✓
#24407kristoff3rRemove false positive error log for morph targets26/47 checks
#24408kristoff3rUpdate change list migration guide21/33 checks ✓
#24406eugineer2Add RelationshipHookMode to BundleWriter::write27/47 checks ✓
#24424Trashbalk217Immutable Resources fix26/40 checks ✓
#24418oelisonbugfix android activity30/47 checks
#24433kfc35Fix: Add system set for DiagnosticsOverlay Setup26/38 checks ✓
#24440hxYukiReplace unnecessary FromTemplate with Default + Clone27/45 checks ✓

0.20 milestone

  • 10/29 closed (34%). Steady growth. Key open items include ObserverSet topo-sorted dispatch (#24328), Assets as entities v0 (#22939), and dynamic BSN format (#23576).

2026-05-25 engine changes

Quiet day — merge train frozen post-rc.2

  • 0 new merged PRs since May 23. The merge train remains frozen after rc.2. No changes to user-facing API.
  • 0.19 milestone: 466/480 (97%), 14 open issues. Up from 466/478 (97.5%, 12 open) on May 24. Milestone scope expanded by 2 items, both related to immutable resources: “Immutable resources need a migration guide” and “Immutable Resources fix”.^[https://github.com/bevyengine/bevy/milestone/40]

New milestone items worth noting

  • “Immutable resources need a migration guide” — The resource hooks & immutable resources feature (#24164, merged May 9) still lacks a migration guide. S-Ready-For-Implementation.
  • “Immutable Resources fix” — Bug fix for the immutable resources implementation from #24164.
  • “Diagnostics overlay is broken” — UI diagnostic tool broken in current builds.
  • “bsn: fix accidental scene entity deduplication due to name references” — BSN bug where entity name references cause unintended deduplication.

2026-05-27 engine changes

Milestone keeps growing, new performance regression filed

  • 2 minor doc PRs merged — #24458 (typo in bevy_scene docs) and #24439 (UntypedHandle docs). No functional changes.
  • 0.19 milestone: 466/489 (~95.3%), 23 open. Scope expanded by 4 items since yesterday (485→489). Closed count unchanged at 466. Open count grew from 19 → 23.^[https://github.com/bevyengine/bevy/milestone/40]
  • ⚠️ #24448 — 0.19 Performance Regression (AlephCubed). New issue filed 20h ago, labeled C-Bug / C-Performance / P-Regression / S-Needs-Investigation. Details still under investigation. This is a potential release blocker for 0.19 final.^[https://github.com/bevyengine/bevy/issues/24448]
  • #24456 — Expose TAA and CAS nodes as public (nyaalexx). New PR, 9h old. A-Rendering / C-Usability / D-Trivial. Makes Temporal Anti-Aliasing and Contrast Adaptive Sharpening render graph nodes public so custom pipelines can use them. S-Ready-For-Final-Review.^[https://github.com/bevyengine/bevy/pull/24456]
  • rc.2 remains the latest pre-release. 0.19 final is drifting — open issues grew from 8 (May 23) to 23 (May 27) without corresponding closures.

2026-05-29 engine changes

🔥 Merge train resumes — 8 PRs merged in one day

After 6 consecutive days with zero functional merges, the merge queue burst open with 8 PRs merged on May 29. This is the most active single day since May 22 (rc.2 release day).^[https://github.com/bevyengine/bevy/issues?q=is:pr+is:merged+merged:2026-05-28..2026-05-29]

UI — bevy_ui_widgets dependency fix (#24472)

  • #24472 (amtep, A-UI, C-Bug, D-Trivial). Fixes #24369 — app panicked when started with bevy_ui_widgets or bevy_feathers feature but without ui feature. The missing feature dependencies caused required resources to be absent.^[https://github.com/bevyengine/bevy/pull/24472]
  • Fix adds the needed features as feature dependencies in Cargo.toml.

Rendering — TAA and CAS nodes public (#24456)

  • #24456 (nyaalexx, A-Rendering, C-Usability, D-Trivial). Makes TaaPipeline and related TAA/CAS functions public, matching the existing public exposure of FXAA/SMAA from #24225.^[https://github.com/bevyengine/bevy/pull/24456]
  • Follow-up to #24225. Custom render pipelines can now reference TAA/CAS nodes directly.
  • cart noted that making struct fields public can wait — consistent with other pipeline patterns.

Scenes — FromTemplate → Default + Clone (#24440)

  • #24440 (hxYuki, A-Scenes, D-Straightforward). Fixes #24416 — TilemapChunkTileData could not be used in template_value because it derived FromTemplate unnecessarily. Also fixed ScrollbarThumb.^[https://github.com/bevyengine/bevy/pull/24440]
  • The documentation states Default + Clone should be preferred when component construction doesn’t reference world/spawn context.

Dev-tools — DiagnosticsOverlay moved to PreStartup (#24433)

  • #24433 (kfc35, A-Dev-Tools, C-Bug). Fixes #24377 — diagnostics overlay broken. The overlay plane was created in Startup, but observers that depend on it could also run in Startup, causing silent race conditions.^[https://github.com/bevyengine/bevy/pull/24433]
  • Fix: moved setup to PreStartup schedule, guaranteeing the plane entity exists before any Startup observers fire.
  • Key insight: Plugin setup that must be globally available before other plugins’ Startup systems should use PreStartup.

ECS — Immutable Resources API fix (#24424)

  • #24424 (Trashtalk217, A-ECS, D-Straightforward). Fixes #24285 by adding missing mutable resource APIs for the immutable resources feature (#24164):^[https://github.com/bevyengine/bevy/pull/24424]
    • UnsafeWorldCell::get_resource_mut_assume_mutable<R>() -> Option<Mut<'w, R>>
    • World::modify_resource
    • World::modify_resource_by_id
  • chescock suggested get_resource_mut should delegate to get_resource_mut_assume_mutable (patterned after UnsafeEntityCell::get_mut).

ECS — SystemParam for SmallVec (#24405)

  • #24405 (Shatur, A-ECS, C-Usability). Implements SystemParam for SmallVec<[T; N]>, enabling stack-allocated variable-length system parameters that avoid heap allocation when the number of parameters is small.^[https://github.com/bevyengine/bevy/pull/24405]
  • Motivated by scripting integration where dynamic system parameter counts need zero-allocation behavior for small counts.
  • chescock explored a zero-allocation-per-run Vec alternative (“SomethingVec”) using raw pointer buffer reuse — not part of this PR but preserved as reference for future work.

Rendering — SortedRenderPhase::add renamed to add_retained (#24404)

  • #24404 (kristoff3r, A-Rendering, D-Straightforward). Breaking change: renames SortedRenderPhase::add to add_retained, forcing old code to not compile.^[https://github.com/bevyengine/bevy/pull/24404]
  • The add method’s semantics silently changed in #22966 from “cleared at frame end” to “retained until removed”. This rename makes the semantic change visible at compile time.
  • Developers must now explicitly choose add_retained() (persistent) or add_transient() (old behavior).
  • Migration guide updated via #24408.

Docs — Change list migration guide (#24408)

Performance regression #24448 — root cause identified, no fix yet

  • Root cause confirmed: commit 894d8d7 from PR #23481 (“Unpack bins belonging to multidrawable batch sets on the GPU instead of on the CPU”).^[https://github.com/bevyengine/bevy/issues/24448]
  • Bisected by amtep: 170 fps before 894d8d7, drops to ~105 fps at that commit, recovers slightly to ~115 fps on current main.
  • PR #23662 tested and REJECTED: “Move MeshUniform allocation from CPU to GPU” worsened performance by +14.12ms mean.
  • Status: S-Waiting-on-SME. Awaiting subject matter expert decision on whether to revert, fix, or accept the regression.

0.19 milestone status

  • 480/495 (~97.0%), 15 open. First net-closure day since May 23. 14 items closed today (8 merged PRs + related issue closures). Scope expanded by 5 new items to 495 total.^[https://github.com/bevyengine/bevy/milestone/40]
  • New milestone items: #24474 (ScenePatchInstance for queued scenes, by cart), #24473 (bsn caching error, by laundmo), #24464 (bsn docs, by laundmo — Draft).
  • Remaining 15 open items include: performance regression (#24448), gizmo bugs (#24429, #24431), UI/Scene fixes (#24356, #24320, #24299), docs (#24283), open PRs (#24407, #24406, #24402, #24362, #24381).

New open issues (not in milestone)

  • #24471 (Sapein, C-Feature) — Allow setting what monitor a window is on via OnMonitor Relationship.
  • #24470 (larsraph) — Proposed alternative RemoteFreeList for EntityIndexAllocator. ECS internal optimization proposal.
  • #24469 (adamthedash, C-Bug) — Enums not working in bsn! macro without explicit FromTemplate derive. Directly related to today’s #24440 merge.
  • #24468 (Liburia, C-Feature) — Allow custom GPU diagnostics buffer size.
  • #24466 (hxYuki, C-Feature) — Write actual metadata into meta files with asset_processor feature.
  • #24465 (Name::from<&str> always heap-allocates) — Performance footgun in Name component.

0.19 release outlook

  • rc.2 (May 22) remains the latest pre-release.
  • Today’s 14 closures are the strongest progress signal in a week.
  • Performance regression (#24448) remains the biggest potential blocker — no fix yet.
  • If the remaining 15 open items can be closed within the next few days, 0.19 final is achievable.

2026-05-30 engine changes

Merge train continues — 4 more PRs merged

After yesterday’s burst of 8 merges, 4 more PRs merged on May 29-30. The merge queue is actively processing the backlog.^[https://github.com/bevyengine/bevy/pulls?q=is%3Apr+is%3Amerged+merged%3A2026-05-29..2026-05-31]

Gizmos — Transform gizmo local snapping fix (#24486)

  • #24486 (bugsweeper, 0.19, A-Gizmos, C-Bug, D-Straightforward). Fixes #24431 — the tracked rc.2 regression where transform gizmo local-space translation snapping was broken on rotated entities.^[https://github.com/bevyengine/bevy/pull/24486]
  • Root cause: snap_axis operated on individual x/y/z world-space components. For rotated entities, a local axis can affect multiple world components simultaneously, so component-wise snapping produces incorrect results.
  • Fix: Snap the scalar drag distance along the selected gizmo axis normal (projection-based), instead of snapping individual position components. Works correctly in both world and local space.
  • Approved by laundmo and cart. cart commented: “Works with every case I could throw at it.”
  • One of two rc.2 gizmo regressions resolved. #24429 (scale gizmo at scale 0) remains open.

Scenes — BSN caching syntax validation (#24473)

  • #24473 (laundmo, 0.19, A-Scenes, C-Usability). BSN macro now throws a compile error when caching syntax is used on scene entries that don’t support it.^[https://github.com/bevyengine/bevy/pull/24473]
  • Design goal: easy to remove once caching is implemented for additional cases. Currently caching is NOT enabled — this is validation-only groundwork.
  • Includes a workaround commit for Rust trait error ergonomics (related upstream issue rust-lang/rust#141258). The author notes the resulting error message is “far from ideal” but the hint is correct.
  • Approved by cart and alice-i-cecile.

Diagnostics — Remove false positive morph target error (#24407)

  • #24407 (kristoff3r, 0.19, A-Diagnostics, D-Trivial). Removes spurious error log when unloading mesh assets that never had morph targets allocated.^[https://github.com/bevyengine/bevy/pull/24407]
  • Root cause: An image is allocated only if the mesh has morph targets, but the unload path always tried to find the image and logged an error if absent — even when it was never allocated.
  • greeble-dev noted a more correct fix would be giving unload_asset access to RenderMesh::morph_targets, but this log isn’t important enough to justify the API change. Approved by cart.
  • No testing performed (trivial removal).

ECS — RelationshipHookMode for BundleWriter (#24406)

  • #24406 (eugineerd, 0.19, A-ECS, D-Straightforward). Adds BundleWriter::write_with_relationship_hook_insert_mode method and #[track_caller] annotation.^[https://github.com/bevyengine/bevy/pull/24406]
  • Problem: BundleWriter::write used RelationshipHookMode::Run by default, which breaks RelationshipTarget ordering when mapping entities during batch insertion on existing entities (e.g. cloning).
  • Solution: New method accepts a RelationshipHookMode argument. Original write method signature unchanged (no breaking change).
  • Context: Default Run mode is correct for BSN spawning (all entities are new). Alternative modes (e.g. RunIfNotLinked) are needed when inserting relationships into existing entities, as EntityCloner does. Future work: port EntityCloner’s custom BundleScratch implementation to use this new standardized API.
  • Approved by kfc35, urbenu1680, cart. Cart requested revision from direct argument to new method — author complied.

2026-06-01 engine changes worth tracking

Gizmos — Scale gizmo snap minimum fix (second rc.2 regression resolved)

  • #24477 MERGED (kfc35, May 31, 0.19, A-Gizmos, D-Straightforward). Fixes #24429 — scale gizmo broke when target entity was scaled to 0. Snapped scale values now have a minimum of snap_scale (not MIN_SCALE), preventing the transformation from becoming degenerate (which breaks GlobalTransform rotation extraction).^[https://github.com/bevyengine/bevy/pull/24477]
  • Both rc.2 gizmo regressions are now resolved: #24431 (local snapping, fixed May 30 by #24486) and #24429 (scale at 0, fixed May 31 by #24477).

BSN — Entity deduplication fix + name expression removal

  • #24402 MERGED (laundmo, May 31, 0.19, A-ECS, A-Scenes, C-Bug, D-Domain-Expert). Fixes a bug from #24174 where named entity references (#Name) caused accidental deduplication when the same bsn! macro was called multiple times — only one entity would spawn instead of multiple.^[https://github.com/bevyengine/bevy/pull/24402]
  • Solution: Runtime per-call-site counter incremented with each macro invocation. Counter only included when #Name references are used.
  • #{expr} name expressions REMOVED entirely. Cart argued they added complexity without sufficient value. Workaround: use Name({...}) or #Root + Children patterns instead. See bsn.
  • Performance: ~4% regression in named_entity_reference benchmark, but overhead disappears when names aren’t used.

Rendering — VisibilityRange stable buffer indices (GPU HLOD correctness)

  • #24381 MERGED (stuartparmenter, May 31, 0.19, A-Rendering, C-Bug, D-Modest). Fixes GPU-driven HLOD culling corruption where VisibilityRange meshes intermittently vanished or rendered with wrong LOD/crossfade.^[https://github.com/bevyengine/bevy/pull/24381]
  • Root cause: RenderVisibilityRanges::clear() rebuilt index table every frame, reassigning buffer indices. Meshes kept stale indices after rebuild.
  • Solution: Buffer indices now stable for app lifetime — never reassigned, never reused. No public API or shader changes. Approved by kfc35 and IceSentry.

BSN — SystemId scene templating (new feature)

  • #24087 MERGED (ItsDoot, Jun 1, merged by alice-i-cecile). New SystemIdTemplate type for passing SystemId into bsn! scene templates, analogous to HandleTemplate.^[https://github.com/bevyengine/bevy/pull/24087]
  • Additive API — 184 additions / 2 deletions. Enables full BSN migration of code using Commands::register_system() in Bundle constructors.

0.19 milestone status

  • 492/499 (98%), 7 open. Down from 485/497 (97.6%, 12 open) on May 30.
  • Both rc.2 gizmo regressions resolved. No known crash regressions.
  • rc.2 (May 22) still latest pre-release. 0.19 final is very close.