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()

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.

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.

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.

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.

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