Releases: reflex-dev/reflex
v0.4.9
New Features
Improvements
- Simplify
run_process_with_fallback
logic by @masenf in #3089 - Use Fallback command on all platforms by @ElijahAhianyo in #3099
- allow set in var.contains by @martinxu9 in #3113
Bug Fixes
- [REF-2586] Pass child event_trigger through DebounceInput by @masenf in #3092
on_key_down
/on_key_up
work with controlled inputs
- [REF-2589] Use errors='replace' with subprocess by @masenf in #3096
- Avoid UnicodeDecodeError on windows
- [REF-2587] Ignore top-level theme appearance (#3119)
Experimental
Other Changes
- do not clear all decorated pages during AppHarness tests by @benedikt-bartscher in #3093
- improve auto-generated AppHarness app_name with partials by @benedikt-bartscher in #3088
- app_source can be partial by @benedikt-bartscher in #3100
- pin react-focus-lock to 2.11.3 (#3123)
Full Changelog: v0.4.8...v0.4.9
v0.4.8.post1
Pin react-focus-lock to 2.11.13 #3123
v0.4.8
New Features
new transpile_packages
field in rx.Component
For packages on npm which are not exported as modules, these can now be transpiled by Next.JS and used directly.
Improvements
Use bun
as a package manager on windows
Much faster package installation on windows!
x64 only (no x86 or ARM support)
Upload with no files selected still calls event handler
Note: you need to specify a default value for your files parameter to take advantage of this change.
- Fix For When user selects Empty files using File Upload by @Yummy-Yums in #3051
Enum types are now serialized to their value
- added serializer for enums by @wassafshahzad in #3058
Automatic tuple unpacking also works for Component children
- [REF-2524]Tuple unpacking should apply at component level by @ElijahAhianyo in #3062
Bug Fixes
- minimal fix for upload_url in rx.download by @Lendemor in #3073
- Force pydantic v1 for sqlmodel compatibility by @masenf in #3026
- Fix annotated EventHandler by @masenf in #3076
Experimental
Other Changes
- chore: fix some typos in comments by @hugehope in #3071
- fix: removed .git in template URL by @wassafshahzad in #3049
New Contributors
Full Changelog: v0.4.7...v0.4.8
v0.4.7
New Features
New reflex init
templates
We've added 4 new base templates to reflex init
.
(0) blank (https://blank-template.reflex.run) - A minimal template
(1) dashboard (https://dashboard.reflex.run) - A dashboard with tables and graphs
(2) chat (https://chat.reflex.run) - A ChatGPT clone
(3) sidebar (https://sidebar-template.reflex.run) - A template with a sidebar to navigate pages
You can also specify the template directly
reflex init --template chat
- Update sidebar temp by @Alek99 in #2959
- Support reflex app creation from templates from github by @martinxu9 in #2490
Use any Reflex app on Github as an initial template
reflex init
now also supports passing in any Github url as a template. Currently the Reflex app must be in the root of the Github directory (meaning the rxconfig.py
should be in the root.
reflex init --template https://github.com/reflex-dev/reflex-chat
- Support reflex app creation from templates from github by @martinxu9 in #2490
reflex run
will automatically init the app when required
Previously when updating versions of Reflex or cloning an existing Reflex app, you would have to run reflex init
before you can reflex run
. From 0.4.7, reflex init
is only required the very first time you create an app. If you are missing a .web
folder or there's a new version of Reflex, reflex run
and reflex export
will automatically init
the app for you.
rx.logo()
component to display the Reflex logo
Show Built with Reflex logo.
rx.logo()
- adding a reflex logo component by @tgberkeley in #2994
Reflex Experimental Namespace
We've introduced a new rx._x
namespace where we will be putting experimental features for early testers before they go into general release. This will help us make sure new features have time to mature with real users before we make them public
Improvements
None
can be passed in as a component prop and it will be skipped
- Logic for removing the 'None' property along with its corresponding test cases by @AmanSal1 in #2969
Leaving a trailing comma on a reflex component won't throw an error anymore as we unpack the tuple
- Unpack component tuples in a fragment by @ElijahAhianyo in #2985
Bug Fixes
- [REF-2425] Reduce unnecessary CI runs by @martinxu9 in #2966
- adjust share command prompt by @martinxu9 in #2965
- Windows uvicorn bug fix by @sid-38 in #2954
- use dict instead of set to store hooks by @Lendemor in #2995
- Added custom_attrs to the list of trigger props by @SwarajBaral in #2980
- Exclude .web dir when running uvicorn by @ElijahAhianyo in #2986
- Fix typo in page.py by @thphuc in #3001
Misc
- Lendemor/improve coverage by @Lendemor in #2988
- Include architecture post in readme by @picklelo in #2993
- Remove extra spaces in the keywords in pyproject.toml template by @martinxu9 in #2990
- add logo to blank template by @tgberkeley in #3014
- [REF-2296] Rename recursive functions by @martinxu9 in #2999
- [REF-2303] Update custom component template for new API by @martinxu9 in #3007
- remove types-tabulate from dev dependencies by @martinxu9 in #2977
New Contributors
- @AmanSal1 made their first contribution in #2969
- @sid-38 made their first contribution in #2954
- @SwarajBaral made their first contribution in #2980
- @thphuc made their first contribution in #3001
Full Changelog: v0.4.6...v0.4.7
v0.4.6
Known Issues
- Unhandled runtime error when navigating between pages in a stateless app.
- Fix: c78884b
This Release was Airdropped from 30000' over Nevada ๐ช
Breaking Changes
Use dill
instead of cloudpickle
In reflex-0.4.6, existing states persisted in redis are not compatible. Redis should be cleared and existing states/sessions discarded after upgrading.
New Features
reflex component share
CLI
Simplify sharing of custom 3rd party components to the Reflex Component Gallery.
- [REF-2168] Add share options to custom component commands by @martinxu9 in #2883
rx.ComponentState
An easy way to define per-component State.
import reflex as rx
class CounterButton(rx.ComponentState):
count: int
def increment(self):
self.count += 1
def decrement(self):
self.count -= 1
@classmethod
def get_component(cls, *children, **props):
return rx.button(
f"Counter {cls.count}",
on_click=cls.increment,
on_context_menu=cls.decrement.prevent_default,
)
counter_button = CounterButton.create
@rx.page()
def index():
return rx.vstack(
*[counter_button() for _ in range(10)]
)
app = rx.App()
Automatically Select Next Available Port
When the configured port is not available, automatically select the next sequential port until one is available
- added feature to automatically change port by @wassafshahzad in #2867
Expanding Textarea
New props on rx.el.textarea
and rx.text_area
allow the field to expand to match content and submit the form when Enter is pressed (shift+enter to create a new line)
rx.scroll_to
event
Scroll the viewpoint to show a given element by ID.
- Scroll to feature by @Yummy-Yums in #2948
Improvements
Simplify Component Wrapping API
[REF-2272] Support declaring EventHandlers directly in component by @martinxu9 in #2952
Props typed as rx.EventHandler
can be used to define event triggers without overriding get_event_triggers
method. The argument of the type specifies the JS to Python mapping: on_click: rx.EventTrigger[lambda e: [e]]
.
generate pyi files when building/publishing 3rd party component by @Lendemor in #2945
Third-party components will now have .pyi
files generated for them to improve IDE completion, similar to the built in Reflex components.
Updated Lucide Icons
The latest icons available on https://lucide.dev are now usable in Reflex. Some icon names have changed, these will print a deprecation warning pointing to the new name. The old names will be removed in 0.5.0.
- Update LUCIDE_ICON_LIST with newest Icon names by @luccavp12 in #2891
Loosen Requirement Pins
Reflex is now compatible with a wider range of dependencies. Notably, it can be used with packages that depend on Pydantic v2 (although the framework itself is still using v1).
Note: due to a regression in recent uvicorn
versions, that dep will remain pinned as it was in 0.4.5.
Avoid content flicker when using State.is_hydrated
is_hydrated
is set to False immediately when a navigation event starts, and is set back to True after all on_load events have executed. This avoids content flickering into view before a loading spinner is displayed when the spinner is conditional on the value of State.is_hydrated
.
Additionally, the WiFi off connection error pulser is only displayed when connection errors are detected (before it was displayed whenever the page was not hydrated).
Miscellaneous
- [REF-1982] state: Warn if redis state is "too big" by @masenf in #2868
- use radix box instead of chakra one for responsive elements by @Lendemor in #2921
- [REF-2229]Dedupe deprecation warnings by @ElijahAhianyo in #2871
- fix hook order to use ref inside user hooks by @Lendemor in #2906
- Ensure user-defined hooks can always access refs
- [REF-2302] When a Var points to a model, prefer access to model fields. by @masenf in #2893
Bug Fixes
- [REF-2117]:
rx.color_mode_cond
to work in f-strings by @ElijahAhianyo in #2775 - Default to None if bun/fnm version is Invalid by @ElijahAhianyo in #2940
- remove inheritance from Flex for list components by @Lendemor in #2936
- Fix markdown rendering of lists
- parse_args_spec: resolve annotations with typing.get_type_hints by @masenf in #2849
- [REF-2219] Avoid refetching states that are already cached by @masenf in #2953
- Fix issue affecting Cookie/LocalStorage values when substates contained computed vars
- [REF-2306] Include twine in dependencies on pyproject.toml by @martinxu9 in #2895
Other Changes
- Fix #2877, PR title not available for push/PR merge by @martinxu9 in #2889
- [REF-2284]Benchmark add extra info on publishing data by @ElijahAhianyo in #2864
- Revert "add precommit check added large files and git lfs rules (#2866)" by @picklelo in #2905
- [REF-1682][REF-1683][REF-1684][REF-2283]Benchmark reflex package size and .web folder by @ElijahAhianyo in #2880
- fix AppHarness reloading by @benedikt-bartscher in #2916
- Remove page.pyi: it's out of date, and not necessary by @masenf in #2924
- [REF-2416] Pass shell=True when starting AppHarness on Windows by @masenf in #2944
- updated watchdog dep by @Yummy-Yums in #2946
- Update README.md by @ChicIceCream in #2963
New Contributors
- @luccavp12 made their first contribution in #2891
- @mahrz24 made their first contribution in #2796
- @ChicIceCream made their first contribution in #2963
Full Changelog: v0.4.5...v0.4.6
v0.4.5
New Features
Support SQLAlchemy Models Directly
- Bare sqlalchemy metadata by @benedikt-bartscher in #2355
Experimental Multi-process Compilation
Pass REFLEX_COMPILE_PROCESSES=0
to opt-in to multiprocess compile, which significantly improves compilation speed of large apps (Mac and Linux only).
Improvements
- improve event handler state references by @benedikt-bartscher in #2818
- Allow access to position from HighLevelSelect by @hjpr in #2829
- [REF-2157] Allow
rx.download
to resolverx.get_upload_url
links by @masenf in #2813 - better default title for seo (also remove default description) by @Lendemor in #2844
- Make @rx.memo work with state vars passed as props by @masenf in #2810
- added name of Var to error message by @emmakodes in #2827
Bug Fixes
- [REF-2172] Add DECORATED_PAGES before compiling in thread by @masenf in #2841
- Fix known regression with py3.8 and py3.9
- Remove width prop from rx.select by @picklelo in #2835
- Get
client_ip
fromasgi.scope
by @masenf in #2808router.session.client_ip
more likely to be correct now
- convert text inside list_item to span and set icon display to inline by @Lendemor in #2860
Other Changes
- [REF-2086] Avoid "Warning: The path to the Node binary could not be found. by @masenf in #2803
- telemetry refactor + unit tests by @Lendemor in #2786
- Custom Component Request Template by @Alek99 in #2853
- Benchmark with app harness by @ElijahAhianyo in #2774
- Fix py3.8 integration test_var_operations.py by @masenf in #2858
- Account for imports of @rx.memo components for frontend package installation by @masenf in #2863
- [REF-2216] Warn if windows is used with py312 by @masenf in #2856
- Separate
get_hooks
andget_hooks_internal
for stable output by @masenf in #2710 - [REF-2219] vars: set
_was_touched
when updating cached vars by @masenf in #2886
New Contributors
- @hjpr made their first contribution in #2829
- @emmakodes made their first contribution in #2827
Full Changelog: v0.4.4...v0.4.5
v0.4.4
Known Issues
py3.8 and py3.9 using @rx.page
with REDIS_URL
set:
RuntimeError: There is no current event loop in thread 'ThreadPoolExecutor-0_0'.
Breaking Changes
Component._get_vars
signature change
Unlikely to affect most users; however the signature of Component._get_vars
has changed to accept a new include_children
parameter which should either be handled internally or passed to super()._get_vars
if this function has been overridden in a custom component.
New signature
def _get_vars(self, include_children: bool = False) -> Iterator[Var]:
New Features
Expose lang
and other attributes on <html>
tag
- pass lang and custom_attrs from app to html root by @macmoritz in #2697
rx.upload
exposes on_drop
event trigger
Trigger upload immediately after files are selected by passing an rx.upload_files
-wrapped handler directly to on_drop
trigger.
rx.el.form
supports on_submit
event trigger
Improvements
Dependency Changes
- remove pipdeptree as reflex dep by @martinxu9 in #2763
- bump up httpx to >= 0.25.1 by @martinxu9 in #2782
Enable /_upload
when get_upload_url
is used
Previously, the rx.upload
component was the only thing that resulted in the endpoint being enabled.
Update docker-example
for more realistic deployments
-
a simple dual port
Dockerfile
-
compose.yaml
providing a separate backend container and static frontend served with automatic TLS- Support volumes for data and uploaded files
-
compose.prod.yaml
including postgres database and redis containers -
app.Dockerfile
for single container, single port deployment on a platform service like Render, Railway, and Google Cloud Run -
Include app.Dockerfile for deploying to container hosting platform by @masenf in #2784
Improve "Stateless" app detection
Apps which import State, but do not actually use it are considered stateless.
Apps that use rx.State.router
automatically work without defining a dummy substate.
Apps dynamically create state at runtime (#1877) correctly include used dynamic substates.
- Track state usage by @benedikt-bartscher in #2441
Better support for plain SQLAlchemy
- add support for sqlalchemy AssociationProxys by @benedikt-bartscher in #2809
reflex component
CLI improvements
-
Build and publish in a single step
-
Improved custom component template
-
More comprehensive
.gitignore
-
[REF-2141] Custom component command improvements by @martinxu9 in #2807
EventChain
list syntax is undeprecated
It is now acceptable to pass a list of multiple EventHandler
to an event trigger, such as on_click
.
Bug Fixes
- Fix Padding in Accordion component
- Update accordion.py by @FrankBold in #2759
- Skip node install if version requirements are met
- Fix infinite recursion when a substate named "state" has a computed var by @masenf in #2778
- Fix
/_upload
404 and missingon_load
handlers in production deployment - [REF-2087] Better rx.progress styling integration with radix themes by @masenf in #2762
- Updating initialize_gitignore() to avoid modifying the encoding of the .gitignore file by @cllatser in #2797
- Fix tab freezing and crash when
appearance="dark"
andtheme_panel=True
- [REF-2098] Allow overlay Close components to have on_click handlers by @masenf in #2793
Other Changes
- Perf improvements (part 1) by @masenf in #2779
- Unwrap images in rx.markdown by @picklelo in #2789
- [AppHarness] add webdriver option arguments via env by @benedikt-bartscher in #2783
New Contributors
- @FrankBold made their first contribution in #2759
- @ansuzgs made their first contribution in #2767
Full Changelog: v0.4.3...v0.4.4
v0.4.3
New Features
Set initial_value
for rx.var
and rx.cached_var
Provide a placeholder to avoid evaluating computed vars during compile time, for example, if they would perform database queries or other expensive operations.
class MyState(rx.State):
@rx.var(initial_value=42)
def answer(self):
with rx.session() as session:
session.exec(...)
- Initial values for computed vars by @benedikt-bartscher in #2670
State.get_state
allows access to arbitrary substates from within an event handler
class MyState(rx.State):
answer: int = 42
class OtherState(rx.State):
async def get_answer(self):
my_state = await self.get_state(MyState)
print(f"The answer is {my_state}.answer")
Note that get_state
is an async function and must be await
'ed
CLI for Creating and Publishing 3rd Party Components
- Add support for custom components starter by @martinxu9 in #2314
Improvements
Allow accent
as a valid choice in rx.color
- added accent option in color by @wassafshahzad in #2713
Chakra no longer used when rendering Markdown
Sidebar template uses all Radix components
Disallow invalid /api
prefix for frontend page routes
These routes conflict with what NextJS considers special "API routes" and thus do not work for reflex pages.
rx.plotly
now accepts arbitrary config
prop
- Add config to rx.plotly component by @amirmolavi in #2745
Computed Backend-only Vars
- DRAFT PR - Added code for computed backend vars by @wassafshahzad in #2540
Connection Pulser While Websocket is Disconnected
Only show the "Connection Error" banner after a few failed reconnection attempts.
Reconnect Websocket in Stale Tabs
When a browser tab regains focus, automatically reconnect the websocket if it is disconnected.
- Reconnection Logic by @Yummy-Yums in #2743
Bug Fixes
- small update to color scheme high level select by @tgberkeley in #2712
- fix inherited backend var deps by @benedikt-bartscher in #2715
- Avoid frontend errors with getRefValue by @masenf in #2691
- Add missing header variable in el components in init.py file. by @cllatser in #2732
- [REF-2101] Support default_value and default_checked on rx.el.input by @masenf in #2739
- fix initial value for color_mode by @Lendemor in #2741
- fix drawer on_open_change event by @Lendemor in #2755
- call default_factorys on State.reset by @benedikt-bartscher in #2749
Other Changes
- benchmarks.yml: skip benchmarking if the DATABASE_URL is not set by @masenf in #2701
- do not store new_backend_vars in State class by @benedikt-bartscher in #2707
- fix type of value2 in test_state by @benedikt-bartscher in #2708
- pyproject.toml: bump to 0.4.2 by @masenf in #2724
- Update sidebar template README.md by @thedatadavis in #2735
- fix telemetry for init event by @Lendemor in #2736
- Only alert users of reflex upgrade once per project by @ElijahAhianyo in #2731
- fix black+ruff by @benedikt-bartscher in #2750
- add some backend var state inheritance tests by @benedikt-bartscher in #2685
- initial attempt at writing test for urls by @tgberkeley in #2689
New Contributors
- @thedatadavis made their first contribution in #2735
- @amirmolavi made their first contribution in #2745
Full Changelog: v0.4.2...v0.4.3
v0.4.2
New Features
Syncronize LocalStorage between tabs
Pass the new sync=True
argument to rx.LocalStorage
to enable changes on one tab to automatically update in other tabs.
Improvements
Tuple type annotations are now respected index-wise
- fixed bug in var type for iterable types by @wassafshahzad in #2617
Substates are serialized individually
This allows apps with large state to only serialize and deserialize the parts of the state needed to handle a given event.
Better Image Serialization
Improves mime type detection for more types of PIL Image objects.
- fix image serializing - REF-1889 by @mentally-gamez-soft in #2550
Other Improvements
- Progress component to support
color_scheme
on component level by @ElijahAhianyo in #2684 - ThemePanel is toggleable with bool in Theme by @Lendemor in #2675
Bug Fixes
- Fix SQLAlchemy list types by @benedikt-bartscher in #2668
- [REF-2045] Implement reduce_ex for MutableProxy by @masenf in #2688
- Fix for setting
rx.theme(appearance="dark")
(Note: dark mode does not work withrx.theme_panel
) rx.Upload
can now contain children components that use State.- Make
rx.Upload
a memoization leaf by @ElijahAhianyo in #2695
- Make
Accordion Issues
- Fix Browser Warnings
- Accordion Root Exclude
color_scheme
andvariant
props in tag by @ElijahAhianyo in #2664
- Accordion Root Exclude
- Fix accordion not working with
rx.foreach
- Accordion Items unique Value by @ElijahAhianyo in #2663
Other Changes
- Use classes for allowed components by @ElijahAhianyo in #2662
- Use sync redis client to determine prod mode worker number and add sanity check by @martinxu9 in #2679
- bump github action versions by @martinxu9 in #2680
- test_input: replace sleep with
_poll_for
by @masenf in #2677 - Debounce
input_ref
Truthiness check for vars by @ElijahAhianyo in #2692 - use direction props from radix.Flex by @Lendemor in #2696
- Bump axios version to 1.6.0 by @timmypidashev in #2699
New Contributors
- @mentally-gamez-soft made their first contribution in #2550
v0.4.1
Fix Windows Hot-reload
- Downgrade uvicorn version by @ElijahAhianyo in #2669
Improvements
Avoid Browser Error When Uploading
Bug Fixes
New Contributors
Full Changelog: v0.4.0...v0.4.1