Releases: pyscript/pyscript
Releases · pyscript/pyscript
2026.2.1
- Removed warnings about
windowanddocumentwhensync_main_onlyconfig property istrue: #2434 - Improved errors on bootstrap when the config cannot be parsed or contains errors: #2435
- Updated Pyodide to its 0.29.3 version: https://pyodide.org/en/stable/project/changelog.html
- Improved packages resolution by ignoring case-sensitive names: pyscript/polyscript#168
- Removed the legacy, archived, toml-j0.4 parser #2442 in favor of our own improved basic-toml parser pyscript/polyscript#171
- Improved
pyscript.webAPI whereel.append("string")will now work as expected: #2447 Thanks to new contributor @iliketocode2. - Docstring fixes so Markdown API docs render properly: #2449
- Ensure the
removemethod for CSS classes is more forgiving (it logs a warning rather than throws an exception if the class to be removed does not exist): #2450 - Documentation updates given feedback by users: pyscript/docs#209 pyscript/docs#210 (thanks for the suggestion @clayote).
2026.1.1
- 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_jsrenamed tocontext(but everything should still only be referenced via the corepyscriptnamespace).- A much requested change in
pyscript.web: usepage["#an-id"]to get a single element by id (rather thanpage.find("#an-id")[0]). - In
pyscript.weban Element's styles are a Pythondictand classes a Pythonset(rather than custom objects with a similar API to those Python classes). - Explicitly use
update_allwithElementCollectioninstances. 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
- Include a new
unstuckfeature for dealing with web workers stuck in an unresponsive loop (see the docs for more information). - A new
offline.zipfile 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
- 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
After a Chromium update we have noticed our pyscript.fs broke so that:
- a bug has been filed to inform Chromium about the regression or breaking change: https://issues.chromium.org/issues/454531070
- investigation occurred and code has been updated to use the pattern that doesn't throw cryptic errors anymore
- extensive tests both on Pyodide and MicroPython, main thread and workers, has been manually done to be sure all expectations are met
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
2025.10.1
- Added a transform ability from main to worker, not just worker to main: pyscript/polyscript#148
- Added
experimental_remote_packagesconfig 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/bridgeto bring in automatically PyScript if not already on the page: #2379 - Fixed PyEditor issue on Ctrl+Enter (now working): #2385
- Improved
pyscript.webafter 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.signaturefor callables / generators / others
- Update Pyodide to version 0.29.0:
py-game-ceis back!- Default conversion of
to_jsas JS object literal, not map - Fixed a Wasm GC reference leak on invokes
- New features / enhancements here: https://pyodide.org/en/stable/project/changelog.html#version-0-29-0
2025.8.1
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.
- All fetch operations now produce readable error messages when these happen: pyscript/polyscript#146
- PyScript's package caching mechanism is now based on latest Pyodide
lockFileContents: pyscript/polyscript#144 - Update MicroPython to its
preview-386version: pyscript/polyscript#143 - Update Pyodide to its
0.28.1version: https://pyodide.org/en/stable/project/changelog.html#version-0-28-1 and addedpyscript.ffi.is_none(renference)to ease-out thenullVSNonedistinction. - Add an explicit
pyscript.fs.remove(path)option to both unmount that path and erase its content from the database: #2368 - Change
pyscript.WebSocketsdefault toarrayBufferto retrieve directly memory views: #2366 - Still on WebSockets, asynchronous listeners are now supported: #2366
- PyWorker args are now more user friendly: #2366
The most relevant Pyodide changes (more Pyodide context here):
- There is a new
pyodide.ffi.jsnullreference which is the default type for JavaScrptnull: goodbyenulltoNoneimplicit conversion, we are providing apyscript.ffi.is_none(reference)to ease-out this distinction that works regardless of the runtime. - If
jsobjis a JavaScript proxy for a Pythondictthenjsobj[name]andjsobj.namenow works seamlessly, allowing a JS object representing a Pythondictto be used in way more scenarios than before. For more information, see the Pyodide docs.
2025.7.3
Release notes
- This release is exclusively worker related:
ImageDatanow travels directly from main to workers to allow.datamanipulation and relatedcontext.putImageData(ref)operations: WebReflection/reflected-ffi#8- a non breaking error about
Promiseunable 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
envand/or asetupnode, the logic now stops properly all scripts if one of their execution gets somehow stuck, bootstrapping againsetupnodes when present to fully reset the environment and start keeping latest typed code: #2361 - MicroPython workaround for
Symbolproperties accessed directly via thegettrap when common JS operations are performed on Python proxied objects: see bug micropython/micropython#17657
2025.7.2
Release Notes
- Updated to MicroPython version 1.26.0-preview-293, fixing a regression/bug in release 2027.7.1 (see: MicroPython #17604)