Skip to main content

peno

A JS sandbox for AI agents

peno = python + deno: a Python-embeddable JavaScript sandbox built on deno_core and V8.

Run untrusted, LLM-generated JavaScript safely in Python — real V8, real isolation, real tool-calling.


Publish PyPI License Docs

Documentation · Examples · Issues

16-18x faster repeat execution via context-isolated isolate pooling — ~3 ms cold Runtime() start vs. ~167-185 µs per pooled IsolatePool checkout+eval, measured with Criterion and pytest-benchmark, with a dedicated test proving no state leaks between checkouts. Proven, not claimed — see BENCHMARKS.md.

For tool-calling workloads, retain one Runtime per session instead: a warm Runtime does a full host tool call in ~13.4 µs — ~12x faster than a pool checkout, which cannot host tool calls at all. See docs/tool-calling-at-pool-speed.md.

What this is

Agent frameworks and tool-execution runtimes increasingly need to run JavaScript the model itself wrote — a code-generation step, a small data transform, a "call this JS snippet to compute the answer" tool. That code is untrusted by construction. peno embeds a real V8 isolate per runtime (via Rust/PyO3) so that code runs with no filesystem, no network, and no ambient Node.js APIs by default, with heap and wall-clock limits you set, and a real way to kill it if it doesn't stop on its own.

It is not a general "embed any JS anywhere" library and not a JS interpreter reimplemented in Python — it's V8, the same engine behind Chrome and Node.js, so the JS your model writes actually behaves like JS.

import peno

peno.bind_function("add", lambda a, b: a + b)
print(peno.eval("add(2, 3)"))  # 5

Why it's different

  • Real V8, not a toy interpreter. Every language quirk, every standard library method, every performance characteristic your model expects from "JavaScript" is the real thing.
  • Cross-thread termination that actually works. A watchdog thread calling .terminate() on a runaway while(true){} used to panic instead of stopping the code (pyo3_runtime.PanicException: Runtime is unsendable, but sent to another thread) — a real bug in the upstream design that meant a stuck agent tool call couldn't be killed from outside. TerminationHandle fixes this: it exposes only the Send + Sync part of V8's isolate handle, so a watchdog on a separate thread can interrupt execution safely. See PATCH.md for the full root cause and proof; tests/test_termination_handle.py is the regression test.
  • Context-isolated pooling, so speed doesn't cost you isolation. A cold V8 isolate costs ~3 ms to create; IsolatePool keeps a small set of them warm and hands out a brand-new, empty V8 Context on every checkout — the isolate is reused, but no JS-visible global state (globalThis, etc.) ever survives from one caller to the next, even when they land on the same underlying isolate. Measured: ~3 ms cold-start → ~170-185 µs pooled, ~16-18x, with a dedicated test proving a globalThis value set in one checkout is gone (typeof x === 'undefined') in the next. See BENCHMARKS.md and src/runtime/pool.rs for the numbers and the reasoning.
  • A host-callback bridge for tool-calling from JS. bind_function/ bind_object let the sandboxed JS call back into Python — the primitive an agent needs when the model's JS wants to invoke a real tool, not just compute a value. ToolBridge builds the product shape on top: hand it a dict of callables and get a call budget, fail-closed name checking, and JS-catchable typed errors, instead of hand-rolling all three.
  • Tool errors JS can branch on. A Python exception raised inside a bound tool reaches JavaScript as a real Error whose name is the exception's class name, so the model's JS can tell "bad arguments" from "rate limited" from "tool not found" with a plain catch (e) { if (e.name === ...) } — rather than string-matching one flattened TypeError. The same name/message shape a JS exception already carries into Python, so the two directions are symmetric.
  • console.log you can actually read. Sandboxed console.* output can be routed back to a Python callback with RuntimeConfig(on_console=...), receiving structured (level, args) — the single most common thing you want when showing a model what its own script printed. Composes with enable_console rather than replacing it.

Get Started

pip install peno  # or uv pip install peno

Requires Python 3.10+ on macOS or Linux. peno is experimental — expect breaking changes between versions.

Quickstart: sandboxed eval, tool-calling, and a timeout

import asyncio

from peno import Runtime, RuntimeConfig

# Cap memory; the runtime terminates itself if JS tries to exceed it.
config = RuntimeConfig(max_heap_size=10 * 1024 * 1024)  # 10 MB


async def main():
    with Runtime(config) as runtime:
        # The tool-calling primitive: expose a Python function to the sandboxed JS.
        def get_weather(city: str) -> str:
            return f"72F and sunny in {city}"

        runtime.bind_function("getWeather", get_weather)

        # Model-generated JS calling back into your tool.
        result = runtime.eval("getWeather('Zurich')")
        print(result)  # "72F and sunny in Zurich"

        # Enforce a wall-clock timeout on code that might not terminate.
        try:
            await runtime.eval_async("while (true) {}", timeout=2.0)
        except Exception as exc:
            print(f"killed a runaway eval after 2s: {exc}")


asyncio.run(main())

