Skip to main content

Hedron

PyPI Python CI License: MIT

Build admin tools, CRUD apps, and dashboards in Python—without building a separate frontend.

Hedron is a typed, server-rendered UI framework for FastAPI. Routes return Python components, Hedron renders safe HTML, and HTMX updates just the part of the page that changed. You keep FastAPI's routing, dependency injection, middleware, and JSON APIs; you do not need a Node.js toolchain or a full-script rerun model.

A Hedron app with a status panel updated by HTMX

Requires Python 3.11–3.14. Pin the published hedron>=0.58.0,<0.60 release from PyPI. The repository checkout provides the deferred v0.59.0 patch; PyPI remains at v0.58.0. The fastest path uses uv:

uvx --from "hedron>=0.58.0,<0.60" hedron new my-hedron-app
cd my-hedron-app
uv sync
uv run uvicorn app:app --reload

Open http://127.0.0.1:8000, then click Refresh status. Only the status region is returned and swapped into the page.

The generated app (from hedron new) is ordinary Python:

import os
from datetime import UTC, datetime

from hedron import Hedron, Stack, Text, html

app = Hedron(
    title="Hedron App",
    security="standard",
    explorer="off",
    session_secret=os.environ.get("HEDRON_SESSION_SECRET", "replace-in-production"),
)


@app.refreshable("/status")
def status():
    stamp = datetime.now(UTC).strftime("%H:%M:%S UTC")
    return html.div(
        Text(f"All systems operational · refreshed {stamp}"),
        role="status",
        aria={"live": "polite"},
    )


@app.command(fallback="/")
def ping():
    from hedron import refresh

    return refresh(status).toast("Refreshed")


@app.screen("/", title="Home")
def home():
    return Stack(
        Text("Hello from hedron new"),
        status(),
        status.refresh_button("Refresh status"),
        ping.button("Ping"),
    )

Prefer @app.screen for new apps. Use explicit Page + @app.page only when you need full Page constructor control (docs).

Undeclared HTMX targets fail closed.

Follow the first-app walkthrough or browse the single-file examples.

What Hedron gives you

Need Hedron provides
Server-rendered UI Typed pages, layouts, forms, tables, dialogs, status views, and media components
Partial-page interaction Declared HTMX fragments, out-of-band updates, progressive-enhancement paths, and target allowlists
FastAPI integration Normal routes, dependencies, middleware, lifespan hooks, responses, and OpenAPI alongside UI routes
Safer defaults Contextual escaping, typed URL/HTML trust boundaries, CSRF profiles, and conservative caching
Production building blocks Polling jobs, diagnostics, testing helpers, build manifests, deployment guidance, and Flask/Django adapters

Your application still owns authentication, authorization, persistence, tenancy, and deployment. Hedron is not an ORM, identity provider, hosted service, or client-side SPA runtime.

When it fits

Choose Hedron when you want to build forms, internal tools, admin surfaces, or dashboards as a conventional web application while keeping most UI code in typed Python. It is especially useful when raw FastAPI plus Jinja plus HTMX would leave you assembling the same rendering, fragment, CSRF, asset, and component conventions yourself.

Choose Streamlit for notebook-style, full-script-rerun data apps. Choose raw FastAPI and templates when you do not want a component framework. Choose a client-side framework when the product genuinely needs a large browser-side state model.

Coming from Streamlit? Start with the migration center.

Install

The latest installable PyPI release is hedron>=0.58.0,<0.60. The repository checkout and PyPI both provide the 0.59.x train; use uv sync when working from a checkout.

uv add "hedron>=0.58.0,<0.60" "uvicorn[standard]"
# or
python -m pip install "hedron>=0.58.0,<0.60" "uvicorn[standard]"

Package maturity: Beta · Repository train: 0.59.x · Repository tip: 0.59.0 · Latest PyPI release: 0.58.0 · Application pin: >=0.58.0,<0.60

Before deploying, read What's ready today and the shipping guide. Polling is the supported production status-update path; SSE and WebSocket helpers remain experimental.

Add only what you need

The base package includes the FastAPI application, typed UI, HTML renderer, HTMX interactions, security profiles, and CLI. Integrations are optional:

