Skip to main content

Reflex Enterprise

Advanced components, authentication, and agent APIs for Reflex apps — in pure Python.

PyPI Python

Documentation · Components · Pricing


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 set REFLEX_ACCESS_TOKEN. An app started while logged out exits with an error.
  • Development is free. reflex run works on the Free tier, with no time limit and no feature gating on components.
  • Shipping requires a paid plan. reflex export and reflex run --env prod require 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

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

reflex_enterprise-0.9.4.tar.gz (841.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

reflex_enterprise-0.9.4-py3-none-any.whl (461.2 kB view details)

Uploaded Python 3

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

Hashes for reflex_enterprise-0.9.4.tar.gz
Algorithm Hash digest
SHA256 d0cda1d3a33a8d3d0b129c7fe986cd4d4cafba4b520b8fe87a5b94ea8b41acce
MD5 973adbbf9b546512b61dbe299fc679bd
BLAKE2b-256 97fe99f9370df65a6e330263f7a69bc9b5b92b6a1e03e0c303f9662ab29a3e24

See more details on using hashes here.

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

Hashes for reflex_enterprise-0.9.4-py3-none-any.whl
Algorithm Hash digest
SHA256 0d8146df1bbebb3b9751a65f681e97ea96e115899790fa5694e34c964dc47af8
MD5 ec85f6d5cb0547a85c00d379071364b8
BLAKE2b-256 e055d8d201b4ea72aa88e1c7be43a84bbf2e6fd36bab480fe86af791c3c42e75

See more details on using hashes here.

Release history Release notifications | RSS feed

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page