We are pleased to announce the Pyodide v0.29.0 release. This is a small feature release.
toJs() and to_js() now convert dictionaries to Object instead of Map by default
After much feedback from users, we changed toJs() and to_js() to convert
dictionaries to Object by default. To opt into the old behavior, you can pass
toJsLiteralMap: true to loadPyodide(). This will be removed in a future
release.
This was the main change motivating the feature release.
Better ecosystem support for building Pyodide wheels via pypa/cibuildwheel
In previous release cycles, we integrated Pyodide wheel build support into the
cibuildwheel project. We have now joined the efforts of the project as platform
maintainers. This initiative will help ensure that the Pyodide wheel build
procedure is consistent, maintained, and aligned with the broader Python packaging
ecosystem, especially with the work-in-progress PEPs on defining a concrete ABI
for Pyodide wheels and allowing them to be published on PyPI.
Open Source Contribution Academy Partnership
From July to October 2025, Pyodide participated in the Open Source Contribution Academy. This program, funded by the South Korean government, selects and supports individuals interested in contributing to open source project such as Pyodide.
Pyodide selected over 15 participants for the program. These contributors made significant advancements to Pyodide in various areas, including bug fixes, documentation enhancements, and new features.
Here are a few notable contributions from the participants:
Introducing the New pyxhr Module
We’ve added a new module, pyodide.http.pyxhr, which provides a synchronous
HTTP client built on XMLHttpRequest. This is specifically designed for browser
environments where traditional synchronous HTTP libraries are unavailable.
Previously, Pyodide offered pyodide.http.pyfetch for asynchronous requests
using the browser’s native Fetch API. However, integrating an asynchronous API
into existing synchronous code patterns was often complicated.
The new pyxhr module solves this by offering a synchronous client with a
requests-like API for making straightforward HTTP requests.
A word of caution: Making synchronous HTTP requests on the main thread will
block the UI thread. So please use pyxhr in a cautious manner. It is most
useful for simple requests that don’t require the complexity of asynchronous
programming.
Example Usage:
from pyodide.http import pyxhr
response = pyxhr.get("[https://api.example.com/data](https://api.example.com/data)")
data = response.json()
- Contributor: @viva2b
Event Loop Compatibility Improvements
Pyodide uses a custom event loop based on the browser’s event loop. It
previously only partially supported CPython’s BaseEventLoop interface, which
led to issues when using asyncio. For example, standard APIs like set_debug
and shutdown_asyncgens were not implemented and raised NotImplementedError,
which was unexpected for users.
We have significantly improved compatibility with the standard event loop APIs during this period. The methods mentioned above are now properly implemented. Additionally, other APIs that remain unsupported now provide a more meaningful and helpful error message to users.
- Contributor: @leehanjeong
Standardized Typing for Emscripten Types
Pyodide is built on Emscripten, and some of its public APIs expose Emscripten-specific types and objects. Previously, the type definitions for these objects were managed within Pyodide’s own type system, leading to inconsistencies with Emscripten’s official typing (see issue #5546). This caused challenges for developers trying to use these objects.
To resolve this, we have adopted and standardized Emscripten types based on definitions from DefinitelyTyped. We also contributed extensively to DefinitelyTyped to enhance the quality of these Emscripten type definitions. This work ensures a consistent type system for other projects using Pyodide or Emscripten types.
- Contributor: @R3gardless
SIMD Support Exploration
We’ve begun exploring the integration of SIMD (Single Instruction, Multiple Data) operations in Pyodide, leveraging the WebAssembly SIMD feature. Currently, we have only tested SIMD operations with basic test packages. Our goal is to enable SIMD support in key numerical computing packages like numpy and scipy in the near future, which should lead to significant performance gains.
- Contributor: @teddygood
New Xterm.js-Based Pyodide Console
The Pyodide Web Console, which provides a web REPL example in our documentation, previously relied on the jQuery Terminal library. While effective for a long time, we recently received reports that jQuery Terminal was causing issues on some mobile browsers.
To address this, we have implemented a new Pyodide Web Console using the Xterm.js library for the terminal emulator. This new console provides a better, more consistent terminal experience on mobile browsers.
You can currently try the new console here.
- Contributor: @snghnl
Acknowledgements
Thanks to all the contributors who made this release possible:
Andrej, Agriya Khetarpal, BOMIN LYU, Catherine, Chanho Lee, Daehee Kim, Dahye Park, Gyeongjae Choi, Hanjeong Lee, HanJeong Lee, Hood Chatham, hyoinandout, Jaehyun Kim, Jeong, YunWon, kaif ansari, Marco Edward Gorelli, Minseo Kim, Mu-Tsun Tsai, Seungheon Lee, Shaurya Bisht, SongYoungUk, Yunjeong Jang