NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3445 most downloaded on PyPI
Minimal, modern embedded V8 for Python.
Last release 8 months ago
01 Feb 2026
Ships unpredictably
gaps range from 9 days to 1.5 years
Nearly every release is documented
notes for 17 of 17 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
17 releases · first in 2024
Fix memory leak when tracking JS objects in Python. We were never calling v8::Persistent::Reset(). Now we use v8::Global which has no such requirement
Major revamp of Python-side async handling: PyMiniRacer now manages most asynchronous work (in particular, _cancelable_ work) through an asyncio event
PyMiniRacer now manages most
asynchronous work (in particular, cancelable work) through an asyncio event loop.
This is intended to make PyMiniRacer easier to reason about, removing opportunities
for deadlocks and race conditions.asyncio task cancellation semantics.mini_racer to more explicitly create and tear down MiniRacer instances.One column per month.
Improve performance of function calls by exposing Array.prototype.push (avoiding two round trips to get array size and then slice it, for function cal
Fix MacOS wheels to not require MacOS 15.
Alpine support is now reduced to using gcompat and LD_PRELOAD="/lib/libgcompat.so.0".
gcompat and
LD_PRELOAD="/lib/libgcompat.so.0".- Upgrade to V8 12.6 from 12.4.
See https://bpcreech.com/PyMiniRacer/history/#0123-2024-05-25
wrap_py_function while
we're tearing it down.See https://bpcreech.com/PyMiniRacer/history/#0122-2024-05-20
Add optional context manager and .close() semantics to Python MiniRacer class.
Fixed a potential hang on MiniRacer teardown if MiniRacer is executing a microtask which loops infinitely.
Switch C++ side of MiniRacer to a more straightforward object lifecycle management model.
Switch from tags to branches for releases
Switch from tags to branches for releases
Refactored the Python implementation into many internal files. This should mostly not present a breaking change, except for code which reaches into in…
Added support for installing callbacks from JS back into Python, using MiniRacer.wrap_py_function.
Refactored the Python implementation into many internal files. This should mostly not
present a breaking change, except for code which reaches into internal (_-prefixed)
variables.
Fixed Python crash on long-running microtasks, introduced in v0.8.1 (before which long-running microtasks would probably not run at all).
Fixed Python crash on long-running microtasks, introduced in v0.8.1 (before which long-running microtasks would probably not run at all).
Fixed memory leak on the exception object reported when an eval times out.
Hardened the memory management of JS value interchange, context tracking, and asynchronous task tracking between C++ and Python.
Added exhaustive typing (now with a MyPy pre-commit to verify!)
Added a test asserting that the v8 sandbox is enabled on all platforms we build wheels for.
_Unfortunately, this may present a breaking change for users who assume JavaScript undefined is modeled as Python None._
Added a MutableMapping (dict-like) interface for all derivatives of JS Objects,
and a MutableSequence (list-like) interface for JS Arrays. You can now use
Pythonic idioms to read and write Object properties and Array elements in Python,
including recursively (i.e., you can read Objects embedded in other objects, and embed
your own).
Added ability to directly call JSFunction objects from Python. E.g.,
mr.eval("a => a*a")(4) parses the given number-squaring code into a function,
returns a handle to that function to Python, calls it with the number 4, and
recieves the result of 16.
Added a JSUndefined Python object to model JavaScript undefined. This is needed to
properly implement the above interface for reading Object and Array elements.
Unfortunately, this may present a breaking change for users who assume JavaScript
undefined is modeled as Python None.
Removed an old optimization for eval on simple no-argument function calls (i.e.,
myfunc()). The optimization only delivered about a 17% speedup on no-op calls (and
helped relatively less on calls which actually did work), and for the purpose of
optimizing repeated calls to the same function, it's now redundant with extracting and
calling the function from Python, e.g., mr.eval("myfunc")().
Hardening (meaning "fixing potential but not-yet-seen bugs") related to freeing
Value instances (which convey data from C++ to Python).
More hardening related to race conditions on teardown of the MiniRacer object in the
unlikely condition that eval operations are still executing on the C++ side, and
abandoned on the Python side, when Python attempts to garbage collect the MiniRacer
object.
Updated to V8 12.3 from V8 12.2 now that Chromium stable is on 12.3.
Updated to V8 12.3 from V8 12.2 now that Chromium stable is on 12.3.
Added Python-side support for JS Promises. You can now return a JS Promise from code
executed by MiniRacer.eval, and PyMiniRacer will convert it to a Python object which
has a blocking promise.get() method, and also supports await promise in async
Python functions.
Added a setTimeout and clearTimeout. These common functions live in the Web API
standard, not the ECMAScript standard, and thus don't come with V8, but they're so
ubiquitious we now ship an implemention with PyMiniRacer.
…standard library). In the future we may emit deprecation warnings for use of timeout.
Revamped JS execution model to be out-of-thread. Python/C++ interaction now happens via callbacks.
Consequently, Control+C (KeyboardInterrupt) now interrupts JS execution.
Hardened C++-side thread safety model, resolving potential race conditions introduced in v0.8.1 (but not actually reported as happening anywhere).
Further improved JS exception reporting; exception reports now show the offending code where possible.
Introduced timeout_sec parameter to eval, call, and execute to replace the
timeout, which unfortunately uses milliseconds (unlike the Python standard library).
In the future we may emit deprecation warnings for use of timeout.
A series of C++ changes which should not impact the behavior of PyMiniRacer:
General overhaul of C++ implementation to better adhere to modern best practice. This should have no visible impact except for the following notes...
eval-specific)
limit, since that's how it worked all along anyway. The max_memory eval argument
still works for backwards compatibility purposes.str instead of bytes (they should all
be str now).Revamp DLL loading to be compliant with Python 3.9-style resource loading. This may present a small breaking change for advanced usage; the EXTENSION_…
EXTENSION_PATH and
EXTENSION_NAME module variables, and MiniRacer.v8_flags and MiniRacer.ext class
variable have all been removed.Intl APIYour coding agent can read these notes before it upgrades. Set up the MCP server →