Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
238 commits
Select commit Hold shift + click to select a range
1119e34
perf: tree-shake bundled libs and ship only used Radix color scales
FarhanAliRaza May 25, 2026
b485c49
fix: avoid duplicate Radix color stylesheet when accent matches gray
FarhanAliRaza May 26, 2026
3813874
Merge remote-tracking branch 'upstream/main' into lighthouse-pr4-pr5
FarhanAliRaza Jun 1, 2026
36f6750
revert: ship monolithic Radix Themes stylesheet again
FarhanAliRaza Jun 3, 2026
92a7d36
Materialize changelogs for reflex v0.9.6 and friends (#6679)
masenf Jun 25, 2026
8e345b6
Merge remote-tracking branch 'upstream/main' into lighthouse-pr4-pr5
FarhanAliRaza Jun 25, 2026
f697d5f
refactor(reflex-base): clarify import-name handling in compilers
FarhanAliRaza Jun 25, 2026
1c4fde4
Re-pin reflex-base to released 0.9.6 (#6680)
masenf Jun 25, 2026
8b56f52
Bump reflex-components-core floor to released 0.9.6 (#6681)
masenf Jun 25, 2026
f86f86c
ENG-9923: Add REFLEX_EXTRA_PLUGINS env var to append to plugin list (…
masenf Jun 26, 2026
86cf989
SEO audit fixes: docs meta/titles/H1/alt + shared redirect & structur…
Alek99 Jun 29, 2026
ba74b6c
SEO follow-up: longer docs meta descriptions + missing H1/alt (#6692)
Alek99 Jul 1, 2026
ee1552d
ENG-8753 docs: add enterprise auth documentation section (#6672)
FarhanAliRaza Jul 1, 2026
251d0f5
Fix flaky test_hybrid_properties controlled-input race (#6682)
masenf Jul 1, 2026
6748919
Surface package changelogs on docs site (#6636)
masenf Jul 1, 2026
ddbe3f6
docs: document hybrid_property in the Vars section (#6622)
masenf Jul 1, 2026
46be552
docs: GitHub and Git provider integration docs (ENG-9906) (#6696)
adhami3310 Jul 1, 2026
4c63f00
Add ahref telemetry (#6695)
carlosabadia Jul 2, 2026
e11c05e
Let marketing_navbar take an optional banner (#6698)
PalashAwasthi05 Jul 2, 2026
09591ad
docs: SEO optimization for AG Grid enterprise docs (#6705)
Alek99 Jul 3, 2026
a73404a
docs: SEO optimization for tables and data grids (#6704)
Alek99 Jul 3, 2026
3280121
docs: SEO optimization for graphing / charts documentation (#6703)
Alek99 Jul 3, 2026
b3fe805
docs(pyplot): improve SEO for matplotlib/pyplot search terms (#6700)
Alek99 Jul 3, 2026
ee1361d
add docs for reflex-enterprise testing fixtures (#6709)
masenf Jul 6, 2026
1100fe2
fix broken links in reflex-enterprise feature table (#6712)
masenf Jul 6, 2026
2d446c3
fix: avoid re-evaluating stateful pages twice in one process (#6710)
adhami3310 Jul 6, 2026
e98c7b4
docs: document async_db_url and reflex[db] extra (ENG-8371) (#6699)
adhami3310 Jul 6, 2026
d54ad96
Document Snowflake key-pair authentication (#6711)
Darksinian Jul 6, 2026
bd99a55
docs: cap meta descriptions at SEO snippet length (155 chars) (#6727)
carlosabadia Jul 9, 2026
c03ab4b
fix: properly cleanup resources like redis and background tasks (#6724)
benedikt-bartscher Jul 9, 2026
42341da
docs(form): fix rx.text_area reference (was rx.textarea) (#6720)
anxkhn Jul 9, 2026
d1a6f65
docs(select): fix rx.select.root reference (was rx.select_root) (#6719)
anxkhn Jul 9, 2026
b4d94b0
docs: add missing chained event handler (#6718)
harsh21234i Jul 9, 2026
dbc3643
docs(browser_storage): fix rx.remove_cookie header (#6717)
anxkhn Jul 9, 2026
4b4afa0
fix(state): reset disk write queue task on close (#6715)
anxkhn Jul 9, 2026
3d73778
docs(wrapping-react): remove broken EventHandler import in props exam…
anxkhn Jul 9, 2026
948c619
Implement ArrayVar operations: filter, reduce, flat_map, foreach -> m…
masenf Jul 9, 2026
3b97060
docs(mixins): fix contact form example to use asyncio.sleep (#6721)
anxkhn Jul 9, 2026
9a5c4d3
Fix wrong Blog and FAQ links in docs footer (#6731)
carlosabadia Jul 10, 2026
11f8a7a
perf: cache framework-path checks in console.deprecate frame walk (#6…
Alek99 Jul 13, 2026
2c32f06
Expose `default_color_mode` in rx.Config (#6716)
masenf Jul 13, 2026
a3b2c9b
Move telemetry off event loop to dedicated worker thread (#6626)
masenf Jul 13, 2026
72ef73c
Add script to delete automated GitHub releases while preserving tags …
masenf Jul 13, 2026
48f229f
test(vars): assert real error messages in computed var tests (#6750)
anxkhn Jul 13, 2026
3caec9b
Cache Var.to()/guess_type() registry lookups (#6742)
Alek99 Jul 14, 2026
48f9e6c
Fix _get_all_hooks_internal mutating the shared per-node hooks cache …
Alek99 Jul 14, 2026
dc9f4fb
perf: stop deep-copying proxy-free event chaining payloads (#6739)
Alek99 Jul 14, 2026
32cc257
ENG-10089: Support custom JS wrappers and bare functions in @rx.memo …
masenf Jul 14, 2026
cd33c65
Add frozen_lockfile config to control bun lockfile enforcement (#6763)
masenf Jul 14, 2026
32f41e2
ENG-9859 fix(state): preserve source function __dict__ and kwdefaults…
FarhanAliRaza Jul 14, 2026
65a2889
ENG-9860 fix(vars): preserve custom Field attributes in state metacla…
FarhanAliRaza Jul 14, 2026
127e4d8
Materialize changelogs for reflex v0.9.7 and friends (#6772)
masenf Jul 15, 2026
34ee005
Re-pin reflex-base to released 0.9.7 (#6782)
masenf Jul 15, 2026
7e80931
fix: make Moment a MemoizationLeaf (#6784)
benedikt-bartscher Jul 16, 2026
fed116f
docs: corrections and pitfalls from AI builder field notes (#6775)
amsraman Jul 17, 2026
2edaf12
Extract docs shared componets into shared package (#6785)
carlosabadia Jul 17, 2026
f79d011
Add agent doc button to reflex site shared (#6794)
carlosabadia Jul 17, 2026
e54bc83
docs: link AI onboarding guide from installation page (ENG-9567) (#6783)
FarhanAliRaza Jul 20, 2026
9854a3a
docs: add Organizations & Permissions section under AI builder [ENG-1…
adhami3310 Jul 22, 2026
0719c87
Followup for doc page action site shared (#6795)
carlosabadia Jul 23, 2026
052d891
fix(vars): carry custom Field attrs by reference, not deepcopy (#6809)
FarhanAliRaza Jul 23, 2026
b8a4621
ENG-9892: feat(plugins): add register_route hook and get_plugin looku…
FarhanAliRaza Jul 24, 2026
b6e6420
docs: expand the Plotly page with 14 chart-type recipes (#6777)
amsraman Jul 24, 2026
8e5a93c
docs: recharts chart techniques from AI builder field notes (#6778)
amsraman Jul 24, 2026
d932ee8
docs: chat app recipe with streaming patterns (#6788)
amsraman Jul 24, 2026
9cf376e
docs: database efficiency and table recipes (#6780)
amsraman Jul 24, 2026
02f442b
docs: events, storage, and component field notes (#6779)
amsraman Jul 24, 2026
586fac3
docs: enterprise component field notes (ag-grid, map, react flow) (#6…
amsraman Jul 24, 2026
416eb34
Add managed GCP provider, deployment rollback, and descriptions (#6810)
Kastier1 Jul 25, 2026
1358e00
Update marketing navbar (#6805)
carlosabadia Jul 27, 2026
b9d112d
ENG-10641: Document AI Builder Design System feature (#6817)
carlosabadia Jul 28, 2026
9936fcf
Drain sequential event tasks during shutdown (#6791)
harsh21234i Jul 29, 2026
015f28f
fix: use os.walk to build custom components on Python 3.10 and 3.11 (…
anxkhn Jul 29, 2026
ac991ff
fix(rename): read and write source files as UTF-8 (#6761)
anxkhn Jul 29, 2026
fc31a2c
fix(compiler): use posix separators for nested stylesheet imports (#6…
anxkhn Jul 29, 2026
30e6108
fix(memo): preserve runtime typing for unannotated params (#6659)
harsh21234i Jul 29, 2026
a8857cd
Process persisted package json before web sync (#6792)
harsh21234i Jul 29, 2026
9916c81
fix(vars): compare timezone-aware datetimes by instant (#6767)
anxkhn Jul 30, 2026
fa3e67a
support async context for mutable proxies (#6691)
harsh21234i Jul 30, 2026
0c7bdfb
Implement changelog-driven release workflow (#6822)
masenf Jul 31, 2026
cce9772
fix(event): suppress native asyncio.QueueShutDown on Python 3.13+ (#6…
axelray-dev Jul 31, 2026
18991e7
ENG-10604: ENG-10603: ENG-10602: ENG-10601: ENG-10397: Update AI buil…
carlosabadia Jul 31, 2026
e3fe1a1
Add content hashes to asset URLs (#6749)
harsh21234i Jul 31, 2026
43b1e17
Rename AI onboarding docs to Agent Toolkit (#6510)
Alek99 Jul 31, 2026
fed170c
Add meta tags for docpages (#6464)
carlosabadia Jul 31, 2026
8ea5bdc
ENG-10639: Update Reflex UI twmerge utility to use clsx and tailwind-…
carlosabadia Jul 31, 2026
d8aaddf
fix: drop unneeded turbopack env (#6803)
benedikt-bartscher Jul 31, 2026
93649a1
Add request ID tracking to token validation for support correlation (…
Kastier1 Jul 31, 2026
a08a061
Handle AwaitingApproval status in watch_deployment_status (#6797)
adhami3310 Jul 31, 2026
35c03b5
fix: serve JavaScript assets with a stable MIME type (#6831)
LeoGrosjean Aug 3, 2026
9fcce60
Bump frontend and component library dependencies (#6678)
masenf Aug 3, 2026
a5511b2
Materialize changelogs for reflex-hosting-cli@0.1.68 (release-patch) …
github-actions[bot] Aug 3, 2026
2981e71
fix(hmr): stop unloaded-route edits from wedging browser HMR (#6774)
FarhanAliRaza Aug 3, 2026
e326260
Add Layer and Rectangle components to Recharts (#6729)
masenf Aug 3, 2026
da42c2e
ENG-9153: Add preview run mode (#6663)
adhami3310 Aug 3, 2026
ea721fd
test: fix flaky memo test by waiting for hydration before interacting…
FarhanAliRaza Aug 3, 2026
a348aea
Update dev pillow pin to 12.3 (#6836)
masenf Aug 4, 2026
d2c75f4
Bump locked aiohttp and cryptography for HIGH severity CVEs (#6837)
masenf Aug 4, 2026
7e365ce
Apply package.json overrides after frozen install (#6844)
masenf Aug 4, 2026
69ef304
Release reflex-base@0.9.8, reflex-components-code@0.9.3, reflex-compo…
github-actions[bot] Aug 4, 2026
b95c6dc
fix(types): qualify annotations shadowed by same-class members (#6846)
adhami3310 Aug 4, 2026
0520cd2
fix: force C locale for lscpu (#6847)
benedikt-bartscher Aug 4, 2026
61daf41
ENG-10800: Update XY stars count on the marketing pages (#6843)
carlosabadia Aug 5, 2026
08a9218
Bump base-ui version to 1.7.0 for reflex components internal (#6842)
carlosabadia Aug 5, 2026
7ba00b4
ENG-10642: Improve config docs with env var columns and responsive ta…
masenf Aug 6, 2026
346177c
ENG-10376 docs: add enterprise auth audit hook page (#6818)
FarhanAliRaza Aug 6, 2026
13a89e0
feat: surface unprocessable state deltas as fatal client errors (#6827)
FarhanAliRaza Aug 6, 2026
d8a132b
make pydantic optional (#6786)
benedikt-bartscher Aug 6, 2026
4116ff2
Upgrade React Router to v8.3.0 and bump Node minimum to 22.22.0 (#6854)
masenf Aug 7, 2026
d0b98a3
fix(route): don't let a splat catchall match paths sharing its prefix…
chuenchen309 Aug 7, 2026
4363732
fix(init): declare RadixThemesPlugin in default rxconfig template (#6…
gaurav0107 Aug 7, 2026
333b78b
ENG-10919: Unify documentation demos with connected View, Code, and D…
carlosabadia Aug 8, 2026
0134175
Fix state manager lock isolation (#6830)
harsh21234i Aug 10, 2026
a0f184c
Update navbar github link (#6856)
carlosabadia Aug 10, 2026
8e981e3
[vite 8.2.0] Fix REFLEX_ENV_MODE leak between AppHarness instances (#…
masenf Aug 10, 2026
6cc7a0b
Add code block integration coverage (#6520)
Alek99 Aug 10, 2026
9bae671
Sanitize buffered upload filenames (#6753)
harsh21234i Aug 11, 2026
7888170
Move more globals to RegistrationContext (#6382)
masenf Aug 11, 2026
8612978
Replace Inkeep with keyword-only Algolia search (#6859)
Alek99 Aug 11, 2026
9a04113
Add start building link to docs demos (#6869)
carlosabadia Aug 11, 2026
606f28b
ENG-11083: document the auto-provisioning flow end to end (SCIM + ser…
adhami3310 Aug 11, 2026
f21eb16
Fix docs search input overflow in safari (#6878)
carlosabadia Aug 12, 2026
ed9acd3
Update search breadcrumbs (#6883)
carlosabadia Aug 13, 2026
85fc55e
ENG-10966: Add reflex-release package: changelog-driven release autom…
masenf Aug 14, 2026
a2e0900
ENG-11157: add --min-instances/--max-instances to `reflex deploy` (#6…
Kastier1 Aug 14, 2026
d982ede
Materialize changelogs for reflex-hosting-cli@0.1.69 (release-patch) …
github-actions[bot] Aug 14, 2026
95ee7f0
correct Base UI submenu tag casing (#6887)
carlosabadia Aug 14, 2026
fddcb6b
Move authentication overview to enterprise docs (#6858)
masenf Aug 14, 2026
ff88c5d
Add Auto MCP documentation for reflex-enterprise v0.9.4 (#6880)
masenf Aug 15, 2026
40b431c
Bump reflex-enterprise to 0.9.4 for docs (#6892)
masenf Aug 15, 2026
092aa4f
reflex-release: add a post-release workflow hook (#6888)
masenf Aug 15, 2026
7e57be7
fix: properly annotate EventCallback.fn for tests (#6894)
benedikt-bartscher Aug 17, 2026
7ada71b
Support custom build workflows for platform-specific packages (#6891)
masenf Aug 18, 2026
b1601ab
Update footer github link (#6907)
carlosabadia Aug 18, 2026
852ef91
Add GCP connection selection and full-deploy mode to reflex deploy (#…
Kastier1 Aug 18, 2026
5194efc
ENG-10963 feat(log): add stdlib logging pipeline in reflex_base.utils…
FarhanAliRaza Aug 18, 2026
2746068
Materialize changelogs for reflex-hosting-cli@0.1.70 (release-patch) …
github-actions[bot] Aug 18, 2026
169f70d
ENG-10963 refactor(log): migrate reflex-base and component packages t…
FarhanAliRaza Aug 19, 2026
d881ab2
ENG-11392: Update gradient profile shared component (#6913)
carlosabadia Aug 19, 2026
4a19632
Update shared badge component border-radius (#6914)
carlosabadia Aug 19, 2026
26a7834
Wrap number field component (#6915)
carlosabadia Aug 19, 2026
d28be54
ENG-10963 refactor(log): migrate the reflex CLI and runtime to loggin…
FarhanAliRaza Aug 19, 2026
d6aa27a
ENG-10963 refactor(log): hosting CLI shares the reflex-base console a…
FarhanAliRaza Aug 19, 2026
73ff908
feat(log): deprecate the legacy console logging helpers (#6867)
FarhanAliRaza Aug 19, 2026
d86f167
fix(events): chained events inherit the originating event's router_da…
adhami3310 Aug 20, 2026
d840662
fix(testing): enable the development condition for the AppHarness (#6…
benedikt-bartscher Aug 24, 2026
a7ad9e0
perf: disable React dev-build owner-stack capture in dev mode (#6905)
Alek99 Aug 24, 2026
126ef6d
Pin bash shell in all generated release workflow steps (#6926)
masenf Aug 24, 2026
6b44604
feat(reflex-release): name orphan news fragments after their pull req…
masenf Aug 24, 2026
f35b493
feat(reflex-hosting-cli): upload deploy archives straight to storage …
adhami3310 Aug 25, 2026
ca72b7c
Add faqs link to site footer (#6943)
carlosabadia Aug 25, 2026
2e9f51f
Fix demo_form_dialog to omit trigger when not provided (#6940)
masenf Aug 25, 2026
17cab4e
Fix Python 3.14 event handler annotation resolution (#6896)
harsh21234i Aug 25, 2026
d02e452
fix(events): stop background tasks from cleaning the root state unloc…
adhami3310 Aug 25, 2026
9bb64f1
Upgrade ruff, pyright, and typer; fix the resulting failures (#6893)
masenf Aug 25, 2026
d3a17c7
perf: drop task wrapper in EventNamespace.emit_update, keep flush tic…
Alek99 Aug 25, 2026
12d29c7
fix(hosting-cli): make reflex-base an optional dependency (#6939)
adhami3310 Aug 26, 2026
e196d03
Fix release workflow skipping publish when using custom builds (#6950)
masenf Aug 26, 2026
dfb4ef0
feat(cloud): add `reflex cloud whoami` and `reflex cloud token` (#6918)
Kastier1 Aug 26, 2026
9f7f82c
ENG-11237 feat(hosting-cli): report why a deploy failed, not just tha…
adhami3310 Aug 26, 2026
ceff479
fix(hosting-cli): repair main after the whoami/token merge (#6954)
masenf Aug 27, 2026
bb7ed7c
resolve type aliases (#6944)
benedikt-bartscher Aug 27, 2026
6c2d707
fix(app): allow static segments as siblings of dynamic route segments…
benedikt-bartscher Aug 27, 2026
894cb95
Append a referrer param to the "Built with Reflex" badge link (#6951)
FarhanAliRaza Aug 27, 2026
c5e0a75
reflex-release: lift unshippable dependency pins when materializing a…
masenf Aug 27, 2026
a4d99be
Add displayName to React components for DevTools visibility (#6945)
masenf Aug 27, 2026
603d303
Auto-memoize user @rx.memo components with stateful props (#6949)
masenf Aug 27, 2026
a33e02a
ENG-9661 fix: cancel stale on_load chains via handler-declared supers…
FarhanAliRaza Aug 27, 2026
54c1f1b
Migrate release automation from scripts/release.py to reflex-release …
masenf Aug 27, 2026
aab70fb
ENG-11433 Move `reflex deploy` out of the framework into the Cloud CL…
FarhanAliRaza Aug 27, 2026
3d2b539
ENG-9676 fix: route memo RestProp CSS props into css instead of dropp…
FarhanAliRaza Aug 27, 2026
3b09137
feat(hosting): --hostname names the app's Cloud Run service on GCP (#…
Kastier1 Aug 28, 2026
f7c848f
Ensure proper LogLevel enum is used in reflex-hosting-cli with older …
masenf Aug 28, 2026
45b8ed5
Release reflex-release@0.1.0 (#6964)
github-actions[bot] Aug 28, 2026
fba9cc5
Default client_error payload to None so a no-arg emit hits the guards…
masenf Aug 28, 2026
8f0e0a2
Add deprecation shims for bundled_libraries module globals (#6967)
masenf Aug 28, 2026
57716e1
Restore deprecated DECORATED_PAGES and get_config(reload=True) shims …
masenf Aug 28, 2026
b0c850a
Fall back to a safe name when upload filename sanitization yields a t…
masenf Aug 28, 2026
65445dc
Fix Vite config plugin imports and add resolveId hook filter (#6959)
masenf Aug 28, 2026
a5cf92a
Fix build config to exclude sibling packages from distributions (#6966)
masenf Aug 28, 2026
7427617
perf nits in format and types (#6862)
benedikt-bartscher Aug 28, 2026
bd356f6
Emit valid rolldown-vite options in generated vite.config.js (#6987)
masenf Aug 28, 2026
8afe8ce
Fix reflex run hanging after fatal error in frontend thread (#6990)
masenf Aug 28, 2026
6c6a398
Remove stale rich-markup escapes leaking backslashes into logged warn…
masenf Aug 28, 2026
34bdfc3
Keep full-logging alive in granian workers after post-fork dictConfig…
masenf Aug 28, 2026
4bc9678
Pin PYTHONHASHSEED in the benchmark workflow (#6993)
benedikt-bartscher Aug 28, 2026
9739210
Clear fatal-error interrupt window unconditionally on body exit (#6994)
masenf Aug 28, 2026
cca24a1
Resolve PEP 695 type aliases in _isinstance and typehint_issubclass (…
masenf Aug 28, 2026
0b39d1a
Raise actionable error for components declaring library react-router-…
masenf Aug 28, 2026
f8181b5
Release reflex-hosting-cli@0.1.71 (#6997)
github-actions[bot] Aug 28, 2026
19d888d
Release reflex@0.9.9, reflex-base@0.9.9, reflex-components-code@0.9.4…
github-actions[bot] Aug 28, 2026
c46a9f0
Materialize changelogs for reflex-components-core@0.9.9 (release-from…
github-actions[bot] Aug 28, 2026
394e525
Update reflex-base dependency version to 0.9.9 (#7000)
masenf Aug 28, 2026
adefa11
Quiet setup-uv warnings in publish job and no-op lockstep pins (#6965)
masenf Aug 28, 2026
288b4f3
Verify GitHub release before handing to post-release workflow (#6927)
masenf Aug 28, 2026
87a6deb
add guidance when reflex-release is blocked due to existing tag (#6957)
masenf Aug 28, 2026
433c3eb
fix: deliver linked state updates to all clients (#6934)
benedikt-bartscher Aug 28, 2026
eb65356
Fix reflex-hosting-cli on v0.7.6.post (#6963)
masenf Aug 28, 2026
dd96aea
Event processor fix (#6801)
benedikt-bartscher Aug 28, 2026
90ade3b
test_media: Replace URL we don't control (#7009)
masenf Aug 31, 2026
2145622
Remove errant double slash (#7011)
masenf Aug 31, 2026
3573364
perf: deduplicate imports as they merge, not once at the end (#7012)
adhami3310 Sep 1, 2026
3013a6b
fix: allow static IDs in document-root head components (#7005)
mameikagou Sep 1, 2026
6beb371
Materialize changelogs for reflex@0.9.10, reflex-base@0.9.10 (release…
github-actions[bot] Sep 1, 2026
d554431
docs: add a complete auth example app and sharpen authentication-vs-a…
FarhanAliRaza Sep 1, 2026
812bb47
Speed up memo-name hashing, move it into its own module, fix seven ta…
masenf Sep 1, 2026
c5902a3
fix(config): load rxconfig with cwd prepended (#6933)
benedikt-bartscher Sep 2, 2026
9a26753
Record the post-release changelog sections on main and require reflex…
masenf Sep 2, 2026
d2c967d
Add verify_pyi script to validate .pyi stubs in distributions (#6961)
masenf Sep 2, 2026
0cd2c21
fix(events): run the no-context background flush when the handler rai…
FarhanAliRaza Sep 2, 2026
0937e12
fix(proxy): carry dataclass class-level metadata onto synthesized pro…
masenf Sep 2, 2026
b9286f5
perf(dev): opt-in production React under the Vite dev server + route …
Alek99 Sep 2, 2026
174f2c5
Fix IPv6 availability detection in process port tests (#7027)
masenf Sep 2, 2026
7d6edec
perf: cut per-event overhead on the state/event hot path (#7025)
Alek99 Sep 2, 2026
3e3732d
fix(assets): link shared assets atomically instead of check-then-act …
adhami3310 Sep 3, 2026
2fc45ed
Add prerelease-test skill for release QA campaigns (#7001)
masenf Sep 3, 2026
2459ded
Replace the outdated-dependency shell filters with a configured scrip…
masenf Sep 3, 2026
f3aef84
docs: describe the custom domain records and verification states (#7038)
Darksinian Sep 3, 2026
8853e14
Refresh outdated dependencies flagged on the release branch (#7019)
masenf Sep 3, 2026
7711b20
Bump base-ui version to 1.8.0 for reflex components internal (#7042)
carlosabadia Sep 4, 2026
a6b9652
ENG-11018: Make the cloud CLI agent-usable (--json everywhere, non-in…
amsraman Sep 4, 2026
fb04aa1
Make AppHarness dependencies installable (#7008)
harsh21234i Sep 4, 2026
55ab49f
improve hybrid property (#6812)
benedikt-bartscher Sep 4, 2026
c83ec64
Preserve RegistrationContext in telemetry worker threads (#6960)
masenf Sep 4, 2026
d4e11c4
Sync uv.lock with the testing extra in pyproject.toml (#7047)
masenf Sep 4, 2026
7ab704d
docs: fix broken links found auditing the live docs site (#7045)
Alek99 Sep 4, 2026
c57b32c
Fix docs 'Edit this page' link to target the page's real source file …
masenf Sep 4, 2026
c49a85d
docs: add a User Authentication page for brokered app sign-in (#7046)
adhami3310 Sep 5, 2026
a7e1ce3
ENG-12228: Fix Safari cache-busting plugin to handle React Router 8 U…
masenf Sep 8, 2026
0008768
Migrate react-moment to 2.0.2 (#7006)
harsh21234i Sep 8, 2026
71dbed1
fix(docs): preserve dialog validation in dashboard tutorial (#6875)
rohit-jsfreaky Sep 8, 2026
6afa226
docs: fix broken anchor links in low-level form guide (#7055)
Jacky-J126 Sep 8, 2026
77cfe61
Make CLI startup lazy and benchmark command paths (#7050)
Alek99 Sep 8, 2026
5d9724e
fix(types): skip ForwardRef resolution for unannotated attribute prob…
benedikt-bartscher Sep 8, 2026
e3e39a8
Fix build failure when frontend_path is set without prerendering (#7044)
masenf Sep 9, 2026
4d4437d
Keep React context objects stable across hot updates (#7071)
FarhanAliRaza Sep 9, 2026
e741c94
Tree-shake bundled libraries while preserving runtime component exports
Alek99 Sep 10, 2026
2605b94
Preserve PR #6563 history after porting and hardening its net changes
Alek99 Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
190 changes: 190 additions & 0 deletions .claude/skills/prerelease-test/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
---
name: prerelease-test
description: Run the independent pre-release QA campaign for a Reflex release train. Discovers what shipped by reading every CHANGELOG.md on the pre-release branch, checks each package actually published to PyPI, then exercises the new features end-to-end in real apps driven by a real browser using ONLY published packages, upgrade-tests reflex-examples apps from the previous stable, regression-tests reflex-enterprise demos, audits wheel/sdist packaging, and produces a triaged FINDINGS.md plus a fix-before-release plan. Use this whenever a Reflex release is being prepared or checked — the user mentions a pre-release, an alpha/beta/rc, an `r/pre-*` branch, "about to release", release QA, validating a release candidate, or re-verifying that release-blocking fixes landed in a newer alpha. Also use it for the narrower slices on their own: smoke-testing published packages, upgrade/regression testing example apps against a new version, or auditing that packages ship their `.pyi` stubs in both wheel and sdist.
---

# Reflex pre-release testing

This skill runs the QA campaign that stands between a pre-release and a release: independent,
adversarial, end-to-end exercise of what actually got published, from the perspective of a user
who runs `pip install reflex` and opens a browser.

Its value comes from three habits, not from breadth of assertions:

1. **Only published packages.** Everything installs from PyPI into throwaway venvs. The checkout
has unreleased code, different metadata, and a different dependency graph — testing it tells
you nothing about what users will get, and a package that failed to publish is itself a
release blocker you would otherwise miss.
2. **Baseline against the previous stable.** A defect that also reproduces on the last release is
a bug; one that only reproduces on the new version is a regression and usually a blocker.
Without the baseline run you cannot tell them apart, and the triage that follows is guesswork.
3. **Adversarially verify before reporting.** Have a second agent reproduce each claimed issue
from the written repro alone and actively try to refute it. In practice this refutes or
reclassifies a meaningful share of findings — and it is what makes the report trustworthy
enough for maintainers to act on directly.

## Deliverables

Produce these under `prerelease-testing/<date>-<version>/` in the repo and commit them to a work
branch as you go (never to `main`):

- `FINDINGS.md` — executive summary, numbered findings with repro + evidence + regression status,
refuted claims, and per-cluster summaries. Templates: `references/reporting.md`.
- `RELEASE_PLAN.md` — triage into fix-before-release vs file-as-issue. Rubric below.
- One directory per test cluster containing the sample app sources (no `.web/`, `node_modules/`,
venvs), the driver scripts, `NOTES.md` with exact rerun commands, logs and screenshots.
- `README.md` — what each cluster covers and how to reuse it for the next release.

Findings must be reproducible by a stranger from `NOTES.md` alone. That is the bar: a fix agent
gets handed the finding and nothing else.

## Phases

Work these in order. Phases 2–5 can overlap; 0 and 1 gate everything.

### Phase 0 — Scope discovery

Find the pre-release branch (`git ls-remote --heads origin 'r/pre-*'`, or the user names it), then
read **every** `CHANGELOG.md` on it: the root one plus `packages/*/CHANGELOG.md`. The top entry of
each is what this train ships.

Run the discovery script to extract every package's version and confirm each is published:

uv run --script .claude/skills/prerelease-test/scripts/check_release_versions.py --ref <git-ref>

(Script paths in this skill are repo-root-relative — the repo has its own unrelated `scripts/`
directory, so the prefix matters.) It exits 1 when a package is confirmed missing and 2 when a
check could not complete, so a proxy hiccup never reads as a missing package. An unpublished
version is a finding in its own right — report it immediately rather than working around it.

Read the linked PRs for anything whose intent is not obvious from the changelog line; the GitHub
MCP tools (`mcp__github__pull_request_read`) do this well. Understanding what a change was *for*
is what lets you test it as a user rather than as a checklist.

### Phase 1 — De-risk with a smoke test

Before any fan-out: one venv, `reflex init --template blank`, `reflex run`, then drive it in
Chromium with `.claude/skills/prerelease-test/scripts/drive_app.py`. This shakes out environment
problems (proxy, bun installs, browser path) once, in a context where you can debug them, instead
of inside ten parallel agents.

The scripts carry PEP 723 metadata, so `uv run --script <path>` runs each one in its own isolated
environment (the driver pulls in playwright that way); running them with an existing driver venv's
interpreter works too.

Also confirm the dependency graph resolves the way the changelog says it should (e.g. optional
dependencies genuinely absent, sub-packages pinned as intended).

### Phase 2 — Feature exploration fan-out

Decompose the changelog into clusters of related changes and give each to its own agent, with an
adversarial verification stage behind it. See `references/clusters.md` for how to cut the clusters
and a standing coverage list; `references/orchestration.md` for the Workflow script, schemas and
port map.

The instruction that makes this productive: **real-world exploration, not coverage filling.**
Combine each new feature with the things users actually combine it with — State vars,
`rx._x.client_state`, `rx.ComponentState`, `@rx.memo` wrapping, `rx.foreach`/`rx.cond`, event
chains, background tasks, multiple pages and navigation, dev *and* prod mode. Bugs live in the
interactions, and the original PR's tests already cover the happy path.

Every run inspects all four channels: server log, browser console (errors *and* warnings), network
tab (failed requests, 4xx/5xx), and the rendered page. Findings frequently show up in a channel
nobody asserted on.

### Phase 3 — Upgrade regression

Users upgrade in place; that path has its own failure modes (lockfile migration, pruned packages,
stale `.web/`). Clone `reflex-dev/reflex-examples`, pick apps that span the feature surface —
including ones using third-party packages (`reflex-local-auth`, `reflex-global-hotkey`) and
`reflex[db]`/API apps — then for each:

1. Install the **previous stable** (no `--prerelease` flag, so requirements resolve as a user's
would), run it, and drive its real user flows in the browser. This is your baseline.
2. Upgrade the *same* venv and *same* app directory in place to the new version, preserving
`.web/` and `reflex.lock/`. Watch the first run's log closely — that is where migration
happens. Re-drive the identical flows and compare.
3. Do one cold run (`rm -rf .web`) to check the fresh-install path converges to the same state.

Diff `.web/package.json` before and after; unexpected dependency changes are findings.

### Phase 4 — Enterprise regression

Downstream breakage is the most common release blocker, because removing a public name is
invisible until something imports it. Install the **published** `reflex-enterprise` (never the
checkout) against the new reflex and run its demos — ag-grid, map, dnd, mantine, flow, the MCP
plugin, OIDC. Baseline against the previous stable whenever something fails, so you can say
whether the new release broke it.

Before running anything, grep the published enterprise wheel for names the changelog says moved or
were removed; that finds the breakage in seconds instead of hours.

### Phase 5 — Packaging audit

Audit every package in the train; the discovery script feeds it the whole list. Chain the two with
`&&`, never a pipe — a pipe reports only the audit's exit status, so a package whose PyPI check
never completed would be dropped from the list and the audit would still print PASS over what was
left. The `&&` is what makes that impossible: the audit runs only when discovery exits 0.

uv run --script .claude/skills/prerelease-test/scripts/check_release_versions.py \
--ref <ref> --specs > specs.txt \
&& xargs uv run --script .claude/skills/prerelease-test/scripts/audit_pyi.py \
--manifest-ref <ref> < specs.txt

It verifies each package ships its own generated `.pyi` stubs in **both** wheel and sdist, that
they are byte-identical between the two, that no package leaks another package's stubs, and that
counts line up with `pyi_hashes.json` (a package absent from the manifest must ship none).

Stub content hashes legitimately differ from the committed manifest because the build hook
regenerates them at release time — compare *presence and counts*, and wheel against sdist.

### Phase 6 — Triage and report

Write `FINDINGS.md` first (everything confirmed), then `RELEASE_PLAN.md` splitting findings into:

**Fix before release** — anything meeting one of:
- a confirmed regression against the previous stable,
- security-relevant (path traversal, unauthenticated input handling, injection),
- significant user impact, or trivially small to fix (a one-line guard, a missing default).

**File as issues, fix after** — everything else, including pre-existing defects the campaign
happened to surface. Downstream (enterprise) issues go to that project's tracker, not this repo's.

Also flag decisions only a maintainer can make — an undocumented behavior change is either a bug
or a missing changelog entry, and which one it is is their call. Ask rather than assume.

### Phase 7 — Re-verify the next build

When a new alpha ships with the fixes, re-run the *original failing repro* for each finding
(not just the unit tests) against the new published packages, plus a general smoke. Append the
pass/fail table to `FINDINGS.md`. When the final ships, do one last stock-install smoke:
`pip install reflex==<final>` with no prerelease flag, init, run, browser, and confirm the
resolved graph is all-final.

## Working rules

- **Isolation.** Every agent gets its own venv and its own reserved port range; never install into
a shared venv. See the port map in `references/orchestration.md`.
- **The traps are real.** `references/agent-brief.md` is the brief to hand every agent — it carries
the environment gotchas (checkout shadowing, proxy variables breaking installs) and the list of
known-benign console noise. Agents that skip it rediscover the same problems and report noise as
findings.
- **Concurrency.** Dev servers are heavy (bun + vite + granian). On a 4-CPU box run about two
agents at a time and one dev server per agent; more just makes everything slow and flaky.
- **Commit as you go.** Each cluster's artifacts land on the work branch when that cluster
finishes, so a long campaign is never one unrecoverable batch.
- **Never fix framework code during the campaign.** Testing and fixing are separate engagements
with separate review standards; mixing them costs you the independence that makes the findings
credible. Record the repro and move on. (If the user then asks for fixes, that is a new task —
one PR per finding, regression test first, `references/reporting.md` has the PR conventions.)

## Scaling the campaign

Full campaign is roughly 30 agents over several hours. Scale down by dropping whole phases rather
than by testing each phase more shallowly — a shallow pass produces false confidence:

- **Quick check** (~30 min): phases 0, 1, 5, plus grep-based downstream checks from phase 4.
- **Standard** (~2 h): add phase 2 over the three or four highest-risk clusters.
- **Full**: everything, with adversarial verification on every claimed issue.

Ask the user which they want if the request is ambiguous and the difference matters.
115 changes: 115 additions & 0 deletions .claude/skills/prerelease-test/references/agent-brief.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
# The agent brief

Copy this into the campaign scratchpad (e.g. `$SB/AGENT_BRIEF.md`), fill the `<...>` placeholders,
and tell every test agent to read it first. It carries the rules that keep results trustworthy and
the environment traps that otherwise get rediscovered — expensively — by each agent in turn.

Keep it in a file rather than pasting it into each prompt: agents re-read it when they get
confused, and updating one file updates the whole fleet.

---

## BRIEF TEMPLATE (copy from here)

You are one of several agents independently exercising the reflex `<VERSION>` pre-release
(published `<DATE>`) as a real-world user of the framework. Your job: build small sample apps and
repro scripts for your assigned feature cluster, run them END-TO-END (real server, real Chromium),
and hunt for anomalies. You REPORT issues; you never fix framework code.

### HARD RULES

1. **NEVER install reflex (or any workspace package) from the local checkout at `<REPO>`.** No
`uv sync`, no `uv run`, no `pip install -e`, no `uv pip install .` anywhere under it.
Everything installs from PyPI. We are testing what users receive, not what the tree contains.
2. **Never run python with the checkout as your working directory.** `<REPO>/reflex/` shadows the
installed package, so `import reflex` silently picks up unreleased source and your results
become fiction. Run scripts from a neutral directory and start each repro with an assertion
naming the venv whose python is running it — the shared one below, or your own:
```python
import reflex

assert "<VENV_PATH>" in reflex.__file__, reflex.__file__
```
A guard that names some other venv fails on every run and gets deleted, which leaves you with
no guard at all.
3. Reading the checkout is fine and encouraged — release source is on branch `<PRERELEASE_BRANCH>`.
For PR context load the GitHub MCP tools via ToolSearch (`select:mcp__github__pull_request_read`).
4. Do NOT run any `git` write commands (add/commit/checkout/...) in the checkout. The orchestrator
commits artifacts.
5. Do NOT fix bugs you find — record precise repro steps instead.
6. Kill every server and browser you start before you finish (track PIDs; verify with `ps`). Other
agents share this machine — run at most ONE dev server at a time unless your cluster needs two.

### Environment

- Scratchpad root: `SB=<SCRATCHPAD>`
- **Prebuilt shared venv (READ-ONLY — never install into it):** `$SB/envs/<SHARED_VENV>` has
`reflex==<VERSION>` and the alpha sub-packages. Use `$SB/envs/<SHARED_VENV>/bin/reflex` directly.
- Need other deps or versions? Make your OWN venv:
```
uv venv $SB/envs/<yours> --python 3.11
uv pip install --python $SB/envs/<yours>/bin/python --prerelease=allow 'reflex==<VERSION>' <extras>
```
Always pass `--prerelease=allow` for alphas; PyPI is the default index — never point it at the
checkout. Python 3.12/3.13/3.14 are available via `uv venv --python 3.14` etc.
- **Playwright driver venv:** `$SB/envs/driver/bin/python` (playwright, httpx, websockets).
Chromium: `/opt/pw-browsers/chromium` — launch with
`p.chromium.launch(executable_path="/opt/pw-browsers/chromium")`.
A ready-made driver with console/network capture is at
`.claude/skills/prerelease-test/scripts/drive_app.py` in the checkout (read-only use is fine).
- **Local HTTP needs proxy bypass on the CLIENT side only:** prefix curl/Playwright commands with
`NO_PROXY=localhost,127.0.0.1 no_proxy=localhost,127.0.0.1` (curl: `--noproxy '*'`).
Do NOT export those variables into the reflex server's environment — it breaks bun's package
installs through the proxy, which looks like a framework bug and is not.
- Set `REFLEX_TELEMETRY_ENABLED=false` for every reflex command.
- Node and bun are preinstalled. Enterprise apps need `CI=true` to bypass the dev login gate.
- App working dirs: `$SB/apps/<cluster>/...`. Run servers on YOUR ASSIGNED PORTS:
`reflex run --frontend-port <FP> --backend-port <BP>`. The first run does a bun install (1–2 min);
poll the frontend URL until it returns 200 for up to ~6 minutes before concluding failure.
- `--loglevel debug` gives verbose server logs; redirect to a file and actually read it.

### What "testing" means here

- Real-world exploration, not coverage filling. Combine the feature with State vars,
`rx._x.client_state`, `@rx.memo` wrapping, `rx.ComponentState`, `rx.foreach`/`rx.cond`, event
chains (`yield Other.handler()`), background tasks, multiple pages and navigation — whatever
plausibly interacts. The original PR already tested the happy path.
- Drive the app in Chromium as a user would: click, type, navigate, upload, drag, use the keyboard.
- On EVERY run capture and inspect: (a) the server log file, (b) browser console messages (errors
AND warnings), (c) failed requests / 4xx-5xx responses, (d) screenshots at key moments.
- Baseline comparisons are what make findings actionable: if behavior looks wrong, check the
previous stable (`uv pip install 'reflex==<PREV_STABLE>'` in its own venv). Only-on-new is a
regression and high severity; both-versions is context worth noting, not a blocker.
- Prod matters too: `reflex run --env prod` compiles and serves the built frontend. Test both modes
when your feature could differ (hydration, memoization, routing, prerender).

### Known-benign noise — do not report these as findings

- Browser console: the React Router "💿 Hey developer" HydrateFallback log, vite
`connecting.../connected` debug lines, the React DevTools download info line.
- `reflex init` logging a few "Failed to connect to https://registry.npmmirror.com" lines before
falling back (this environment blocks that mirror). Do report it if the fallback itself fails.
- Transient bun "incorrect peer dependency" warnings during a one-time upgrade migration, provided
the final lockfile is consistent.

If you see something surprising that is not on this list, investigate it — several real findings
have surfaced first as an unexplained warning.

### Deliverables (mandatory)

1. Copy reusable artifacts into the repo (plain `cp`/`rsync`, no git):
`DEST=<ARTIFACT_ROOT>/<cluster>/`
- the app source dirs, EXCLUDING `.web/`, `node_modules/`, `.states/`, `assets/external/`,
`*.db`, venvs
- your Playwright/repro scripts
- `NOTES.md`: what you tested, how to rerun it (exact commands), what you observed, including
benign quirks
2. Return structured findings: every discrete check as a test entry (pass/fail/anomaly/skipped)
with enough repro detail that another agent can reproduce a failure from `NOTES.md` and your
scripts alone, without your conversation. An "anomaly" is anything surprising (console error,
warning, traceback, visual glitch, perf cliff) even when functionality works.

### Timeboxing

Be thorough but keep moving: if one sub-test resists debugging for ~10 minutes, record it as an
anomaly with logs attached and continue. Finishing the whole cluster beats perfecting one test.
Loading
Loading