Breaking Changes
- A
RegistrationContextcan only be associated with a singleAppinstance, so creating a second barerx.App()in one process now raisesReflexRuntimeError(0.9.8 allowed it); use a freshRegistrationContext(e.g.RegistrationContext.fork()) to create multiple apps. The module-levelreflex.page.DECORATED_PAGESregistry has moved onto the activeRegistrationContextasdecorated_pages; reading the old name still works as a deprecated shim that is removed in 1.0. (#6382)
Deprecations
reflex.components.dynamic.bundled_librariesandDEFAULT_BUNDLED_LIBRARIESare deprecated (removal in 1.0) but keep working: reading either emits a deprecation warning and resolves against the activeRegistrationContext. UseRegistrationContext.ensure_context().bundled_librariesto read the list, orbundle_library()/reset_bundled_libraries()to modify it. (#6967)reflex.page.DECORATED_PAGESis deprecated (removal in 1.0) but keeps working: reading it emits a deprecation warning and resolves to a mapping of the app name to the activeRegistrationContext'sdecorated_pageslist of(render_fn, kwargs)entries. UseRegistrationContext.ensure_context().decorated_pagesinstead. (#6985)
Bug Fixes
- Cancelling stale
on_loadwork on navigation also applies toon_loadhandlers that are background tasks (@rx.event(background=True)): navigating away now cancels such a task mid-flight, where 0.9.8 let it run to completion. Background tasks started from regular (non-superseding) events are unaffected. (#6593) - Reduce published wheel and sdist size by removing misplaced generated artifacts. (#6966)
- A
client_errorsocket emit with no payload no longer raises an unhandledTypeErrorinside python-socketio's dispatch, which let any connected socket — even one without a valid token — spam asyncio tracebacks into the backend logs past the handler's rate limits. A missing payload is now dropped by the same guard that handles other malformed payloads. (#6984) - Console warnings and errors no longer print literal backslash-escaped brackets (e.g.
dict\[str, str]). The rich-markup escapes were left over from the legacy console helpers, but the logging pipeline renders messages with markup disabled, so bracketed type names now print verbatim.VarAttributeErrormessages drop the same escapes. (#6989) reflex runno longer hangs forever when a fatal error (e.g. the node minimum-version check on the npm path) exits the frontend worker thread while the backend blocks the main thread; the failure now interrupts the main thread and the CLI exits promptly with the original error. (#6990)- Fixed an edge in the new fatal-error interrupt handling where a task failing after the with-body raised its own exception could deliver a stray SIGINT to unrelated caller code. (#6994)
Performance
- The generated
vite.config.jsnow declares a hook filter on the plugin that redirectsreact-dom/servertoreact-dom/server.node, so the bundler no longer calls into it for every import in the module graph — on the Reflex docs site that was ~15,800 calls per build to rewrite a single specifier. The local plugin import in the config also carries a file extension now, silencing Vite's warning about features its native config loader cannot resolve. (#6959)