reflex-base Changelog
v0.9.6.post1 (2026-06-26)
Features
- Added the
REFLEX_EXTRA_PLUGINSenvironment variable, a colon-separated list of fully qualified plugin import paths appended to the config'spluginslist. UnlikeREFLEX_PLUGINS, which replaces the list entirely, this preserves plugins configured inrxconfig.py; an entry is skipped when a plugin of the same type is already present or when its type is listed indisable_plugins. (#6685)
Bug Fixes
- Stop warning when a non-built-in plugin is listed in
disable_plugins, so config can opt out of an env-provided plugin without a spurious warning. (#6685) - Improve error message when plugin spec from environment cannot be used. (#6685)
v0.9.6 (2026-06-25)
Features
StringVarnow includeslstripandrstripmethods. Thestripmethod now accepts an optionalcharsargument for consistency with Python’s str API. (#5417)- Added
reflex_base.utils.memo_paths, which translates a memo's Python source module into the mirrored.web/app_components/JSX path and$/...library specifier used by the compiler. The memo component and compiler plugin now route each memo's compiled output through these helpers so it lands alongside its source module's layout, falling back to the per-nameutils/components/<name>path when the module can't be mirrored. The helpers also derive a per-module-unique JS symbol for each mirrored memo, and the memo registry is keyed by(name, source module)so same-named memos defined in different modules coexist instead of colliding. (#6457) ObjectVarattribute access now resolvesHybridPropertydescriptors defined on the underlying type, evaluating the property's frontend logic with the object var substituted asself.HybridPropertymoved toreflex_base.vars.hybrid_property(still available asrx._x.hybrid_property). (#6617)- Add
AgentsMdconstants (canonical URL, managed-section markers, andCLAUDE.mdbridge) supportingreflex initAGENTS.md generation. (#6620) - Added
HybridPropertyError, raised when a hybrid property's frontend logic accesses a backend (underscore-prefixed) var on a state while building its frontend var. (#6621) package_json_templateaccepts**additional_keysto include extra fields (e.g.name,packageManager,engines) in the rendered package.json. (#6658)
Bug Fixes
- Preserve extra bound event arguments when
rx.upload_filesis used in an upload handler. (#5290) - Avoid re-entering config loading when a
Statesubclass is defined inrxconfig.py. (#6662) - Bump the bundled
vitedev dependency to 8.0.16, fixing aserver.fs.denybypass on Windows alternate paths (CVE-2026-53571) in the dev server of generated apps. (#6665) pyi_hashes.jsonentries are now computed from the final.pyicontent afterruff format/ruff check --fixpost-processing, instead of the intermediate generator output. A pyi_generator change that only affects pre-format output no longer flags hash changes for stubs whose final content is identical.
Miscellaneous
Componentgained a private_get_tag_name()helper returning the JS expression that references the component's tag (quoted for global-scope DOM tags without a library);Component._renderandDebounceInputnow share it instead of duplicating the quoting logic. (#6637)
v0.9.5 (2026-06-10)
Features
- Event-argument type checking now treats a mapping-style payload as compatible with a
TypedDict-annotated callback parameter, scoped narrowly toon_submittriggers whose payload is aMapping[str, ...]so unrelated mapping events are unaffected. Adds theFORM_SUBMIT_MAPPINGtype var (exposed on the event namespace andpyi_generator's default imports) and aComponent._is_form_controlclass marker that a component sets to declare it contributes a named field to form submission data. (#6301) VarDatagained anapp_wrapsfield so aVarcan declare the app-level wrapper components it requires; the compiler injects them around the app root, deduped by(priority, tag). This is how the state and event-loop providers now reach the React tree, since event dispatch reachesaddEventsvia a module-level import (Imports.EVENTS) rather than a hoisted hook. The still-reactiveconnectErrorsvalue moves to its ownCONNECT_ERRORSimport/hook, andComponentdeep copies now drop the render cache so compile-time clones (e.g. the app-root wrapper chain) render their mutated children. (#6447)- Added a
hydrate_fallbackconfig option (settable via theREFLEX_HYDRATE_FALLBACKenvironment variable), a dotted import path to a callable returning the component shown while the page is hydrating. The app root template now emits a React RouterHydrateFallbackexport when a fallback is provided, and the import-path resolution shared withextra_overlay_functionresolves nested module paths correctly. (#6630) - Added the
REFLEX_HOT_RELOAD_OVERRIDE_PATHSenvironment variable, a colon-separated list of paths that, when set, fully replaces the paths watched for hot reload in dev mode. (#6639)
Bug Fixes
- The
reflex_base.utils.pyi_generatorbuild-hook entrypoint no longer rewritespyi_hashes.json: it only emits the.pyistubs bundled in the wheel, so building a component package (or the build triggered byuv sync) no longer wipes the hash registry down to a single package's entries. The scanner also tolerates source-less modules (e.g. an empty__init__.py) instead of raisingOSErroron Python < 3.13. (#6614) - Fixed
State.router.urlreflecting a stale query string after the URL was changed withwindow.history.replaceState/pushState(e.g. fromrx.call_script). React Router's location does not observe direct history manipulation, so the query and hash are now read from the livewindow.locationwhen buildingrouter_data, and the next event sent to the backend reports the correct URL (the path stays basename-relative sofrontend_pathis not applied twice; embedded apps keep using the in-widget memory router). A direct history mutation is intentionally not a navigation and does not itself emit an event — userx.redirect(..., replace=True)when you need the URL change to update the router reactively and triggeron_load. (#6625) - pyi_generator no longer includes underscore-prefixed props in generated .pyi files. (#6628)
- Frontend-only events (e.g.
rx.toast,rx.redirect) returned from a middleware'spreprocessare now emitted to the client instead of being enqueued on the backend event queue, where they had no registered handler and raisedKeyError. The frontend/backend split that already applied to handler-yielded events is now shared via a_route_eventshelper and applied to middleware-preprocess updates too. (#6644)
Performance
- Speed up component creation by resolving field defaults lazily (via class-level descriptors) instead of eagerly on every instance, caching each component class's event triggers, and memoizing
to_camel_case. (#6576)
v0.9.4 (2026-06-03)
Deprecations
- Component-returning
@rx.memoagain acceptskeywithout anrx.RestProp(with a deprecation warning), sorx.foreachcall sites that set the reactkeykeep working; this fallback is removed in 1.0. Other base props (id,class_name,style,custom_attrs,ref) and identity fields liketag/librarystill raise — declare anrx.RestPropto forward them.
Features
- Dependency tracking now follows through hybrid properties, so computed vars that read a
hybrid_propertycorrectly recompute when the underlying state vars change. (#3806) - The component memo implementation now lives in
reflex_base.components.memoand is exported asrx.memo. AddedEMPTY_VAR_STRandEMPTY_VAR_INTsentinel vars as memo-friendly defaults. (#6517)
Bug Fixes
- Pin
[email protected]via package overrides to work around upstream breakage in recharts and es-toolkit. (#6570) - Unpin
[email protected]via package overrides and bump vite to 8.0.14 to work around upstream breakage in recharts and es-toolkit. (#6571)
Miscellaneous
- Removed the
Templates.CHOOSE_TEMPLATESandTemplates.REFLEX_TEMPLATES_URLconstants, which supported the now-removed open-source templatesreflex initoption. (#6592)