Reflex Enterprise
Advanced components, authentication, and agent APIs for Reflex apps — in pure Python.
What is it?
reflex-enterprise is the premium add-on package for the Reflex
web framework. It adds components and plugins that the Reflex team builds and maintains:
- Enterprise-grade components — AG Grid data tables, Leaflet maps, drag-and-drop, node editors, and more, all wrapped for Python with typed props and event handlers.
- Secure-by-default authentication — OIDC login, plus page, event, and state-field protection that is on unless you opt out.
- A first-class agent surface — expose your app's own event handlers to AI agents over MCP or REST, with OAuth 2.1 and per-scope human consent.
It is a drop-in layer, not a different framework: swap rx.App for rxe.App and rx.Config
for rxe.Config, and the rest of your Reflex app is unchanged. Everything in rx keeps
working exactly as before.
Installation
pip install reflex-enterprise
Optional extras:
pip install "reflex-enterprise[mcp]" # MCPPlugin — expose the app to AI agents
pip install "reflex-enterprise[testing]" # the reflex_app pytest fixture
Requires Python 3.10+ and reflex >= 0.9.6 (installed automatically).
Getting started
Two swaps, then run the app as usual with reflex run.
# rxconfig.py
import reflex_enterprise as rxe
config = rxe.Config(
app_name="my_app",
# accepts every rx.Config option, plus the enterprise-only ones
)
# my_app/my_app.py
import reflex_enterprise as rxe
app = rxe.App()
Enterprise components live in the rxe namespace next to everything you already use from rx.
Free usage and licensing
reflex-enterprise is free to use in development, but it is not open source — it ships
under a proprietary EULA
and its use is tied to a Reflex account.
- A Reflex login is required. Run
reflex login, or setREFLEX_ACCESS_TOKEN. An app started while logged out exits with an error. - Development is free.
reflex runworks on the Free tier, with no time limit and no feature gating on components. - Shipping requires a paid plan.
reflex exportandreflex run --env prodrequire Pro or Enterprise. (Deploying to Reflex Cloud is not gated by this check — it follows your cloud plan.) - The "Built with Reflex" badge
is displayed in production builds. Hiding it (
show_built_with_reflex=False) requires Pro or above on Reflex Cloud, and Enterprise when self-hosted.
See reflex.dev/pricing for what each tier includes.
Features
Authentication — AuthPlugin
Add OIDC login to an app by registering one plugin. Pages, event handlers, state fields, and computed vars are then protected by default — a protected var is never serialized to an anonymous visitor, and a protected handler never runs for one — so an unguarded surface has to be an explicit choice rather than an oversight.
# rxconfig.py
import reflex_enterprise as rxe
config = rxe.Config(app_name="my_app", plugins=[rxe.AuthPlugin()])
import reflex as rx
import reflex_enterprise as rxe
class DashboardState(rx.State):
revenue: int = 0 # protected: never sent to an anonymous visitor
@rxe.var(auth=False)
def headline(self) -> str: # explicitly public
return "Welcome!"
@rxe.event(auth=lambda ctx: ctx.auth_user_state.email.endswith("@acme.com"))
def close_the_books(self): ...
@rxe.page(route="/dashboard") # login required
def dashboard() -> rx.Component: ...
@rxe.page(route="/", auth=False) # public
def index() -> rx.Component: ...
/login, /logout, /callback, and /forbidden routes are generated for you (and are fully
customizable), an event blocked before login is replayed afterwards instead of being lost, and
an audit hook can observe every login and
access decision.
AI agent access — MCPPlugin
Publish your app's existing event handlers as Model Context Protocol tools, so an agent can drive the real app — no separate API to write or keep in sync.
# rxconfig.py
import reflex_enterprise as rxe
config = rxe.Config(app_name="my_app", plugins=[rxe.AuthPlugin(), rxe.MCPPlugin()])
A streamable-HTTP MCP server is mounted at /_reflex/mcp with search_events and
queue_event tools plus a reflex:// resource family for reading live session state. Add an
AuthPlugin and the app becomes a spec-compliant OAuth 2.1 authorization + resource server:
agents authenticate through your existing identity provider, the human approves individually
grantable app scopes on a consent page, and the app issues its own resource-bound tokens so
upstream IdP tokens never leave the server. Every auth check you already wrote applies to agent
traffic unchanged. Prefer REST? EventHandlerAPIPlugin
exposes the same handlers as HTTP endpoints with a generated OpenAPI spec.
Advanced components
| Component | Description | Docs |
|---|---|---|
| AG Grid | Enterprise data grid — sorting, filtering, pivoting, grouping, master/detail, cell selection, server-side row model, and direct SQLModel table binding. | Docs |
| AG Charts | Financial and statistical visualizations, with charting driven straight from state. | Docs |
| Map | Interactive Leaflet maps: tile layers, markers, popups, vector shapes, controls, and a programmatic map API. | Docs |
| Drag and Drop | react-dnd draggables and drop targets, with hooks for advanced cases. |
Docs |
| React Flow | Node-based editors, flowcharts, and diagrams with custom nodes and edges. | Docs |
| Mantine | Extra inputs and UI primitives — autocomplete, multi-select, tags input, tree, timeline, date pickers, progress rings. | Docs |
import reflex as rx
import reflex_enterprise as rxe
class State(rx.State):
column_defs: list[dict] = [{"field": "name"}, {"field": "age"}]
row_data: list[dict] = [{"name": "Ada", "age": 36}]
@rx.event
def handle_drop(self, item: dict):
return rx.toast(f"dropped {item}")
rxe.ag_grid(
id="grid",
column_defs=State.column_defs,
row_data=State.row_data,
row_selection={"mode": "multiRow"},
)
rxe.map(
rxe.map.tile_layer(url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"),
rxe.map.marker(rxe.map.popup("You are here"), position=rxe.map.latlng(lat=51.505, lng=-0.09)),
id="map",
center=rxe.map.latlng(lat=51.505, lng=-0.09),
zoom=13,
height="50vh",
)
rxe.dnd.drop_target(
rxe.dnd.draggable(rx.card("Drag me"), type="card"),
accept=["card"],
on_drop=State.handle_drop,
)
Testing
The reflex_app pytest fixture boots your real app — frontend and backend — and hands the test
a live URL to drive with Playwright or any other browser tooling. It is registered through an
entry point, so there is no conftest.py wiring to do.
from playwright.sync_api import Page, expect
from reflex_enterprise.testing import ReflexApp
def test_signup(reflex_app: ReflexApp, page: Page):
page.goto(reflex_app.url)
page.get_by_placeholder("Email").fill("dev@reflex.dev")
page.get_by_role("button", name="Sign up").click()
expect(page.get_by_text("Thanks, dev@reflex.dev!")).to_be_visible()
The app under test is discovered by walking up to the nearest rxconfig.py, started once per
session, and reused across tests.
Links
- Enterprise documentation
- Reflex documentation
- Changelog
- Pricing and tiers
- Questions or bugs? Reach us at support@reflex.dev
License
Proprietary — see the EULA. Copyright © Pynecone, Inc.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file reflex_enterprise-0.9.4.tar.gz.
File metadata
- Download URL: reflex_enterprise-0.9.4.tar.gz
- Upload date:
- Size: 841.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d0cda1d3a33a8d3d0b129c7fe986cd4d4cafba4b520b8fe87a5b94ea8b41acce
|
|
| MD5 |
973adbbf9b546512b61dbe299fc679bd
|
|
| BLAKE2b-256 |
97fe99f9370df65a6e330263f7a69bc9b5b92b6a1e03e0c303f9662ab29a3e24
|
File details
Details for the file reflex_enterprise-0.9.4-py3-none-any.whl.
File metadata
- Download URL: reflex_enterprise-0.9.4-py3-none-any.whl
- Upload date:
- Size: 461.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d8146df1bbebb3b9751a65f681e97ea96e115899790fa5694e34c964dc47af8
|
|
| MD5 |
ec85f6d5cb0547a85c00d379071364b8
|
|
| BLAKE2b-256 |
e055d8d201b4ea72aa88e1c7be43a84bbf2e6fd36bab480fe86af791c3c42e75
|