Skip to content

Releases: pyscript/pyscript

2026.3.1

02 Mar 14:14
98011af

Choose a tag to compare

  • Update to the latest MicroPython (#2454 and pyscript/polyscript#172):
    • weakref support
    • Template strings
    • Complete asyncio.Future support.
    • 4 variants of the wasm build: micropython.wasm (standard), micropython-settrace.wasm (for debugging), micropython-ulab.wasm (ulab = numpy-like API) and micropython-settrace-ulab.wasm (everything).
  • Minor consistency fix in pyscript.web API (#2455 - thanks @iliketocode2)

2026.2.1

05 Feb 12:58
d6f401a

Choose a tag to compare

2026.1.1

20 Jan 12:00
c3d4998

Choose a tag to compare

  • Minor fixes in coincident.
  • Removed WebR (for the time being) and improved packages details in polyscript.
  • Updated polyscript module to include latest coincident and latest Pyodide 0.29.1.
  • INCLUDES BREAKING CHANGES API/docstring refactor #2414
    • magic_js renamed to context (but everything should still only be referenced via the core pyscript namespace).
    • A much requested change in pyscript.web: use page["#an-id"] to get a single element by id (rather than page.find("#an-id")[0]).
    • In pyscript.web an Element's styles are a Python dict and classes a Python set (rather than custom objects with a similar API to those Python classes).
    • Explicitly use update_all with ElementCollection instances. You used to be able to do implicit changes via: my_collection.innerHTML = "foo". Feedback was this felt risky (folks thought they were mutating an element, not an element collection and they were getting strange results). Now you just: my_collection.update_all(innerHTML="foo") which also makes it more obvious what's going on.
    • Extensive rewrite of docstrings with examples. These form the basis of our new API docs.
    • Added many more tests for the purpose of coverage and testing edge-cases.

2025.11.2

25 Nov 11:32
4a801fa

Choose a tag to compare

  • Include a new unstuck feature for dealing with web workers stuck in an unresponsive loop (see the docs for more information).
  • A new offline.zip file is added to each release. This is an archive of an offline-first version of PyScript.

Full Changelog: 2025.11.1...2025.11.2

2025.11.1

10 Nov 10:25
d8250f2

Choose a tag to compare

  • PyScript does not throw errors anymore if a package is not available in the official Pyodide packages "graph". See this PR for more details.
  • PyScript allows passing File and Blob instances to any worker from the main thread, through worker related Python code. See this change for the underlying technical details.

Full Changelog: 2025.10.3...2025.11.1

2025.10.3

23 Oct 14:28
a8684a2

Choose a tag to compare

After a Chromium update we have noticed our pyscript.fs broke so that:

From users' perspective, the modal about granting access might happen twice now:

  • the first time lasts the whole session or until you close your browser
  • the next time you get a chance to allow that access always, as opposite of once
  • if you accept always that dialog will never bother you again unless you clear the whole browser cache

More details in #2395.

2025.10.2

23 Oct 09:09
8cd9c4c

Choose a tag to compare

  • Fixed remote packages issue found after real-world use case example. See: #2393

2025.10.1

21 Oct 13:29
66966a7

Choose a tag to compare

  • Added a transform ability from main to worker, not just worker to main: pyscript/polyscript#148
  • Added experimental_remote_packages config flag for remote packages: pyscript/polyscript@f086129
  • Augmented Pyodide bootstrap with pre-fetched packages details to improve feedback on incompatible packages when bootstrapping PyScript: pyscript/polyscript@c879c6e
  • Simplified the @pyscript/bridge to bring in automatically PyScript if not already on the page: #2379
  • Fixed PyEditor issue on Ctrl+Enter (now working): #2385
  • Improved pyscript.web after MicroPython updates: #2387
  • We now allow you to define a custom TOML parser for more complex configs: #2390
  • First steps (of a work in progress) to validate Pyodide package availability and metadata: #2392
  • Updated MicroPython to version 1.27.0-preview-283:
    • Fixed proxies references
    • Improved interoperability with JS
    • Added inspect.signature for callables / generators / others
  • Update Pyodide to version 0.29.0:

2025.8.1

07 Aug 08:00
67fa31e

Choose a tag to compare

IMPORTANT - this release of PyScript uses a new version of Pyodide that has different behaviour relating to the handling of null / None. THIS MAY BREAK YOUR CODE. Read the notes (especially regarding the pyscript.ffi.is_none feature), to understand how PyScript supports you in this transition.

The most relevant Pyodide changes (more Pyodide context here):

  • There is a new pyodide.ffi.jsnull reference which is the default type for JavaScrpt null: goodbye null to None implicit conversion, we are providing a pyscript.ffi.is_none(reference) to ease-out this distinction that works regardless of the runtime.
  • If jsobj is a JavaScript proxy for a Python dict then jsobj[name] and jsobj.name now works seamlessly, allowing a JS object representing a Python dict to be used in way more scenarios than before. For more information, see the Pyodide docs.

2025.7.3

11 Jul 12:56
eaa6711

Choose a tag to compare

Release notes

  • This release is exclusively worker related:
    • ImageData now travels directly from main to workers to allow .data manipulation and related context.putImageData(ref) operations: WebReflection/reflected-ffi#8
    • a non breaking error about Promise unable to travel, due structured clone algorhitm incompatibility, happening when asynchronous handlers are attached to main references, has been fixed: WebReflection/reflected-ffi@663a3e5
    • when PyEditor or MpyEditor have multiple related env and/or a setup node, the logic now stops properly all scripts if one of their execution gets somehow stuck, bootstrapping again setup nodes when present to fully reset the environment and start keeping latest typed code: #2361
    • MicroPython workaround for Symbol properties accessed directly via the get trap when common JS operations are performed on Python proxied objects: see bug micropython/micropython#17657