[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-pypi-wasm-wheels-pyodide-en":3,"article-related-pypi-wasm-wheels-pyodide-en":30,"series-tools-6138a501-502b-471f-87c7-0adae7d12cfd":75},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":22,"views":26,"created_at":27,"published_at":28,"topic_cluster_id":29},"6138a501-502b-471f-87c7-0adae7d12cfd","pypi-wasm-wheels-pyodide-en","PyPI now accepts WASM wheels for Pyodide","\u003Cp data-speakable=\"summary\">PyPI now accepts Pyodide-compatible WASM wheels, removing a major packaging bottleneck for browser-side Python.\u003C\u002Fp>\u003Cp>\u003Ca href=\"https:\u002F\u002Fpyodide.org\u002Fen\u002Fstable\u002F\" target=\"_blank\" rel=\"noopener\">Pyodide\u003C\u002Fa> just got a lot easier to package for. On 13 \u003Ca href=\"\u002Fnews\u002Frust-reaches-new-tiobe-high-june-2026-en\">June 2026\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fsimonwillison.net\u002F\" target=\"_blank\" rel=\"noopener\">Simon Willison\u003C\u002Fa> wrote that Python packages built for WebAssembly can now be published straight to \u003Ca href=\"https:\u002F\u002Fpypi.org\u002F\" target=\"_blank\" rel=\"noopener\">PyPI\u003C\u002Fa> and installed at runtime in Pyodide.\u003C\u002Fp>\u003Cp>That sounds small until you remember the old workflow: the Pyodide maintainers had to build, host, and review more than 300 packages themselves. For a browser-based Python runtime, that was a huge bottleneck.\u003C\u002Fp>\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Metric\u003C\u002Fth>\u003Cth>Value\u003C\u002Fth>\u003Cth>Why it matters\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Pyodide packages previously maintained by core team\u003C\u002Ftd>\u003Ctd>300+\u003C\u002Ftd>\u003Ctd>Manual packaging created a backlog\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>PyPI packages already using the new tag\u003C\u002Ftd>\u003Ctd>28\u003C\u002Ftd>\u003Ctd>Early adoption is already visible\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>luau-wasm wheel size\u003C\u002Ftd>\u003Ctd>276 KB\u003C\u002Ftd>\u003Ctd>Shows how small some browser-ready wheels can be\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>PyPI PR landing date\u003C\u002Ftd>\u003Ctd>2026-04-21\u003C\u002Ftd>\u003Ctd>The registry change is already live\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Ch2>What changed in PyPI\u003C\u002Fh2>\u003Cp>The key update is support for a new wheel platform tag: \u003Ccode>pyemscripten_202*_wasm32\u003C\u002Fcode>. That tag lets maintainers publish WebAssembly builds to PyPI in the same way they already publish Linux, macOS, or Windows wheels.\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781875101557-vl79.png\" alt=\"PyPI now accepts WASM wheels for Pyodide\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>Willison points to the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpypi\u002Fwarehouse\u002Fpull\u002F15586\" target=\"_blank\" rel=\"noopener\">PyPI pull request\u003C\u002Fa> that added support, which landed on 21 April 2026. The practical result is simple: a package author can ship a WASM build, and Pyodide can install it at runtime without a special side channel.\u003C\u002Fp>\u003Cp>This matters because Pyodide is not a toy project. It is a full Python runtime compiled to WebAssembly, and it is one of the cleanest ways to run Python in the browser without server round-trips. When packaging gets easier, the ecosystem gets larger.\u003C\u002Fp>\u003Cul>\u003Cli>Old model: Pyodide maintainers built and hosted packages themselves.\u003C\u002Fli>\u003Cli>New model: package authors publish their own WASM wheels to PyPI.\u003C\u002Fli>\u003Cli>Effect: fewer manual reviews and less maintenance overhead for the core team.\u003C\u002Fli>\u003Cli>Result: more packages can become available to browser-based Python apps.\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Willison’s luau-wasm test case\u003C\u002Fh2>\u003Cp>To prove the workflow, Willison packaged his own experiment, \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsimonw\u002Fluau-wasm\" target=\"_blank\" rel=\"noopener\">luau-wasm\u003C\u002Fa>, and published it to PyPI. The package wraps \u003Ca href=\"https:\u002F\u002Fluau.org\u002F\" target=\"_blank\" rel=\"noopener\">Luau\u003C\u002Fa>, Roblox’s small embeddable language derived from Lua and written in C++.\u003C\u002Fp>\u003Cp>He used \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code\" target=\"_blank\" rel=\"noopener\">Claude Code\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fopenai.com\u002Findex\u002Fgpt-5-5\u002F\" target=\"_blank\" rel=\"noopener\">GPT-5.5\u003C\u002Fa> to help package the project and wire up \u003Ca href=\"\u002Ftag\u002Fgithub\">GitHub\u003C\u002Fa> Actions. The package shipped as a 276 KB wheel named \u003Ccode>luau_wasm-0.1a0-cp314-cp314-pyemscripten_2026_0_wasm32.whl\u003C\u002Fcode>.\u003C\u002Fp>\u003Cblockquote>“Moving forward, package maintainers can simply build and publish Pyodide wheels to PyPI, just as they do for native wheels on Linux, macOS, or Windows.”\u003C\u002Fblockquote>\u003Cp>That quote from Willison gets to the heart of the change. The packaging model is now familiar enough that maintainers do not need a separate distribution path just for browser Python.\u003C\u002Fp>\u003Cp>The repo also includes build and deploy scripts using \u003Ca href=\"https:\u002F\u002Fcibuildwheel.pypa.io\u002Fen\u002Fstable\u002F\" target=\"_blank\" rel=\"noopener\">cibuildwheel\u003C\u002Fa>, plus an HTML demo at \u003Ca href=\"https:\u002F\u002Fsimonw.github.io\u002Fluau-wasm\u002F\" target=\"_blank\" rel=\"noopener\">simonw.github.io\u002Fluau-wasm\u003C\u002Fa> that loads Pyodide, installs the package, and runs code in the browser.\u003C\u002Fp>\u003Ch2>What 28 packages tells us\u003C\u002Fh2>\u003Cp>Willison also checked PyPI’s public BigQuery dataset and found 28 packages already publishing with the new WASM platform tags. That list includes \u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Fpydantic_core\u002F\" target=\"_blank\" rel=\"noopener\">pydantic_core\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Fonnx\u002F\" target=\"_blank\" rel=\"noopener\">onnx\u003C\u002Fa>, \u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Ftypst\u002F\" target=\"_blank\" rel=\"noopener\">typst\u003C\u002Fa>, and several \u003Ca href=\"\u002Ftag\u002Frust\">Rust\u003C\u002Fa>-backed packages such as \u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Fyaml-rs\u002F\" target=\"_blank\" rel=\"noopener\">yaml-rs\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Ftoml-rs\u002F\" target=\"_blank\" rel=\"noopener\">toml-rs\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781875105722-vipg.png\" alt=\"PyPI now accepts WASM wheels for Pyodide\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>That number is still small, but it is enough to show the pattern is real. The early adopters are mostly packages that already have native code or cross-compiled components, which makes sense because those are the projects that benefit most from a browser-safe binary format.\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Fluau-wasm\u002F\" target=\"_blank\" rel=\"noopener\">luau-wasm\u003C\u002Fa>: a fresh example of a WASM wheel published to PyPI.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Fpydantic_core\u002F\" target=\"_blank\" rel=\"noopener\">pydantic_core\u003C\u002Fa>: a widely used compiled dependency.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Fonnx\u002F\" target=\"_blank\" rel=\"noopener\">onnx\u003C\u002Fa>: a heavy-duty machine learning runtime component.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fpypi.org\u002Fproject\u002Ftypst\u002F\" target=\"_blank\" rel=\"noopener\">typst\u003C\u002Fa>: a toolchain project that benefits from compiled code.\u003C\u002Fli>\u003C\u002Ful>\u003Cp>For developers building browser-native Python apps, the implication is practical rather than theoretical. You can now imagine a future where a Pyodide app installs dependencies from the same index the rest of Python already uses, with less friction and fewer special cases.\u003C\u002Fp>\u003Ch2>Why this matters for browser Python\u003C\u002Fh2>\u003Cp>Pyodide has always had a strong pitch: real Python in the browser, backed by WebAssembly. The weak point was packaging. If a project needed a compiled extension, distribution often turned into a custom build problem instead of a normal release process.\u003C\u002Fp>\u003Cp>This update removes a lot of that friction. It also makes it easier for maintainers to ship experimental browser builds without asking the Pyodide team to carry the operational load.\u003C\u002Fp>\u003Cp>There is still work to do. More packages need to adopt the tag, build tooling needs to keep improving, and maintainers need a clear path from source tree to wheel. But the important part is already here: the registry now knows how to accept the artifact.\u003C\u002Fp>\u003Cp>For anyone building with \u003Ca href=\"https:\u002F\u002Fpyodide.org\u002Fen\u002Fstable\u002F\" target=\"_blank\" rel=\"noopener\">Pyodide\u003C\u002Fa>, the next useful question is simple: which dependencies can be published as WASM wheels this quarter, and which ones still need custom handling?\u003C\u002Fp>\u003Cp>If adoption keeps climbing from 28 packages to a few hundred, browser-based Python will start to feel much less like a special project and much more like ordinary Python with a different target.\u003C\u002Fp>","PyPI now accepts Pyodide-compatible WASM wheels, removing a major packaging bottleneck for browser-side Python.","simonwillison.net","https:\u002F\u002Fsimonwillison.net\u002F2026\u002FJun\u002F13\u002Fpublishing-wasm-wheels\u002F",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781875101557-vl79.png","tools","en","434cf6ed-e754-4dd7-be27-1aa0bc38761e",[17,18,19,20,21],"PyPI","Pyodide","WebAssembly","WASM wheels","Python packaging",[23,24,25],"PyPI now accepts WebAssembly wheels for Pyodide-compatible runtimes.","The old Pyodide packaging model required the core team to maintain over 300 packages.","Willison’s luau-wasm package shows the new flow works with standard PyPI publishing and GitHub Actions.",0,"2026-06-19T13:17:56.606272+00:00","2026-06-19T13:17:56.599+00:00","8360fa49-34e5-46c0-bde0-60d98cfa732c",{"tags":31,"relatedLang":34,"relatedPosts":38},[32],{"name":19,"slug":33},"webassembly",{"id":15,"slug":35,"title":36,"language":37},"pypi-wasm-wheels-pyodide-zh","PyPI 開始收 WASM wheel，Pyodide 包裝順多了","zh",[39,45,51,57,63,69],{"id":40,"slug":41,"title":42,"cover_image":43,"image_url":43,"created_at":44,"category":13},"092a4b65-c302-46ac-850c-3e022f3c8148","windsurf-model-router-ide-opinion-june-2026-en","Windsurf is becoming a model router, not just an IDE","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781871474029-4jzk.png","2026-06-19T12:17:22.773128+00:00",{"id":46,"slug":47,"title":48,"cover_image":49,"image_url":49,"created_at":50,"category":13},"f9ee1fee-7ac0-4072-a330-dbe682e03b84","renesas-acquires-altium-pcb-design-tool-update-en","瑞萨全资收购Altium，PCB设计工具更新","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781859772738-3319.png","2026-06-19T09:02:23.631252+00:00",{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":13},"c7baab44-71c8-4905-9a7d-a54a98e6cc45","rust-forum-week-25-turns-ideas-into-shipping-work-en","Rust forum week 25 turns ideas into shipping work","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781857111323-iib7.png","2026-06-19T08:18:05.668091+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":13},"014be76a-746c-4892-b144-90c05a0c61c6","claude-code-rust-native-terminal-interface-en","Claude Code Rust trims TUI overhead to one binary","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781854432173-8t6o.png","2026-06-19T07:33:30.328578+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":13},"ae4915a0-e313-438e-b724-e04e07331683","open-source-tools-vibe-coding-cybersecurity-en","Open source tools that make vibe coding safer","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781852617883-ajan.png","2026-06-19T07:03:09.073748+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":13},"95a3ce84-1732-4bce-a705-4957ca6f06af","model-triage-coding-tests-cost-win-en","Model triage turns coding tests into a cost win","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781840906662-fpo6.png","2026-06-19T03:47:52.260391+00:00",[76,81,86,91,96,101,106,111,116,121],{"id":77,"slug":78,"title":79,"created_at":80},"8008f1a9-7a00-4bad-88c9-3eedc9c6b4b1","surepath-ai-mcp-policy-controls-en","SurePath AI's New MCP Policy Controls Enhance AI Security","2026-03-26T01:26:52.222015+00:00",{"id":82,"slug":83,"title":84,"created_at":85},"27e39a8f-b65d-4f7b-a875-859e2b210156","mcp-standard-ai-tools-2026-en","MCP Standard in 2026: Integrating AI Tools","2026-03-26T01:27:43.127519+00:00",{"id":87,"slug":88,"title":89,"created_at":90},"165f9a19-c92d-46ba-b3f0-7125f662921d","rag-2026-transforming-enterprise-ai-en","How RAG in 2026 is Transforming Enterprise AI","2026-03-26T01:28:11.485236+00:00",{"id":92,"slug":93,"title":94,"created_at":95},"6a2a8e6e-b956-49d8-be12-cc47bdc132b2","mastering-ai-prompts-2026-guide-en","Mastering AI Prompts: A 2026 Guide for Developers","2026-03-26T01:29:07.835148+00:00",{"id":97,"slug":98,"title":99,"created_at":100},"3ab2c67e-4664-4c67-a013-687a2f605814","garry-tan-open-sources-claude-code-toolkit-en","Garry Tan Open-Sources a Claude Code Toolkit","2026-03-26T08:26:20.245934+00:00",{"id":102,"slug":103,"title":104,"created_at":105},"66a7cbf8-7e76-41d4-9bbf-eaca9761bf69","github-ai-projects-to-watch-in-2026-en","20 GitHub AI Projects to Watch in 2026","2026-03-26T08:28:09.752027+00:00",{"id":107,"slug":108,"title":109,"created_at":110},"9f332fda-eace-448a-a292-2283951eee71","practical-github-guide-learning-ml-2026-en","A Practical GitHub Guide to Learning ML in 2026","2026-03-27T01:16:50.125678+00:00",{"id":112,"slug":113,"title":114,"created_at":115},"1b1f637d-0f4d-42bd-974b-07b53829144d","aiml-2026-student-ai-ml-lab-repo-review-en","AIML-2026 Is a Bare-Bones Student Lab Repo","2026-03-27T01:21:51.661231+00:00",{"id":117,"slug":118,"title":119,"created_at":120},"6d1bf3f6-e191-4d30-b55b-8a0722fa6afe","ai-trending-github-repos-and-research-feeds-en","AI Trending Tracks Repos and Research Feeds","2026-03-27T01:31:35.709532+00:00",{"id":122,"slug":123,"title":124,"created_at":125},"010539a1-4c3a-4bd3-937a-26616422ee0d","awesome-ai-for-science-research-tools-map-en","Awesome AI for Science Is Becoming a Real Research Map","2026-03-27T01:46:50.89513+00:00"]