Edron
Build polished, server-rendered Python apps with a small, explicit API.
Edron keeps the first page simple and gives the same codebase room to grow into dashboards, internal tools, data workspaces, long-running jobs, and reusable feature packages. You write ordinary Python, run one command, and get accessible HTML with progressive enhancement—without maintaining a separate frontend application or learning a callback-heavy UI model.
A first page in minutes
Install Edron, create app.py, and start the development server:
python -m pip install edron
edron run app:app --reload
import edron as ed
app = ed.App(title="Hello Edron")
@app.page("/", title="Hello")
class Home(ed.Page):
def render(self) -> None:
self.heading("Hello, Edron")
self.text("A small Python API for useful web applications.")
That is the whole application. Add a route, compose a layout, or wire an action when you need it—there is no generated frontend project to keep in sync.
For a guided starting point, use a teaching scaffold:
edron new my-app --template minimal
cd my-app
edron run app:app --reload
Why developers reach for Edron
- Python all the way down. Pages, components, actions, forms, data, and jobs use familiar functions, classes, and type hints.
- A fast path and an escape hatch. Start with a handful of readable Edron primitives. Keep full control of the underlying application when an advanced integration needs it.
- Server-first by default. HTML is useful on its own; HTMX-style enhancement adds smooth interactions without making JavaScript a requirement.
- Batteries included for real work. Compose navigation and layouts, render charts and media, build bounded data tables and editors, manage resources and caching, and expose durable jobs.
- Inspectable instead of magical.
edron check,edron explain, andedron doctormake registration, dependencies, capabilities, and deployment facts visible before production. - Easy to test and review. Explicit routes, typed inputs, bounded payloads, and deterministic manifests keep behavior straightforward to assert in unit tests and code review.
A small API that scales
The same page vocabulary works for a simple screen or a complete workflow:
import edron as ed
app = ed.App(title="Sales")
@app.page("/sales", title="Sales")
class Sales(ed.Page):
def render(self) -> None:
self.heading("Sales overview")
with self.layout(ed.layout("grid", columns=2)) as body:
body.text("A layout is just Python composition.")
Common building blocks include:
| Need | Edron API |
|---|---|
| Pages and reusable UI | Page, @app.page, fragment, inherit, expose |
| Navigation and layout | navigation_target, layout, NavLink-compatible targets |
| Forms and interactions | typed action, fragment, Outcome, refresh, success |
| Tables and editing | DataSource, DataWorkspace, Column, EditPolicy |
| Charts and media | chart, map, image, audio, video |
| Resources and performance | resource, dependency, cache_data |
| Long-running work | JobFlow, JobBackend, status polling/events |
| Reusable app features | feature_package, include_package, capability promotion |
Data, resources, and jobs stay explicit
Edron makes application boundaries visible instead of hiding them in global state. For example, resources are lazy and app-owned, cache policy is declared beside the function it protects, and data editing is deny-by-default:
db = app.resource("database", create_database, secret_refs={"dsn": "DATABASE_URL"})
@ed.cache_data(ttl=60, scope="tenant", vary_on=("tenant_id",))
def load_summary(tenant_id: str) -> dict[str, int]:
return query_summary(db, tenant_id)
Use DataWorkspace for bounded paging, filtering, sorting, selection, CSV export, and typed edit
intents. Use JobFlow when work must outlive a request. Your application still owns the database
session, transaction, authorization, persistence, and audit decisions.
Tooling that helps before deployment
# Check source without importing application code
edron check app.py
# Inspect registered pages and surfaces
edron explain app:app
# Check installed required and optional capabilities
edron doctor
For CI, edron check --format sarif produces review-friendly diagnostics. Applications can also
expose deterministic app.manifest() and app.conformance() reports for release checks.
Installation and optional integrations
Edron supports Python 3.11–3.14. Install only what your application needs:
python -m pip install edron
Optional extras are available for pandas, Polars, PyArrow, Plotly, Altair, Matplotlib, and
SQLAlchemy (for example, pip install "edron[polars,sqlalchemy]").
Read the getting started guide, browse the API guides, or see the Edron roadmap.
How Edron fits in
Edron is the authoring layer: it gives application developers a friendly, typed vocabulary and
keeps the important boundaries explicit. A mature native web engine handles the lower-level
rendering, routing, interaction, styling, and security work underneath. Most applications never
need to think about that implementation detail; when they do, the exact native application remains
available through app.native / app.hedron and Page.include().
Edron is currently a Beta API line. Feedback, issues, and contributions are welcome in the Hedron repository.
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 edron-0.6.0.tar.gz.
File metadata
- Download URL: edron-0.6.0.tar.gz
- Upload date:
- Size: 47.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
006a30afdbb4846143f0daad27410dbcd19cc58d28407ea630312014e0be77a4
|
|
| MD5 |
15bf71a9a56cecda6e7962a4b5c7171c
|
|
| BLAKE2b-256 |
1d7d723eb67d9afba0cc9279bedb97963d600348dc7bce162b3107fe6f0257fa
|
Provenance
The following attestation bundles were made for edron-0.6.0.tar.gz:
Publisher:
edron-release.yml on eddiethedean/hedron
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
edron-0.6.0.tar.gz -
Subject digest:
006a30afdbb4846143f0daad27410dbcd19cc58d28407ea630312014e0be77a4 - Sigstore transparency entry: 2611634899
- Sigstore integration time:
-
Permalink:
eddiethedean/hedron@072d01b02d9ac1f78bafe8978a7ed8833baf6470 -
Branch / Tag:
refs/tags/edron-v0.6.0 - Owner: https://github.com/eddiethedean
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
edron-release.yml@072d01b02d9ac1f78bafe8978a7ed8833baf6470 -
Trigger Event:
push
-
Statement type:
File details
Details for the file edron-0.6.0-py3-none-any.whl.
File metadata
- Download URL: edron-0.6.0-py3-none-any.whl
- Upload date:
- Size: 56.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7338f6562ecaaa1c6bcec98db9e11246d8d91ecbaa37a4cd1f2a99d485ab9b24
|
|
| MD5 |
bfaf408df3d46c9e7ce599a8cadcf91a
|
|
| BLAKE2b-256 |
f04dd4d61f6bdc603c5e20c00250df15e0b2f25c9411f16b308e78360458864d
|
Provenance
The following attestation bundles were made for edron-0.6.0-py3-none-any.whl:
Publisher:
edron-release.yml on eddiethedean/hedron
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
edron-0.6.0-py3-none-any.whl -
Subject digest:
7338f6562ecaaa1c6bcec98db9e11246d8d91ecbaa37a4cd1f2a99d485ab9b24 - Sigstore transparency entry: 2611635100
- Sigstore integration time:
-
Permalink:
eddiethedean/hedron@072d01b02d9ac1f78bafe8978a7ed8833baf6470 -
Branch / Tag:
refs/tags/edron-v0.6.0 - Owner: https://github.com/eddiethedean
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
edron-release.yml@072d01b02d9ac1f78bafe8978a7ed8833baf6470 -
Trigger Event:
push
-
Statement type: