Skip to main content
jsrun

jsrun

Modern JavaScript runtime in Python

Seamlessly run JavaScript next to Python with secure isolation, powered by V8 and bridged with Rust


CI PyPI License

Documentation · Examples · Issues

jsrun is a Python library that embeds the V8 JavaScript engine with Rust (PyO3). Run trusted or user-provided JavaScript alongside Python, bind Python objects into JavaScript in an isolated environment:

import jsrun

result = jsrun.eval("2 + 2")
print(result)  # 4

# Bind Python function
jsrun.bind_function("add", lambda a, b: a + b)
print(jsrun.eval("add(2, 3)"))  # 5

Highlights

  • Fast V8 core – the JavaScript engine used by Chrome and Node.js, bridged via Rust and PyO3
  • Async-first APIs – run async JavaScript without blocking Python code
  • Extensible bindings – expose Python functions/objects to JavaScript
  • Secure defaults – runtimes start with zero I/O, separate V8 isolates per thread, and configurable heap/time limits
  • Module & WASM support – load ES modules with custom resolvers and execute WebAssembly directly

Get Started

To get started, install it from PyPI (Python 3.10+ and macOS/Linux are required):

pip install jsrun  # or uv pip install jsrun

Note: jsrun is experimental. Expect breaking changes between versions.

Quick Example

import jsrun

# Simple expression
print(jsrun.eval("Math.sqrt(25)"))  # 5

# Share Python function with JavaScript
jsrun.bind_function("add", lambda a, b: a + b)
print(jsrun.eval("add(3, 4)"))  # 7

Need full control? Use the Runtime class to configure heap/time limits, module loaders, and lifecycle management.

from jsrun import Runtime, RuntimeConfig

config = RuntimeConfig(max_heap_size=10 * 1024 * 1024)  # 10MB limit

with Runtime(config) as runtime:
    print(runtime.eval("42"))  # 42

Use Cases

jsrun is designed for modern Python applications that need embedded JavaScript:

Example: Code execution sandbox for AI Agent

One of the most compelling use cases for jsrun is building safe execution environments for AI agents. When LLMs generate code, you need a way to run it securely with strict resource limits and isolation.

This example shows how to create a Pydantic AI agent that can execute JavaScript code in a sandboxed V8 runtime with heap limits and timeouts:

import asyncio

from jsrun import JavaScriptError, Runtime, RuntimeConfig
from pydantic_ai import Agent, RunContext

# Define the agent with code execution tool
agent = Agent(
    "openai:gpt-5-mini",
    system_prompt="""You are a helpful assistant that can execute JavaScript code.
    When users ask you to perform calculations or data transformations,
    you can write and execute JavaScript code to get accurate results.
    Always explain what the code does before showing the result.""",
)


@agent.tool
async def execute_javascript(ctx: RunContext, code: str) -> str:
    """
    Execute JavaScript code in a sandboxed environment.

    Args:
        code: The JavaScript code to execute

    Returns:
        The result of the code execution as a string
    """
    # Log or audit the code being executed (for observability)
    print(f"[Executing JavaScript code] '{code}'")

    try:
        # Create a runtime with 10MB heap limit
        config = RuntimeConfig(max_heap_size=10 * 1024 * 1024)

        with Runtime(config) as runtime:
            result = await runtime.eval_async(code, timeout=5.0)
            print(f"[Execution result] {result}")
            return f"Result: {result}"
    except TimeoutError:
        return "Error: Code execution timed out (exceeded 5 seconds)"
    except JavaScriptError as e:
        return f"JavaScript Error: {e}"
    except Exception as e:
        return f"Execution Error: {e}"


async def main():
    result = await agent.run("Calculate the sum of squares from 1 to 100")
    print(f"AGENT OUTPUT: {result.output}")


if __name__ == "__main__":
    asyncio.run(main())

Example: Using JavaScript libraries in Python

You can load supported JavaScript libraries directly from CDNs and use them in Python without Node.js:

import requests, jsrun

response = requests.get("https://unpkg.com/lodash@4/lodash.min.js")
jsrun.eval(response.text)

# Use lodash functions
result = jsrun.eval("_.chunk(['a', 'b', 'c', 'd'], 2)")
print(result)  # [['a', 'b'], ['c', 'd']]

# Bind Python data to JavaScript
jsrun.bind_object("numbers", {"data": [1, 5, 10, 15, 20, 25]})

result = jsrun.eval("_.filter(numbers.data, n => n >= 10)")
print(result)  # [10, 15, 20, 25]

Explore more in Use Cases and Examples

Documentation

Metadata

Release files for jsrun 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jsrun 0.2.0
File Size Uploaded
jsrun-0.2.0.tar.gz 286.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for jsrun 0.2.0
File Interpreter ABI Platform
jsrun-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl CPython 3.10 abi3 Linux glibc 2.28+ x86-64 Details
jsrun-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl CPython 3.10 abi3 Linux glibc 2.28+ ARM64 Details
jsrun-0.2.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details

Total release size: 65.4 MB

Release files / jsrun-0.2.0.tar.gz

Download URL jsrun-0.2.0.tar.gz
Size 286.8 kB
Tags Source
SHA-256 checksum
How to use checksums
3ac20c5de400d06a27f6a288cc6e00e126728986a2c2238b715e8ba14de5500f
BLAKE2b-256 checksum
How to use checksums
4659e979bdc1b8e2da8ee62e1dfb0f8d2ce0aa4fd2a930ef9a710c431ae099bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.

Transparency log

Release files / jsrun-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl

Download URL jsrun-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl
Size 21.9 MB
Tags CPython 3.10 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
32ee1136535beb548df27eafe660f7c76b3ab803b67ca6d5f7768dca360b69f8
BLAKE2b-256 checksum
How to use checksums
df45060af6fc9b7517b633ce2424fddc9078e10b78d32803c53aaf08f4f551a3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.

Transparency log

Release files / jsrun-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl

Download URL jsrun-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl
Size 23.4 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
c40094ccc055f1cdd4a8500968c904fb2f898944b19b8efc3dcfb1504c791cc3
BLAKE2b-256 checksum
How to use checksums
d647d8e9d56ab6e6b291741cc91881f6583c8865352096bb92c12933fdd45e2f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.

Transparency log

Release files / jsrun-0.2.0-cp310-abi3-macosx_11_0_arm64.whl

Download URL jsrun-0.2.0-cp310-abi3-macosx_11_0_arm64.whl
Size 19.8 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
3428f3deece9fd793070245e608fc9949de758d01bb4e66be300806ef3edee74
BLAKE2b-256 checksum
How to use checksums
96270ad0afe02a588e6dc79a2b36f8fac5be6b3f0621d4579eb1c8393ee1e20e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.

Transparency log

Release history Release notifications | RSS feed

0.3.0

6 release files

This release

0.2.0 This release

4 release files

0.1.0

18 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page