# Running Python ASGI apps in the browser via Pyodide + a service worker

> Source: <https://simonwillison.net/2026/May/30/pyodide-asgi-browser/#atom-everything>
> Published: 2026-05-30 21:02:16+00:00

**Research:** [Running Python ASGI apps in the browser via Pyodide + a service worker](https://github.com/simonw/research/tree/main/pyodide-asgi-browser#readme)

[Datasette Lite](https://lite.datasette.io/) is my version of Datasette that runs entirely in the browser using Pyodide in WebAssembly.

When I first built it [four years ago](https://simonwillison.net/2022/May/4/datasette-lite/) I used Web Workers and code that intercepts navigation operations and fetches the generated HTML by running the Python app.

This worked, but had the disadvantage that any JavaScript in `<script>`

tags would not be executed - breaking some Datasette functionality and a whole lot of Datasette plugins.

This morning I [set Claude Opus 4.8 the task](https://github.com/simonw/research/pull/112) (in Claude Code for web) of figuring out how to run Python ASGI apps in Pyodide using Service Workers instead, and it seems to work! Here's a [basic ASGI FastCGI demo](https://simonw.github.io/research/pyodide-asgi-browser/) and here's [a demo that runs Datasette 1.0a31](https://simonw.github.io/research/pyodide-asgi-browser/datasette.html).

I'm still getting my head around exactly how it works, but once I've done that I plan to upgrade Datasette Lite itself.

Tags: [javascript](https://simonwillison.net/tags/javascript), [python](https://simonwillison.net/tags/python), [datasette](https://simonwillison.net/tags/datasette), [asgi](https://simonwillison.net/tags/asgi), [service-workers](https://simonwillison.net/tags/service-workers), [pyodide](https://simonwillison.net/tags/pyodide), [datasette-lite](https://simonwillison.net/tags/datasette-lite), [claude-code](https://simonwillison.net/tags/claude-code)
