Active prototype · built in public

Python UI in the browser.

Build reactive interfaces with Python components, precise DOM updates, client-side routing, and the scientific ecosystem-without adopting a JavaScript UI framework.

PythonComponents and application logic in one language
Fine-grainedUpdate the binding that changed, not a virtual tree
Browser-nativeDirect DOM and Web API access through PyScript
App-readyRouting, resources, forms, lifecycle, diagnostics

01 / Familiar by design

State becomes interface. Nothing in between.

Swipe through three real components. Every output is rendered by the state, values, labels, and interactions visible in its highlighted Python source.

02 / The complete toolkit

Small primitives. Serious applications.

The framework covers the state, rendering, lifecycle, navigation, and debugging concerns needed to move from an interactive widget to a maintained product.

01 - STATE

Signals & computed values

Track dependencies automatically, derive state lazily, group changes with batches, and run scoped effects.

02 - DOM

Declarative components

Compose native elements through Python builders with reactive text, classes, attributes, properties, and events.

03 - DATA

Resources & forms

Model async loading, failures, field state, validation, and submission without rebuilding those conventions per screen.

04 - ROUTING

Client navigation

Prefetch route shells, preserve the active Pyodide runtime, update history, and await teardown before navigation.

05 - LIFECYCLE

Cleanup that scales

Own event proxies, effects, async tasks, media sessions, and keyed row cleanup within component scopes.

06 - DX

Diagnostics built in

Inject browser capabilities, collect structured runtime diagnostics, and mark real navigation and render performance.

03 / How it works

Python all the way to the DOM.

PyScript boots Python in WebAssembly. The framework gives that runtime a precise reactive layer, while a narrow host boundary keeps browser-only capabilities explicit and testable.

01

Your components

Plain Python functions describe native browser elements and subscribe to state by reading signals.

02

Reactive graph

Signals remember their exact consumers; batching and lifecycle scopes keep updates predictable.

03

PyScript runtime

Pyodide runs application code and provides access to Python packages inside the browser.

04

Native browser

Bindings update DOM nodes directly. Host adapters cover media, maps, history, and other Web APIs.

04 / Proof, not promises

Built against real application pressure.

Three real products exercise scientific computation, camera and image APIs, offline behavior, PDF generation, realtime media, WebSockets, routing, persisted data, forms, visualization, and responsive UI.

05 / API surface

An understandable core.

The primitives fit together without hiding the browser. Learn the reactive model once, then apply it from a single component to a routed application.

signal()Reactive state with getter semantics and explicit updates.
computed()Memoized values derived from other reactive state.
effect()Side effects with automatic dependency tracking and cleanup.
component()Lifecycle-scoped component execution and ownership.
For()Keyed repeated children with stable DOM identity.
resource()Reactive loading, value, and error state for async work.
form()Fields, touched state, errors, validation, and submit flow.
RouterCached shell fetching, history, teardown, and page boot.
BrowserHostInjectable boundary around browser runtime capabilities.
DiagnosticsStructured errors and context available as reactive state.

Build the browser app you wanted Python to own.

Launch the live example