Running an untrusted sync eval() you can't await? Grab a TerminationHandle before the call and .terminate() it from a watchdog thread — see tests/test_termination_handle.py for the exact pattern (and the bug it fixed, in PATCH.md).

Many tools, one budget

When the model gets more than one tool, ToolBridge gives you the whole surface — budget, name checking, typed errors — in one object:

from peno import Runtime, ToolBridge

bridge = ToolBridge(
    {"get_weather": get_weather, "send_email": send_email},
    max_calls=50,  # total tool calls this agent turn may make
)

with Runtime() as runtime:
    bridge.attach(runtime)
    runtime.eval("tools.get_weather('Zurich')")

The call that exceeds max_calls never reaches your Python function — JS gets a catchable ToolBudgetError. Note ToolBridge needs a full Runtime: pooled isolates have no op registry to bind tools into, which is a permanent architectural boundary, not a todo — see the bindings guide for why.

For a fast path when you're running many short-lived, independent snippets (e.g. one per agent turn) and don't need bind_function/modules for that particular call, check out an isolate from a warm IsolatePool instead of paying full cold-start cost each time:

from peno import IsolatePool

pool = IsolatePool(size=4)
with pool.checkout() as isolate:
    print(isolate.eval("1 + 41"))  # 42

Integrations

  • FastMCP tool bridge - expose FastMCP tools to sandboxed JS via bind_function and an in-process fastmcp.Client
  • pydantic-ai "code mode" agent - an agent tool where the model submits one JS batch script instead of many separate tool calls, run safely with a timeout
  • ToolBridge - hand a sandbox several Python tools with a total call budget, typed errors the model's JS can branch on, and console.log routed back to Python
  • Vendored npm libraries - run real npm document-generation libraries (pptxgenjs, pdf-lib) from their browser bundles inside the sandbox; see the guide for what makes a library a good candidate
  • Arrow IPC dataframes - move 100k+ row tables into the sandbox as Arrow IPC bytes instead of JSON objects (5 ms vs 253 ms, and it works at the default 10 MB serialization limit that rejects the JSON payload); see the guide

Documentation

  • Quick Start
  • Concepts: runtimes, type conversion, resource controls
  • Guides: binding functions, module loading, snapshots
  • Use cases: AI agent sandboxes, workflow runners, plugin systems
  • API reference
  • Benchmarks — measured, reproducible numbers, including the pooling comparison above

Metadata

Release files for peno 0.1.0

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

Built distributions (wheels)

Table of built distributions (wheels) for peno 0.1.0
File Actions
peno-0.1.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl PyPy 3.11 PyPy 3.11 7.3 Linux glibc 2.28+ x86-64 Details for peno-0.1.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl
peno-0.1.0-cp314-cp314t-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ x86-64 Details for peno-0.1.0-cp314-cp314t-manylinux_2_28_x86_64.whl
peno-0.1.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details for peno-0.1.0-cp314-cp314-win_amd64.whl
peno-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64 Details for peno-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl
peno-0.1.0-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details for peno-0.1.0-cp314-cp314-macosx_11_0_arm64.whl
peno-0.1.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details for peno-0.1.0-cp313-cp313-win_amd64.whl
peno-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64 Details for peno-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl
peno-0.1.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details for peno-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
peno-0.1.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details for peno-0.1.0-cp312-cp312-win_amd64.whl
peno-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64 Details for peno-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl
peno-0.1.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details for peno-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
peno-0.1.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details for peno-0.1.0-cp311-cp311-win_amd64.whl
peno-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64 Details for peno-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl
peno-0.1.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details for peno-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
peno-0.1.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details for peno-0.1.0-cp310-cp310-win_amd64.whl
peno-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ x86-64 Details for peno-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl

Total release size: 327.8 MB

Release files / peno-0.1.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl

Download URL peno-0.1.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl
Size 21.9 MB
Tags Linux glibc 2.28+ x86-64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
a20141bf4393c2c8a5a1edfc2a6d088227d3789ee515ce859328ac61d68413b6
BLAKE2b-256 checksum
How to use checksums
4ca21ddf40963d76d1c01ea01f1128fefe76b9ab2bfa1399e06ef383b620a6f5
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp314-cp314t-manylinux_2_28_x86_64.whl

Download URL peno-0.1.0-cp314-cp314t-manylinux_2_28_x86_64.whl
Size 21.9 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
70a28554e3cc3b1f7b00225adb07cf5ed6813539fd561819df6a75ce538bb03a
BLAKE2b-256 checksum
How to use checksums
b1c91f44c20865dd116bcb763a8cfdfc77e145d67b24cf0c6ec79a6ce623ab93
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp314-cp314-win_amd64.whl

Download URL peno-0.1.0-cp314-cp314-win_amd64.whl
Size 19.0 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
5db26f3ce63ef0b37dd0f4df91ce561cb6bd1bbcb7faf6b5e7d62725f37a1e3d
BLAKE2b-256 checksum
How to use checksums
3558361a5bbc6bdb6919684408df387d7d63d8390b5b97babf7c9995dd922f68
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl

