Show HN: jsrun – Isolated JavaScript Runtime in Python via Embedded V8

2 hours ago 1
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
  • 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, isolated V8 isolates per thread, and configurable heap/time limits
  • Module & WASM support – load ES modules with custom resolvers and execute WebAssembly directly

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 under development. Expect breaking changes between minor 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 config = RuntimeConfig(max_heap_size=10 * 1024 * 1024) # 10MB limit with Runtime(config) as runtime: print(runtime.eval("42")) # 42

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

Read Entire Article