Publishing WASM wheels to PyPI to be used with Pyodide
thirteenth June 2026
The Pyodide 314.0 launch announcement (by way of Hacker Information) contains information I’ve been trying ahead to for a very long time:
Now you can publish Python packages constructed for Pyodide (or any Python runtime suitable with the PyEmscripten platform outlined in PEP 783) on to PyPI and set up them at runtime.
Beforehand, the Pyodide maintainers needed to preserve, construct, and host over 300 packages ourselves. This created a major burden on our maintainers and have become a significant bottleneck for the group, as each new package deal required guide overview.
Shifting ahead, package deal maintainers can merely construct and publish Pyodide wheels to PyPI, simply as they do for native wheels on Linux, macOS, or Home windows.
Right here’s the PR to PyPI itself supporting this, which landed on April twenty first.
I like Pyodide, and have been annoyed previously by this limitation. It’s attainable to compile C or Rust extensions to WASM in a wheel file, however prior to now there was no simple strategy to distribute them.
Due to the efforts of a complete lot of individuals, that’s now been fastened!
Making an attempt it out with luau-wasm
I made a decision to have fun by discovering one thing I might package deal. I’ve fairly a couple of experimental Pyodide tasks mendacity round, however the perfect match for this my Luau WebAssembly analysis spike from ninth March.
Luau is a “small, quick, and embeddable programming language primarily based on Lua with a gradual kind system”, developed by Roblox and launched below an MIT license.
It’s written in C++. I already knew it was attainable to compile it to WebAssembly and get it working inside Pyodide, so I set Codex + GPT-5.5 xhigh the duty of packaging my experiment up and publishing it to PyPI utilizing GitHub Actions.
It took some iteration, however right here’s the consequence: luau-wasm is a model new PyPI package deal which publishes a 276KB luau_wasm-0.1a0-cp314-cp314-pyemscripten_2026_0_wasm32.whl file which can be utilized in Pyodide like this:
import micropip
await micropip.set up(“luau-wasm”)
import luau_wasm
print(luau_wasm.execute(r”’
native animals = {“fox”, “owl”, “frog”, “rabbit”}
desk.kind(animals, perform(a, b) return #a < #b finish)
for i, identify in animals do print(i .. “. ” .. identify .. ” (” .. #identify .. “)”) finish
”’))
You may run that code within the Pyodide REPL demo to see it in motion.
The GitHub repo for luau-wasm contains all the construct and deploy scripts (utilizing the most recent cibuildwheel) and in addition deploys an HTML demo web page which hundreds Pyodide, installs luau-wasm and gives an interface for making an attempt it out: https://simonw.github.io/luau-wasm/

What number of packages are utilizing this thus far?
I used to be curious to see what number of packages are at the moment publishing wheels for this platform.
After some tinkering with ChatGPT I acquired to this BigQuery SQL which I ran in opposition to PyPI’s public dataset on BigQuery. Right here’s the uncooked JSON of question outcomes and right here’s a SQLite SQL question in Datasette Lite which dedupes packages by most up-to-date add date.
If the question is correct, there are at the moment 28 PyPI packages publishing with the brand new pyemscripten_202*_wasm32 tags:
luau-wasm, uuid7-rs, cmm-16bit, pyOpenTTDAdmin, imgui-bundle, numbertoolkit, bashkit, geoarrow-rust-core, arro3-io, arro3-core, arro3-compute, onnx, powerfit-em, tcod, chonkie-core, tokie, robotraconteur, pydantic_core, yaml-rs, cadquery-ocp-novtk-OCP.wasm, uuid_utils, base64_utils, pycdfpp, lib3mf-OCP.wasm, typst, toml-rs, onnx-weekly, dummy-pyodide-ext-test
Right here’s hoping we see an entire lot extra of these exhibiting up over the approaching months and years.