Install Adds
hedron[data] DataTable and DataEditor
hedron[charts] Charts with a compatible satellite floor
hedron[maps] First-class maps (hedron-maps)
hedron[jinja] Optional .hdj templates
hedron[dev] Component Explorer
hedron[extras] Curated workbenches
hedron[auth] Authlib OIDC helpers
hedron[markdown] Markdown rendering and sanitization
hedron[native] Optional Beta native acceleration
hedron[mcp] Beta MCP projection (Supported inventory; mutations Experimental)
hedron[notebook] Beta tooling-grade localhost preview; not a production server
hedron[gradio] Beta allowlisted Gradio/Hugging Face client interoperability
hedron[elements] Beta Web Component ABI (Supported inventory only)

For example:

uv add "hedron[data,dev]>=0.58.0,<0.60"

Charts require the fixed compatible floor:

uv add "hedron[charts]>=0.58.0,<0.60"

See the full installation and extras guide and the compatibility matrix.

Already have a FastAPI app?

You can mount Hedron's router and static assets without replacing your application:

from fastapi import FastAPI
from hedron import HTML, HedronRouter, Text, hedron_response, mount_hedron_static
from hedron.security.policy import SecurityPolicy

app = FastAPI()
app.state.hedron_security = SecurityPolicy.from_name("standard")
mount_hedron_static(app)

ui = HedronRouter()


@ui.get("/hello", **hedron_response())
def hello():
    return HTML(Text("Hello from Hedron"))


app.include_router(ui)

Read the existing-FastAPI guide. Flask and Django hosts are available through hedron-flask and hedron-django; both share the framework-neutral hedron-core renderer.

CLI

python -m hedron new demoapp
python -m hedron --app app:app routes
python -m hedron --app app:app components
python -m hedron --app app:app preview home
python -m hedron --app app:app check
python -m hedron --app app:app graph

Learn more

License

MIT. See the license.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hedron-0.59.0.tar.gz (279.4 kB view details)

Uploaded Source

Built Distribution

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

hedron-0.59.0-py3-none-any.whl (344.3 kB view details)

Uploaded Python 3

File details

Details for the file hedron-0.59.0.tar.gz.

File metadata

  • Download URL: hedron-0.59.0.tar.gz
  • Upload date:
  • Size: 279.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","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 hedron-0.59.0.tar.gz
Algorithm Hash digest
SHA256 0e90845e7b13669e740ef2d0ee210a35194f0f58fe5f119408879711962ce905
MD5 8f9013eb38bdf1e5cac4a42c5f145fb3
BLAKE2b-256 7248eda13f448ad10660e1bf21c0ded8141ba139f32f41d69915aac1cab223e6

See more details on using hashes here.

File details

Details for the file hedron-0.59.0-py3-none-any.whl.

File metadata

  • Download URL: hedron-0.59.0-py3-none-any.whl
  • Upload date:
  • Size: 344.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","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 hedron-0.59.0-py3-none-any.whl
Algorithm Hash digest
SHA256 31c0368bda49c65ac458530db325a2fd131a74276290721220d2977afd7dbb77
MD5 6dbef76f361660cb3b7a3148d0b7952b
BLAKE2b-256 e1d9034668582f134870874d7115f532358d4e18e65b1c083658027d31a82d14

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.59.0 This release

2 files

0.58.1

2 files

0.58.0

2 files

0.57.0

2 files

0.56.0

2 files

0.55.0

2 files

0.54.0

2 files

0.53.0

2 files

0.52.0

2 files

0.51.2

2 files

0.51.1

2 files

0.51.0

2 files

0.50.3

2 files

0.50.2

2 files

0.50.1

2 files

0.50.0

2 files

0.49.1

2 files

0.49.0

2 files

0.48.0

2 files

0.47.0

2 files

0.46.0

2 files

0.45.0

2 files

0.44.0

2 files

0.43.0

2 files

0.42.0

2 files

0.41.0

2 files

0.40.0

2 files

0.39.0

2 files

0.38.0

2 files

0.37.0

2 files

0.36.0

2 files

0.35.0

2 files

0.34.0

2 files

0.33.0

2 files

0.32.0

2 files

0.31.0

2 files

0.30.0

2 files

0.29.0

2 files

0.28.2

2 files

0.28.1

2 files

0.28.0

2 files

0.27.0

2 files

0.26.1

2 files

0.26.0

2 files

0.25.2

2 files

0.25.1

2 files

0.25.0

2 files

0.24.0

2 files

0.23.0

2 files

0.22.0

2 files

0.21.0

2 files

0.20.0

2 files

0.19.0

2 files

0.18.0

2 files

0.17.0

2 files

0.16.0

2 files

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.0

2 files

0.11.0

2 files

0.10.1

2 files

0.10.0

2 files

0.8.0

2 files

0.7.0

2 files

0.6.0

1 file

0.5.0

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

Supported by

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