Skip to content

Gallery

Python apps, in the browser, measured.

Python in the browser, on its own runtime compiled to WebAssembly. Every app below is a directory of static files: no server, no build step, no JavaScript toolchain. The numbers are measured, not claimed — they come from loading each page in Chromium with a cold cache.

Counter

Signals, a memo, and a hole that updates one text node.

854 KBstarts in 97 ms

Todo

A store, a keyed For, two-way binding.

863 KBstarts in 67 ms

Template

The same counter written as html(t"…").

859 KBstarts in 63 ms

Forms

Bindings, Switch, an Action on submit.

856 KBstarts in 66 ms

Fetch

Resource, Loading and Errored.

856 KBstarts in 45 ms

Contacts

The router: nested routes, links, query strings.

883 KBstarts in 65 ms

Lazy route

A route in a chunk of its own: fetched on hover, not on load.

895 KBstarts in 63 ms

uPlot

A JavaScript chart library as a component — 20,000 points on a canvas.

920 KBstarts in 117 ms

Wasm library

A WebAssembly library imported like any Python module.

856 KBstarts in 70 ms

Your own Rust

A 1 KB Rust library, called from Python: 13× on the arithmetic.

879 KBstarts in 84 ms

Spectrum

An FFT, a spectrogram and a filter, in 12 KB of Rust. No server.

1,025 KBstarts in 129 ms

Weather

Streamlit's Seattle Weather demo, ported: five charts, no server.

1,042 KBstarts in 145 ms

GW150914

Streamlit's GW Quickview, ported: real LIGO strain, whitened in the page, the merger found.

1,536 KBstarts in 132 ms

Uber NYC

Streamlit's flagship demo, rebuilt: a million pickups, and panning the map is an input.

1,282 KBstarts in 119 ms

Tracker

The whole framework in one app: routes, store, optimistic writes, a portal.

914 KBstarts in 48 ms

Islands

A static page and two islands: the runtime is not on the critical path.

10 KBshows in 41 msno runtime

Blog

Markdown, front matter and a schema — rendered at build time, with an island in the prose.

9 KBshows in 43 msno runtime

Site

A directory of pages as a directory of files: posts, an endpoint, an island. The card is its front page.

6 KBshows in 40 msno runtime

Measured 2026-10-07 · Chromium, cold cache, first paint of the app's own content · the interpreter, the loader and the framework are 853 KB of every figure and are byte-identical, so a browser downloads them once for all of them. A card marked no runtime is a static page with islands: it was measured with the runtime denied, so its figure is the page, its stylesheet and the 1.3 KB loader — the runtime arrives later, when an island's trigger fires, or never.