{"record":{"id":"eba2b8ea42fc0054","repo":"bevyengine/bevy","slug":"the-timesender-channel-should-always-be-empty-duri","errorCode":null,"errorMessage":"The TimeSender channel should always be empty during render. You might need to add the bevy::core::time_system to your app.","messagePattern":"The TimeSender channel should always be empty during render\\. You might need to add the bevy::core::time_system to your app\\.","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/bevy_render/src/lib.rs","lineNumber":527,"sourceCode":"\nfn renderer_is_ready(state: Res<RenderState>) -> bool {\n    matches!(*state, RenderState::Ready)\n}\n\nfn run_render_schedule(world: &mut World) {\n    world.resource_scope(|world, order: Mut<RenderScheduleOrder>| {\n        for &label in &order.labels {\n            let _ = world.try_run_schedule(label);\n        }\n    });\n}\n\nfn send_time(time_sender: Res<TimeSender>) {\n    // update the time and send it to the app world regardless of whether we render\n    if let Err(error) = time_sender.0.try_send(Instant::now()) {\n        match error {\n            bevy_time::TrySendError::Full(_) => {\n                panic!(\n                    \"The TimeSender channel should always be empty during render. \\\n                            You might need to add the bevy::core::time_system to your app.\"\n                );\n            }\n            bevy_time::TrySendError::Disconnected(_) => {\n                // ignore disconnected errors, the main world probably just got dropped during shutdown\n            }\n        }\n    }\n}\n\n/// Inserts a [`FutureRenderResources`] created from this [`RenderCreation`].\n///\n/// Returns true if creation was successful, false otherwise.\nfn insert_future_resources(render_creation: &RenderCreation, main_world: &mut World) -> bool {\n    let primary_window = main_world\n        .query_filtered::<&RawHandleWrapperHolder, With<PrimaryWindow>>()\n        .single(main_world)","sourceCodeStart":509,"sourceCodeEnd":545,"githubUrl":"https://github.com/bevyengine/bevy/blob/396ca727080776bd313bb892423b7d94e03b81b4/crates/bevy_render/src/lib.rs#L509-L545","documentation":"The render app's `send_time` system pushes `Instant::now()` to the main world through the capacity-1 `TimeSender` channel each frame; the main world's `time_system` drains it between frames. If the channel is still full when the render app runs, `try_send` fails with `TrySendError::Full` and the system panics: the receiving time pipeline never ran, typically because `TimePlugin`/bevy's `time_system` was removed or a custom runner skips it.","triggerScenarios":"Disabling or omitting `TimePlugin` (and its `time_system`) while still running the RenderApp; a custom runner that invokes the render app more often than it runs the main world's time system.","commonSituations":"Custom app runners (editor-like loops, headless render farms) that drive rendering manually; `DefaultPlugins.build().disable::<TimePlugin>()` setups that still add render plugins.","solutions":["Keep `TimePlugin` (part of DefaultPlugins) in the main app","In a custom runner, run the main world's `time_system` every frame before rendering","Never run the render app twice per main-world update"],"exampleFix":"# before\nApp::new()\n    .add_plugins(DefaultPlugins.build().disable::<TimePlugin>())\n    .add_plugins(bevy::render::RenderPlugin::default());\n\n# after\nApp::new().add_plugins(DefaultPlugins); // keep TimePlugin alive","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep TimePlugin enabled whenever the RenderApp runs","In custom runners, run the main world's time_system every frame before rendering","Never invoke the render schedule more often than the main world updates"],"tags":["bevy","time","render-app","channel","panic"],"backgroundTag":"bounded-channel-full","analyzedSha":"396ca727080776bd313bb892423b7d94e03b81b4","analyzedAt":"2026-08-20T16:12:39.808Z","contentChangedAt":"2026-08-20T16:12:39.808Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}