reflex v0.9.6 ships alongside reflex-base 0.9.6, reflex-components-core 0.9.6, reflex-components-moment 0.9.2, and reflex-components-plotly 0.9.3.
Features
rx._x.hybrid_propertynow works on dataclasses, Pydantic models, and SQLAlchemy models, not justStateclasses. Accessed through an object var on the frontend (e.g.State.info.a_b), it renders as a var using the same code as the backend β and now raises a clear error if the frontend logic reads a backend (underscore-prefixed) var instead of silently baking in the server-side default. (#6617, #6621)- Auto-memoized (
rx.memo) components now compile to per-module output paths. Each emits to a.web/app_components/path mirroring its defining Python module instead of a single sharedcomponents.jsx, so identically-rendered subtrees in different modules no longer overwrite each other and same-named memos across modules can coexist on one page. (#6457) reflex initnow writes a managedAGENTS.mdsection (preserving your surrounding content) and bridges it to Claude Code via aCLAUDE.mdthat imports@AGENTS.md. (#6620)StringVargainedlstripandrstrip, andstripnow accepts an optionalcharsargument, matching Python'sstrAPI. (#5417)rx.plotlyaccepts alocaleprop to localize number/date formatting and modebar labels; the matchingplotly.js-localesdata is resolved and merged automatically per chart. (#6428)package.jsongeneration accepts extra keys.package_json_templatetakes**additional_keys(e.g.name,packageManager,engines), andreflex.lock/package.jsonis now synced to.web/package.jsonbefore install so the manifest and lockfile stay aligned. (#6658)
Bug Fixes
- π Security β minimum dependency versions raised (#6665):
starlette >= 1.3.1β Host-header path poisoning,request.form()DoS, and UNC-path SSRFpython-multipart >= 0.0.32β querystring DoS, unbounded header field size, and negativeContent-Lengthbuffering inparse_formgranian >= 2.7.4β WSGI and WebSocket header-panic DoS- bundled
viteβ8.0.16βserver.fs.denybypass on Windows alternate paths (CVE-2026-53571)
- Bound arguments now pass through to upload handlers, so
on_drop=State.handle_upload(rx.upload_files(...), field)forwardsfieldto the backend instead of raising a missing-argument error. (#5290) rx.condpreserves literal string types, sorx.cond(State.flag, "green", "red")infersVar[Literal["green", "red"]]instead of widening toVar[str]β fixing Pyright errors on props like Radixcolor_scheme. (#6545)rx.debounce_inputno longer crashes withReferenceError: input is not definedwhen wrapping a native DOM element such asrx.el.inputorrx.el.textarea. (#6637)rx.momentpinsmoment-timezoneto exactly0.6.2(instead of a caret range) for reproducible frontend installs. (#6649)modify_staterebinds the event token correctly, so delta resolution and computed vars in shared-state fan-out tasks observe the right client token. (#6673)- Avoid re-entering config loading when a
Statesubclass is defined inrxconfig.py. (#6662)
Miscellaneous
pyi_hashes.jsonentries are now computed from the final.pyicontent (afterruff format/ruff check --fix), so formatting-only generator changes no longer flag spurious hash changes.
Full Changelog: v0.9.5.post2...reflex-components-core-v0.9.6