Latest Results
Add the Upgrading to Reflex 0.11 guide
Add docs/changelog/upgrading/upgrading-to-0-11.md, modeled on the 0.10
guide, covering every 0.11.0 breaking change and deprecation that needs
action, with a before/after example for each:
- decorators stacked above @rx.event, and @rx.event outside a state
- what a handler may return, and the mistaken returns that still raise
- prod origin checks: deploy_url defaulting to None, REFLEX_DEPLOY_URL
for split or CDN deploys, trusted_proxy_hops, cors_allowed_origins
- code reading config.deploy_url (config.frontend_url / config.api_url)
- set and frozenset vars as SetVar (.to_array())
- browser storage vars with a default_factory
- plain @property of Pydantic models and dataclasses read through a Var
- print()/str() of a class-level backend var (repr())
- rx.client_state replacing rx._x.client_state, and its naming rules
- rx.AdminDash removal and app() returning a plain ASGI app, with the
api_transformer lifespan follow-ups
- the alembic env.py migration (env.old, hand-edited env.py), optional
rx.ModelRegistry.register and base detection, deprecated helpers
- reflex-enterprise 0.9.12, and smaller behavior changes
List it first in the sidebar's Upgrading group, link the root
changelog's 0.11.0 entries for the event decorators, origin checks,
model bases and alembic env.py to its sections, and add news fragments.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dxjadq3qkhKnqZR2b9WBFi Don't wait in Thread.join(timeout) when draining supervised output (#7855)
* Don't wait in Thread.join(timeout) when draining supervised output
On CPython 3.13 to 3.15, Thread.join(timeout) can wait without a timeout
(python/cpython#161712): ThreadHandle_join reads the clock twice through
Py_MAX, and a negative second read becomes an INFINITE wait. Windows hits
the window far more often, because its waits end a fraction of a timer
tick early and loop back around.
_OutputPump.drain() polled the reader with join(0.05) while the reader
sat in os.read on the child's output pipe. When the join lost its
timeout, the drain waited until every writer closed the pipe:
- test_supervise_output_does_not_wait_for_lingering_descendants took
30 s, the lifetime of the grandchild that inherited the pipe;
- test_output_pump_drain_grace_ends_with_the_write deadlocked, since the
test closes the pipe only after drain() returns.
The reader now sets an Event when run() ends, and drain() waits on that.
Event.wait goes through _PyMutex_LockTimed, which reads the clock once
and clamps a negative remainder to zero.
Every test in test_supervisor.py also gets a faulthandler watchdog that
aborts the run after 120 s and dumps all thread stacks to the real
stderr, so a regression fails in minutes instead of using up the job.
Fixes #7819
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Close the output pump's pipe even when forwarding raises
The reader closed its end of the pipe only after the read loop ended
normally, so an exception while forwarding leaked the descriptor. Close it
in the finally block, before signalling that the reader finished.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> feat(forms): render any native form control under rx.form.control
rx.form.control only accepted rx.input and rx.debounce_input as its
child, so a textarea or a low-level input, textarea or select could not
take a form field's name and validation messages. Radix Form.Control
composes with any native form control, and with nothing else: its other
primitives such as Checkbox and Select do not work under it.
Accept every component backed by a native input, select or textarea,
which covers rx.text_area, rx.el.input, rx.el.textarea and rx.el.select,
and keep rejecting the rest with a message that says where those go.
A child is only rendered as the control with asChild, so set it when a
child is given.
The Playwright test submits a form with one field per accepted control
and checks that each carries its field's name and label id, that the
required textarea blocks submission and shows its message, and that the
payload holds every value.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ESN8DjjKz1VPEvFQd5BuvUclaude/form-control-children Latest Branches
-5%
+2%
claude/merge-r-pre-2026.11.11 +2%
claude/form-control-children © 2026 CodSpeed Technology