Download URL peno-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl
Size 21.9 MB
Tags CPython 3.14 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
02535d5095dac4d77e703a7cbc29432dae9a3520a212f0fecdc04c3de8a28c82
BLAKE2b-256 checksum
How to use checksums
7b1bcdb8b7fb4ad45e30c0652ca5738d5a86b00d72ffcc9bcbdbdb14b35bdf54
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp314-cp314-macosx_11_0_arm64.whl

Download URL peno-0.1.0-cp314-cp314-macosx_11_0_arm64.whl
Size 19.9 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
adb98aac495afc9af4cdf716e485c20f2a05b25ba8e6dfa48b2ac4ed35b278cc
BLAKE2b-256 checksum
How to use checksums
c8e6df45f2f5f47c7e482d3445abe011840f3d157c6774524937f82d24c6f7d4
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp313-cp313-win_amd64.whl

Download URL peno-0.1.0-cp313-cp313-win_amd64.whl
Size 19.0 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
8e4cbf8ac3922d427cc239e4494e6b48e859ff64c3c2fd8ebfd1b84c99f8b21b
BLAKE2b-256 checksum
How to use checksums
52d2ecefe6b9e32d6ed262c915dd4da27d889423ac05512ed2d55a9c63a2cf37
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl

Download URL peno-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl
Size 21.9 MB
Tags CPython 3.13 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
d566f43c87d89758ccb9922ef8356c85ad240cf3dadfe3b54534adac60f10d61
BLAKE2b-256 checksum
How to use checksums
e9aea4a8900af3dfe2cd8429288d896e0fe7eb3eabde69195dd4f495bb0aab7b
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL peno-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
Size 19.9 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9edca63343e529c7e84e918a3a1781c31dbdee6e9f3ef5f453dcaaf3ede2d7d9
BLAKE2b-256 checksum
How to use checksums
c92710032d902ea756cbce5efce404057e35f15f8f069ba58a1b4e4b2c8de44c
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp312-cp312-win_amd64.whl

Download URL peno-0.1.0-cp312-cp312-win_amd64.whl
Size 19.0 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
4661da26580b650c54f4a4c2216dcd9827c2bbb00e3843c2573c370063ea5e5d
BLAKE2b-256 checksum
How to use checksums
a6e0ded84efb1a49806876d7b12425f9732fe9eab3e70f3777823d1fcd19e162
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl

Download URL peno-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl
Size 21.9 MB
Tags CPython 3.12 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
4629ce96a6b0af7a67e19d078e7680c52badd716547a59d25a6acc41a489b7a8
BLAKE2b-256 checksum
How to use checksums
575336d1d51552225d0b282f3379d09feb093d6b8aeb062b16978939d598bf25
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL peno-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
Size 19.9 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b8495837aa7b5cbe98926d7723ab244d6552dd102fa5052630c7e7b44aefcebb
BLAKE2b-256 checksum
How to use checksums
9503936b40a5cfec0463df8d7ddccded1bc45f4588ea473edb85f16e2953ed9d
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp311-cp311-win_amd64.whl

Download URL peno-0.1.0-cp311-cp311-win_amd64.whl
Size 19.0 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
54eed0d04105f6e5001bed2a25729d14089d238514b84df5f16e1cead3143b7d
BLAKE2b-256 checksum
How to use checksums
09f94f895da91009cfaaedee8030ad235248b4a69f76da8e845d48ac4b65bc0d
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl

Download URL peno-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl
Size 21.9 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
fdf672d35c68242831ae3421df52f37b086138ed0cc85dd01f0d183a8a68ca4f
BLAKE2b-256 checksum
How to use checksums
24eebbcadd97f9551bbe376a34bd497ec7ec465884ab84f556713664048217a5
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL peno-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
Size 19.9 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1a561c667d05d228fd43ed70e56ee16a03c55a90295f64cde58c7aa8d1f946d2
BLAKE2b-256 checksum
How to use checksums
5aa6ff493be1585651970ea185c147fee46a04e46e42f589b378f81093f4b352
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp310-cp310-win_amd64.whl

Download URL peno-0.1.0-cp310-cp310-win_amd64.whl
Size 19.0 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
04596933dbd0cccfa56081194317e16522aef472f644d52a95b0133dacd44550
BLAKE2b-256 checksum
How to use checksums
c7a3faa9d77a7aa63a5cb9a5a0bf3b059849618ad3ad5375e5d7787253d25552
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 Sep 21, 2026.

Transparency log

Release files / peno-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl

Download URL peno-0.1.0-cp310-cp310-manylinux_2_28_x86_64.whl
Size 21.9 MB
Tags CPython 3.10 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
0d99aa2a56b0f5e1ff063f016816f9a46d17f8257f0e9ae36ffefca2753af9b5
BLAKE2b-256 checksum
How to use checksums
7f3d83973dba507f14bcabdb1ed8803a3751ad2d069e96d6e0d493b60aae0ea9
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 Sep 21, 2026.

Transparency log

Security for peno 0.1.0

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.

Full provenance

All 16 files in this release have been uploaded with provenance metadata.

Select from 16 files

Attestation for peno-0.1.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl

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 Sep 21, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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