fix(deps): update dependency reflex to >=0.9.12 - #489
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
renovate
Bot
force-pushed
the
renovate/reflex-0.x
branch
2 times, most recently
from
August 29, 2026 01:56
681cd09 to
cdab179
Compare
renovate
Bot
force-pushed
the
renovate/reflex-0.x
branch
from
September 2, 2026 01:12
cdab179 to
d34a33e
Compare
renovate
Bot
force-pushed
the
renovate/reflex-0.x
branch
from
September 2, 2026 08:12
d34a33e to
d453c63
Compare
renovate
Bot
force-pushed
the
renovate/reflex-0.x
branch
from
September 8, 2026 19:48
d453c63 to
8055657
Compare
renovate
Bot
force-pushed
the
renovate/reflex-0.x
branch
from
September 12, 2026 01:01
8055657 to
0be7bcd
Compare
Contributor
|
Important Review skippedBot user detected. To trigger a single review, invoke the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
renovate
Bot
force-pushed
the
renovate/reflex-0.x
branch
2 times, most recently
from
September 15, 2026 21:31
65e4a95 to
d91a569
Compare
renovate
Bot
force-pushed
the
renovate/reflex-0.x
branch
from
September 22, 2026 05:45
d91a569 to
de3472a
Compare
renovate
Bot
force-pushed
the
renovate/reflex-0.x
branch
from
September 25, 2026 00:58
de3472a to
f794bd8
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
>=0.8.28.post1→>=0.9.12Release Notes
reflex-dev/reflex (reflex)
v0.9.12Compare Source
Breaking Changes
rx_router_session,rx_router_headers,rx_router_page,rx_router_urlandrx_router_route_id. A substate that declares one of these names now raisesBaseVarShadowsInheritedVarError, the same error any other shadowed inherited var raises, and must rename its field.State.routeritself is unchanged. (#7068)BaseVarShadowsInheritedVarErrorat class creation. Such a declaration was silently ignored — reads and writes resolved to the parent's var and class-level access returned the raw default instead of a reactiveVar. Rename the substate var to fix the error. (#7077)state.dict()and the state deltas no longer carry a singlerouterentry: the root state now serializesrx_router_session,rx_router_headers,rx_router_page,rx_router_urlandrx_router_route_idinstead (each with the usual field-marker suffix). Code that read or rewrote therouterentry of a state dict or delta — for example to redact request headers before returning state over an API — must read those five entries instead.State.routeritself is unchanged for app code. (#7215)Deprecations
routervar (deps=["router"]) is deprecated; depend on the router Var instead, e.g.deps=[State.router.url]for a single field ordeps=[State.router]to keep tracking all of them. (#7068)Bug Fixes
rx.form.control(..., as_child=True)so they receive the parent form's attributes and their values appear in submitted form data. (#6850)@rx.pageand compiled metadata. (#6923)reflex runwith SIGTERM no longer reports "Starting frontend failed with exit code 143" and now exits cleanly. (#6981)frontend_path, and compress the final merged output. (#7078).pyistubs now type a prop declared as a union —content: Var[str] | Component, say — as optional, matching theNonedefault thatcreate()gives every prop. Type checkers previously reported the generated signature itself as an error. (#7080)rx.Model(e.g.class Item(rx.Model, table=True)) without thedbextra installed now raises the guided "pip install reflex[db]"ImportErrorinstead of a bareTypeErrorfrom__init_subclass__. (#7083)@masenf/hello-react@../hello-reactand@masenf/hello-react@../hello-react.tgzbeing truncated at the first slash (to@masenf/hello-react@..) before reaching the package manager, so wrapping a React package from a local directory or archive now installs correctly. (#7117)REFLEX_USE_NPM) no longer leavesreflex.lock/in a state that makes the next run fail withbun install --frozen-lockfile: lockfile had changes. Only the lockfile of the package manager that actually ran is kept. (#7129)_get_was_touched. (#7132)AttributeError: 'method' object attribute '__call__' is read-onlywhen ASGI instrumentation that wraps middleware is active, such as sentry-sdk's Starlette integration. (#7139)frontend_pathtext, such as/appleunderfrontend_path="/app", instead of treating them as 404. (#7153)StateManagerDisk.set_stateto persist and cache state instances that were not obtained fromget_state, and debounced writes now flush the latest supplied value instead of the first one queued. (#7159)@rx.memocomponents dropping the app wraps their body requires. Providersrequested by a nested child, or through var data as
rx.upload'sUploadFilesProvideris, now reach the app root — so a provider-backedcomponent behaves the same inside a memo as inlined into the page. (#7176)
/_healthendpoint instead of opening and closing a new TCP connection on every probe. (#7187)reflex run --jsonstdout valid JSON lines. (#7193)error: restartWithMergedOptions() was called, but the process has already been restarted.). (#7202)type(rx.State)isreflex.vars.BaseStateMetaagain, so a state declared with its own metaclass derived fromBaseStateMeta(class MyState(rx.State, metaclass=MyMeta)) no longer raisesTypeError: metaclass conflict. The reserved-state-name validation is unchanged: it now runs fromBaseStateMetaitself for every subclass ofrx.State. (#7215)@rx.var(cache=False)value that a downstreamget_deltaoverride keeps out of the delta is now delivered as soon as the override stops withholding it, instead of being deduplicated away until the value changes again. Uncached var values only count as sent to the client once the delta that carries them is actually delivered. (#7216)page. In production builds with the badge on, the badge swallowed every
lower-priority app wrap, so
rx.data_editor's<div id="portal" />neverreached the DOM and its overlay cell editors — including the new image preview —
could not open. (#7218)
self.routernow enforce the same mutation guards as direct state-field access. (#7230)Performance
@rx.var(cache=False)vars now remember what they last sent to the frontend. They are still recomputed on every state update, but the value is only included in the delta when it actually changed, so an uncached var whose value stays the same no longer causes needless network traffic and re-renders. (#6946)Reduce development startup and reload time and memory by deferring unused database, admin, and compiler imports in the backend launcher and state mutation tracking, and by avoiding redundant app preloads in spawned Granian supervisors. (#7049)
Store router data in separate base vars (session, headers, page, url, route_id) so a navigation delta only re-sends the fields that changed instead of the whole router, and gather the connection-scoped router data (headers, client IP, session id) once at connect time rather than on every event.
State.routeris unchanged for app code.The page URL is also persisted as the URL itself rather than as its parsed pieces:
ReflexURLandURLDatare-split on the way out of the state store instead of writing scheme, netloc, origin, path, query, query parameters and fragment alongside the href on every state write. (#7068)Preload the global stylesheet so browsers can discover render-blocking CSS alongside early resource hints. (#7078)
Honor
frontend_lazy_bundled_librarieswhen compiling the app root so optional dynamic-component namespaces do not force their full exports into every page's initial bundle. (#7078)Reduce
reflex runandreflex exportmemory: the vite/react-router processes no longer keep their dependency pre-bundling arena resident (MIMALLOC_ARENA_EAGER_COMMIT=0, overridable from the environment), and error telemetry is sent throughurllibso backend workers never importhttpx. (#7112)Speed up compilation by reading only the props a component sets, caching literal Var dispatch by value type, and trimming render and app-wrap bookkeeping. (#7121)
Share one event chain per handler and trigger across call sites, and reuse memoized event wrappers by chain identity during compilation. (#7122)
Documentation
docker-exampledeployments for current Reflex and consolidate them intoproduction,production-compose, andapp-platform-backend, with smaller images, clean SIGTERM shutdown, and no build tooling at runtime. The two-port example is gone since prod mode now serves the frontend and backend on one port; the self-hosting docs are updated to match. (#7140)v0.9.11.post1Compare Source
No significant changes.
v0.9.11Compare Source
Breaking Changes
Features
traceparentinto event spans, count websocket connections and message sizes, and wrap the ASGI app when thereflex-otelinstrumentor is active. (#6227)Bug Fixes
field()on a base class instead of silently becomingNone, and an error raised by that field'sdefault_factorysurfaces instead of being swallowed. (#6812)hybrid_property) now runs its setter instead of raisingSetUndefinedStateVarError. (#6812)rxconfig.py(and mutatingsys.path) off-thread. (#6960)reflex.testingimportable without test-only dependencies and provide atestingextra forAppHarness. (#6974)__dataclass_params__and__match_args__on their class alongside__dataclass_fields__, so code that inspects a dataclass through the class — reading thefrozen/eqflags or the positional field names afterdataclasses.is_dataclass— no longer raisesAttributeErroron a proxied value. (#7014)AdminDashnow works with starlette-admin 1.0, which renamed the SQLAlchemyAdmin(engine=...)argument tosession_provider. Both starlette-admin 0.x and 1.x are supported. (#7019)FileNotFoundErrororFileExistsErrorwhile linking arx.asset(shared=True)file intoassets/external/. A shared asset whose link already points at a different file is repointed at the asset rather than left alone. (#7039)reflex run --env prodandreflex exportno longer fail withFileNotFoundErrorwhenfrontend_pathis set and route prerendering is disabled (REFLEX_SSR=false), and no longer fail on Windows withcannot instantiate 'PosixPath'wheneverfrontend_pathis set. (#7044)utils/context.jsxsoreflex runhot updates keep the state providers mounted; a staleutils/context.jsis removed on the next compile. (#7071)rx.AdminDashpages failing withNoMatchFoundby preserving named route lookup through the application's context middleware. (#7107)bundle_library()registrations through frontend compilation and automatically bundle imports used by initial-state components. Explicitly registered component subpaths can first appear after an event, and initial components such as Lucide icons no longer need a separate registration. (#7109)Performance
REFLEX_DEV_PROD_REACT=1serves React's production build under the Vite dev server (navigation CPU on a large app 54 → 36 ms, prod build 24 ms; edits become a full reload since Fast Refresh needs dev React), andREFLEX_VITE_WARMUP_ROUTES=1pre-transforms route modules at startup so the first visit to a page no longer waits on Vite (105–131 → 43–69 ms, or 20–32 ms with both). (#7021)Miscellaneous
wrapt2.2 and 2.3. (#7019)v0.9.10.post2Compare Source
No significant changes.
v0.9.10.post1Compare Source
No significant changes.
v0.9.10Compare Source
Bug Fixes
v0.9.9.post1Compare Source
No significant changes.
v0.9.9Compare Source
Breaking Changes
pip install reflexno longer installspydantic; pydantic model support activates when it is installed. Use the newreflex[pydantic]extra (orreflex[db]) to keep it. (#6786)rxconfig.pyor app code changes. One change is required if you wrote a custom component againstreact-router-dom: that package no longer exists upstream and is no longer installed, solibrary = "react-router-dom"must becomereact-router(orreact-router/domforRouterProvider/HydratedRouter). (#6854)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. (#6382)Deprecations
reflex.components.dynamic.bundled_librariesandDEFAULT_BUNDLED_LIBRARIESare deprecated (removal in 1.0) but keep working, resolving 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, resolving to a mapping of the app name to the activeRegistrationContext's page registrations. UseRegistrationContext.ensure_context().decorated_pagesinstead. (#6985)Features
App, the loadedConfig,@rx.pageregistrations, and the bundled-library registry are now scoped to the activeRegistrationContextinstead of module-level globals, so multiple apps (and test harnesses) can coexist in one process without leaking registrations into each other. (#6382)client_errorsocket event, logging an actionable error in the terminal instead of failing silently. A frontend/backend state mismatch is fatal for the session: further events stop until the page is reloaded after the frontend is rebuilt orapi_urlis corrected. (#6827)loggingwith per-module loggers (reflex_base.utils.log, re-exported asreflex.utils.log), bootstrapped onimport reflex. Rich colored output is preserved, andREFLEX_LOG_JSONemits machine-readable JSON-lines records.--loglevel criticalno longer prints the system-info banner. (#6863)--json(equivalent toREFLEX_LOG_JSON) to emit machine-readable JSON-lines logs. (#6865)reflex deployaccepts--min-instancesand--max-instancesto set the autoscaling bounds of an app deployed to Google Cloud. Omitted bounds are left unchanged. (#6884)reflex deploygains--gcp-connection, to pick which of your organization's connected GCP accounts an app deploys through;--full-deploy, to serve the frontend from the provider's own container instead of Reflex's CDN; and--strategy, which was previously only settable in the config file. (#6908)displayNamefrom the Python class or@rx.memofunction they came from instead of showing asAnonymous, generated contexts are named (StateContext(reflex___state____state.my_state).Providerrather than an unlabelledContext.Provider), pages are labelled with their route (Component(blog/[slug])), and client-only (NoSSRComponent) wrappers render asClientSide(<Tag>). (#6945)Bug Fixes
on_loadwork no longer blocks or outlives a page navigation: a newer navigation for the same client now cancels the previous page's unfinishedon_loadevent chain, includingon_loadhandlers that are background tasks (@rx.event(background=True)), which 0.9.8 let run to completion. Background tasks started from other events are unaffected. (#6593)[[...splat]]catchall route no longer matches paths that merely share its prefix —posts/[[...splat]]matched/postsomethingas well as/postsand its descendants, so the wrong page'son_loadevents could fire. (#6790)dictannotations onBaseStatethat were shadowed byBaseState.dict, so type checkers resolve them to the builtin. (#6846)reflex runnow pre-enables thedevelopmentexport condition for the dev server viaNODE_OPTIONS/BUN_OPTIONS, fixing the dev server exiting withrestartWithMergedOptions() was called, but the process has already been restartedon installs without node, where react-router 8's CLI re-executes itself to set the condition. (#6857)AppHarnessProdno longer leaksREFLEX_ENV_MODE=prodto devAppHarnessinstances created later in the same process, which made them compile with route prerendering enabled and drop events dispatched during hydration recovery. (#6857)rx.scripthead updates now flush synchronously instead of via react-helmet's requestAnimationFrame batching, fixing intermittently missing script tags after hydration (flaky "scripts not loaded" failures). (#6905)async with selfstill emit their delta, now computed under the state lock. (#6920)AppHarnessstarts the frontend dev server with thedevelopmentexport condition enabled, fixing "Frontend did not start" on node-less (bun-only) installs where react-router's dev CLI restart guard trips. (#6931)RouteValueErrorwhen a static segment lines up with another route's dynamic segment (e.g./posts/all/[x]alongside/posts/[id]). React Router resolves such siblings in favor of the static one, so only two differently named dynamic segments at the same position conflict. The check was also order-dependent: it only tripped when the bracket-carrying route was added second. (#6953)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. (#6984)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, #6994)Performance
asyncio.create_taskwrapper inEventNamespace.emit_update, cutting scheduling overhead roughly in half for every outgoing state update. (#6734)React.captureOwnerStack()returns no owner frames in dev, which affects React DevTools' owner-stack view and custom error overlays built on that API; setREFLEX_REACT_OWNER_STACKS=1to restore them. (#6905)@rx.memocomponents with props bound to state are now auto-memoized at the call site: the state hooks those props need compile into a generated wrapper component instead of the page module. A state change re-renders that wrapper rather than the whole page, and React'smemostops there unless one of the prop values actually changed. (#6949)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. (#6959)Documentation
provider,gcp_connectionandfull_deploycloud config settings, including which settings a Google Cloud target ignores and whyfull_deployis left unset rather than false by default. (#6908)Miscellaneous
package.jsonno longer carries a framework-ownedpostcssoverride; the pinnedpostcssdev dependency already forces a single resolved copy for every transitive requirer. Projects that already installed 0.9.8 keep an inert"postcss": "8.5.23"override inreflex.lock/package.json; it matches the dev-dependency pin, so it changes nothing today and can be deleted by hand. (#6854)ruff0.15.12 -> 0.16.2,pyright1.1.408 -> 1.1.411,typer0.25.1 -> 0.27.1. (#6893)reflex deploycommand implementation moved out of thereflexpackage intoreflex-hosting-cli, so cloud code is no longer shipped inside the framework. Flags and behavior are unchanged, andreflex-hosting-cliremains a dependency ofreflex, soreflex deployandreflex cloudstay available out of the box. If the package is not installed, these commands now report which package to install instead of failing with a missing-command error. (#6924)v0.9.8.post1Compare Source
Features
reflex deployaccepts--min-instancesand--max-instancesto set the autoscaling bounds of an app deployed to Google Cloud. Omitted bounds are left unchanged. (#6884)reflex deploygains--gcp-connection, to pick which of your organization's connected GCP accounts an app deploys through;--full-deploy, to serve the frontend from the provider's own container instead of Reflex's CDN; and--strategy, which was previously only settable in the config file. (#6908)Documentation
provider,gcp_connectionandfull_deploycloud config settings, including which settings a Google Cloud target ignores and whyfull_deployis left unset rather than false by default. (#6908)v0.9.8Compare Source
Breaking Changes
pip install reflexno longer installspydantic; pydantic model support activates when it is installed. Use the newreflex[pydantic]extra (orreflex[db]) to keep it. (#6786)rxconfig.pyor app code changes. One change is required if you wrote a custom component againstreact-router-dom: that package no longer exists upstream and is no longer installed, solibrary = "react-router-dom"must becomereact-router(orreact-router/domforRouterProvider/HydratedRouter). (#6854)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. (#6382)Deprecations
reflex.components.dynamic.bundled_librariesandDEFAULT_BUNDLED_LIBRARIESare deprecated (removal in 1.0) but keep working, resolving 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, resolving to a mapping of the app name to the activeRegistrationContext's page registrations. UseRegistrationContext.ensure_context().decorated_pagesinstead. (#6985)Features
App, the loadedConfig,@rx.pageregistrations, and the bundled-library registry are now scoped to the activeRegistrationContextinstead of module-level globals, so multiple apps (and test harnesses) can coexist in one process without leaking registrations into each other. (#6382)client_errorsocket event, logging an actionable error in the terminal instead of failing silently. A frontend/backend state mismatch is fatal for the session: further events stop until the page is reloaded after the frontend is rebuilt orapi_urlis corrected. (#6827)loggingwith per-module loggers (reflex_base.utils.log, re-exported asreflex.utils.log), bootstrapped onimport reflex. Rich colored output is preserved, andREFLEX_LOG_JSONemits machine-readable JSON-lines records.--loglevel criticalno longer prints the system-info banner. (#6863)--json(equivalent toREFLEX_LOG_JSON) to emit machine-readable JSON-lines logs. (#6865)reflex deployaccepts--min-instancesand--max-instancesto set the autoscaling bounds of an app deployed to Google Cloud. Omitted bounds are left unchanged. (#6884)reflex deploygains--gcp-connection, to pick which of your organization's connected GCP accounts an app deploys through;--full-deploy, to serve the frontend from the provider's own container instead of Reflex's CDN; and--strategy, which was previously only settable in the config file. (#6908)displayNamefrom the Python class or@rx.memofunction they came from instead of showing asAnonymous, generated contexts are named (StateContext(reflex___state____state.my_state).Providerrather than an unlabelledContext.Provider), pages are labelled with their route (Component(blog/[slug])), and client-only (NoSSRComponent) wrappers render asClientSide(<Tag>). (#6945)Bug Fixes
on_loadwork no longer blocks or outlives a page navigation: a newer navigation for the same client now cancels the previous page's unfinishedon_loadevent chain, includingon_loadhandlers that are background tasks (@rx.event(background=True)), which 0.9.8 let run to completion. Background tasks started from other events are unaffected. (#6593)[[...splat]]catchall route no longer matches paths that merely share its prefix —posts/[[...splat]]matched/postsomethingas well as/postsand its descendants, so the wrong page'son_loadevents could fire. (#6790)dictannotations onBaseStatethat were shadowed byBaseState.dict, so type checkers resolve them to the builtin. (#6846)reflex runnow pre-enables thedevelopmentexport condition for the dev server viaNODE_OPTIONS/BUN_OPTIONS, fixing the dev server exiting withrestartWithMergedOptions() was called, but the process has already been restartedon installs without node, where react-router 8's CLI re-executes itself to set the condition. (#6857)AppHarnessProdno longer leaksREFLEX_ENV_MODE=prodto devAppHarnessinstances created later in the same process, which made them compile with route prerendering enabled and drop events dispatched during hydration recovery. (#6857)rx.scripthead updates now flush synchronously instead of via react-helmet's requestAnimationFrame batching, fixing intermittently missing script tags after hydration (flaky "scripts not loaded" failures). (#6905)async with selfstill emit their delta, now computed under the state lock. (#6920)AppHarnessstarts the frontend dev server with thedevelopmentexport condition enabled, fixing "Frontend did not start" on node-less (bun-only) installs where react-router's dev CLI restart guard trips. (#6931)RouteValueErrorwhen a static segment lines up with another route's dynamic segment (e.g./posts/all/[x]alongside/posts/[id]). React Router resolves such siblings in favor of the static one, so only two differently named dynamic segments at the same position conflict. The check was also order-dependent: it only tripped when the bracket-carrying route was added second. (#6953)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. (#6984)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, #6994)Performance
asyncio.create_taskwrapper inEventNamespace.emit_update, cutting scheduling overhead roughly in half for every outgoing state update. (#6734)React.captureOwnerStack()returns no owner frames in dev, which affects React DevTools' owner-stack view and custom error overlays built on that API; setREFLEX_REACT_OWNER_STACKS=1to restore them. (#6905)@rx.memocomponents with props bound to state are now auto-memoized at the call site: the state hooks those props need compile into a generated wrapper component instead of the page module. A state change re-renders that wrapper rather than the whole page, and React'smemostops there unless one of the prop values actually changed. (#6949)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. (#6959)Documentation
provider,gcp_connectionandfull_deploycloud config settings, including which settings a Google Cloud target ignores and whyfull_deployis left unset rather than false by default. (#6908)Miscellaneous
package.jsonno longer carries a framework-ownedpostcssoverride; the pinnedpostcssdev dependency already forces a single resolved copy for every transitive requirer. Projects that already installed 0.9.8 keep an inert"postcss": "8.5.23"override inreflex.lock/package.json; it matches the dev-dependency pin, so it changes nothing today and can be deleted by hand. (#6854)ruff0.15.12 -> 0.16.2,pyright1.1.408 -> 1.1.411,typer0.25.1 -> 0.27.1. (#6893)reflex deploycommand implementation moved out of thereflexpackage intoreflex-hosting-cli, so cloud code is no longer shipped inside the framework. Flags and behavior are unchanged, andreflex-hosting-cliremains a dependency ofreflex, soreflex deployandreflex cloudstay available out of the box. If the package is not installed, these commands now report which package to install instead of failing with a missing-command error. (#6924)v0.9.7Compare Source
Features
default_color_modetorx.Config("system","light", or"dark", also settable viaREFLEX_DEFAULT_COLOR_MODE), so apps can set the initial color mode — and use the built-in color mode switcher andrx.color_mode_cond— without pulling in the large Radix themes CSS. The value drives both the compiledThemeProviderdefault and the pre-hydration preload script, so there is no flash of the wrong theme on first paint. An explicitrx.theme(appearance=...)still takes precedence. (#6716)@rx.memocomponents now compile with a configurable JS wrapper: React'smemoremains the default,wrapper=swaps in a custom functionVarwhose imports ride along into the generated module, andwrapper=Noneemits the bare function component. (#6730)frozen_lockfileconfig option is now honored during frontend package installation: when enabled (the default), bun's initial install runs with--frozen-lockfileso a lockfile out of sync withpackage.jsonfails fast. Setfrozen_lockfile=Falseto let the lockfile update in place instead. npm has no equivalent install flag today, so the option is a no-op there. (#6763)Bug Fixes
ComponentStateclasses and broke frontend hydration (TypeError: d is not a function). (#6710)RedisTokenManagerredis client and cancel its pub/sub background tasks on app shutdown, fixing leaked redis connections (ResourceWarning: unclosed Connection) when the server stops. (#6724)Performance
yield OtherState.handler(rows)) no longer deep-copies payload values that are not attached to any state: only state-boundMutableProxysubtrees are copied, making proxy-free payloads ~5x faster to chain. (#6739)Var.to()andVar.guess_type()resolve their target Var subclass through cached registry lookups instead of scanning the full registry withsafe_issubclasson every call. (#6742)v0.9.6.post2Compare Source
hot fix: Add frozen_lockfile config to control bun lockfile enforcement (#6763)
v0.9.6.post1Compare Source
hot fix: ENG-9923: Add REFLEX_EXTRA_PLUGINS env var to append to plugin list (#6685)
v0.9.6Compare Source
Features
rx.memo) components now compile to.web/app_components/output paths that mirror their defining Python source module (using the real package name, including framework packages) instead of being bundled into a single sharedcomponents.jsx. The compiler's auto-memo registry is scoped per source module, so identical-rendering subtrees in different modules each emit their own output instead of one silently overwriting another, hot-reloads of a module refresh the correct output, and stale memo files are cleaned up when their source changes. Memos whose module can't be mirrored (__main__, unsafe names) fall back to one file per memo at.web/utils/components/<name>.jsx. Each mirrored memo's generated export name also carries a stable per-module suffix, so two memos that share a name in different modules compile to distinct symbols and can be used together on one page without colliding. (#6457)rx._x.hybrid_propertynow works on dataclasses, pydantic models and SQLAlchemy models, not justStateclasses. Accessing the property through an object var on the frontend (e.g.State.info.a_b) renders it as a var, using the same code you already use on the backend. (#6617)reflex initnow writes a Reflex-managed section intoAGENTS.md(fetched from the canonical source and delimited by markers that preserve surrounding user content), and bridges it for Claude Code by creating aCLAUDE.mdimporting@AGENTS.md— or, if aCLAUDE.mdexists without the import, managing the section there directly. (#6620)rx._x.hybrid_propertynow raises a clear error when its frontend logic reads a backend (underscore-prefixed) state var, instead of silently baking the var's server-side default into the frontend. Reference a regular var, or provide a separate frontend implementation with@<name>.var. (#6621)Bug Fixes
reflex.lock/package.jsonto.web/package.jsonbefore installing packages to ensure lock file and package.json are aligned. (#6658)Statesubclass is defined inrxconfig.py. (#6662)starlette>=1.3.1(Host-header path poisoning,request.form()DoS, and UNC-path SSRF),python-multipart>=0.0.32(quadratic-time querystring DoS, unbounded header field size, and negativeContent-Lengthbuffering inparse_form), andgranian>=2.7.4(WSGI and WebSocket header-panic DoS). (#6665)modify_stateto rebindEventContext.tokento the token being modified, so delta resolution and computed vars inside shared-state fan-out tasks observe the correct client token rather than the triggering event's inherited context. (#6673)v0.9.5.post2Compare Source
Bug Fixes
app_wrapcomponents (#6651)v0.9.5.post1Compare Source
Bug Fixes
reflex-components-coredependency to 0.9.5 for compatibility.v0.9.5Compare Source
Bug Fixes
app_wrapcomponents (#6651)v0.9.4Compare Source
Deprecations
rx._x.memois deprecated in favor ofrx.memo. The old name remains a working alias for now; update imports to userx.memodirectly. (#6517)@rx.memonow expects each parameter to be annotated asrx.Var[...](orrx.RestProp/`rx.EventHandleConfiguration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.