Skip to main content

A minimal, secure TypeScript interpreter for AI agents — Python bindings

Project description

Zapcode

Zapcode

Run AI-generated code. Safely. Instantly.

A minimal, secure TypeScript interpreter written in Rust for use by AI agents

CI crates.io npm PyPI License


Experimental — Zapcode is under active development. APIs may change.

Why agents should write code

AI agents are more capable when they write code instead of chaining tool calls. Code gives agents loops, conditionals, variables, and composition — things that tool chains simulate poorly.

But running AI-generated code is dangerous and slow.

Docker adds 200-500ms of cold-start latency and requires a container runtime. V8 isolates bring ~20MB of binary and millisecond startup. Neither supports snapshotting execution mid-function.

Zapcode takes a different approach: a purpose-built TypeScript interpreter that starts in 2 microseconds, enforces a security sandbox at the language level, and can snapshot execution state to bytes for later resumption — all in a single, embeddable library with zero dependencies on Node.js or V8.

Inspired by Monty, Pydantic's Python subset interpreter that takes the same approach for Python.

Alternatives

Language completeness Security Startup Snapshots Setup
Zapcode TypeScript subset Language-level sandbox ~2 µs Built-in, < 2 KB npm install / pip install
Docker + Node.js Full Node.js Container isolation ~200-500 ms No Container runtime
V8 Isolates Full JS/TS Isolate boundary ~5-50 ms No V8 (~20 MB)
Deno Deploy Full TS Isolate + permissions ~10-50 ms No Cloud service
QuickJS Full ES2023 Process isolation ~1-5 ms No C library
WASI/Wasmer Depends on guest Wasm sandbox ~1-10 ms Possible Wasm runtime

Why not Docker?

Docker provides strong isolation but adds hundreds of milliseconds of cold-start latency, requires a container runtime, and doesn't support snapshotting execution state mid-function. For AI agent loops that execute thousands of small code snippets, the overhead dominates.

Why not V8?

V8 is the gold standard for JavaScript execution. But it brings ~20 MB of binary size, millisecond startup times, and a vast API surface that must be carefully restricted for sandboxing. If you need full ECMAScript compliance, use V8. If you need microsecond startup, byte-sized snapshots, and a security model where "blocked by default" is the foundation rather than an afterthought, use Zapcode.

Benchmarks

All benchmarks run the full pipeline: parse → compile → execute. No caching, no warm-up.

Benchmark Zapcode Docker + Node.js V8 Isolate
Simple expression (1 + 2 * 3) 2.1 µs ~200-500 ms ~5-50 ms
Variable arithmetic 2.8 µs
String concatenation 2.6 µs
Template literal 2.9 µs
Array creation 2.4 µs
Object creation 5.2 µs
Function call 4.6 µs
Promise.resolve + await 3.1 µs
Promise.then (single) 5.6 µs
Promise.then chain (×3) 9.9 µs
Promise.all (3 promises) 7.4 µs
Async .map() (3 elements) 11.6 µs
Loop (100 iterations) 77.8 µs
Fibonacci (n=10, 177 calls) 138.4 µs
Snapshot size (typical agent) < 2 KB N/A N/A
Memory per execution ~10 KB ~50+ MB ~20+ MB
Cold start ~2 µs ~200-500 ms ~5-50 ms

No background thread, no GC, no runtime — CPU usage is exactly proportional to the instructions executed.

cargo bench   # run benchmarks yourself

Installation

TypeScript / JavaScript

npm install @unchartedfr/zapcode        # npm / yarn / pnpm / bun

Python

pip install zapcode                     # pip / uv

Rust

# Cargo.toml
[dependencies]
zapcode-core = "1.0.0"

WebAssembly

wasm-pack build crates/zapcode-wasm --target web

Basic Usage

TypeScript / JavaScript

import { Zapcode, ZapcodeSnapshotHandle } from '@unchartedfr/zapcode';

// Simple expression
const b = new Zapcode('1 + 2 * 3');
console.log(b.run().output);  // 7

// With inputs
const greeter = new Zapcode(
    '`Hello, ${name}! You are ${age} years old.`',
    { inputs: ['name', 'age'] },
);
console.log(greeter.run({ name: 'Zapcode', age: 30 }).output);

// Data processing
const processor = new Zapcode(`
    const items = [
        { name: "Widget", price: 25.99, qty: 3 },
        { name: "Gadget", price: 49.99, qty: 1 },
    ];
    const total = items.reduce((sum, i) => sum + i.price * i.qty, 0);
    ({ total, names: items.map(i => i.name) })
`);
console.log(processor.run().output);
// { total: 127.96, names: ["Widget", "Gadget"] }

// External function (snapshot/resume)
const app = new Zapcode(`const data = await fetch(url); data`, {
    inputs: ['url'],
    externalFunctions: ['fetch'],
});
const state = app.start({ url: 'https://api.example.com' });
if (!state.completed) {
    console.log(state.functionName);  // "fetch"
    const snapshot = ZapcodeSnapshotHandle.load(state.snapshot);
    const final_ = snapshot.resume({ status: 'ok' });
    console.log(final_.output);  // { status: "ok" }
}

See examples/typescript/basic/main.ts for more.

Python

from zapcode import Zapcode, ZapcodeSnapshot

# Simple expression
b = Zapcode("1 + 2 * 3")
print(b.run()["output"])  # 7

# With inputs
b = Zapcode(
    '`Hello, ${name}!`',
    inputs=["name"],
)
print(b.run({"name": "Zapcode"})["output"])  # "Hello, Zapcode!"

# External function (snapshot/resume)
b = Zapcode(
    "const w = await getWeather(city); `${city}: ${w.temp}°C`",
    inputs=["city"],
    external_functions=["getWeather"],
)
state = b.start({"city": "London"})
if state.get("suspended"):
    result = state["snapshot"].resume({"condition": "Cloudy", "temp": 12})
    print(result["output"])  # "London: 12°C"

# Snapshot persistence
state = b.start({"city": "Tokyo"})
if state.get("suspended"):
    bytes_ = state["snapshot"].dump()          # serialize to bytes
    restored = ZapcodeSnapshot.load(bytes_)    # load from bytes
    result = restored.resume({"condition": "Clear", "temp": 26})

See examples/python/basic/main.py for more.

Rust
use zapcode_core::{ZapcodeRun, Value, ResourceLimits, VmState};

// Simple expression
let runner = ZapcodeRun::new(
    "1 + 2 * 3".to_string(), vec![], vec![],
    ResourceLimits::default(),
)?;
assert_eq!(runner.run_simple()?, Value::Int(7));

// With inputs and external functions (snapshot/resume)
let runner = ZapcodeRun::new(
    r#"const weather = await getWeather(city);
       `${city}: ${weather.condition}, ${weather.temp}°C`"#.to_string(),
    vec!["city".to_string()],
    vec!["getWeather".to_string()],
    ResourceLimits::default(),
)?;

let state = runner.start(vec![
    ("city".to_string(), Value::String("London".into())),
])?;

if let VmState::Suspended { snapshot, .. } = state {
    let weather = Value::Object(indexmap::indexmap! {
        "condition".into() => Value::String("Cloudy".into()),
        "temp".into() => Value::Int(12),
    });
    let final_state = snapshot.resume(weather)?;
    // VmState::Complete("London: Cloudy, 12°C")
}

See examples/rust/basic/basic.rs for more.

WebAssembly (browser)
<script type="module">
import init, { Zapcode } from './zapcode-wasm/zapcode_wasm.js';

await init();

const b = new Zapcode(`
    const items = [10, 20, 30];
    items.map(x => x * 2).reduce((a, b) => a + b, 0)
`);
const result = b.run();
console.log(result.output);  // 120
</script>

See examples/wasm/basic/index.html for a full playground.

AI Agent Usage

Vercel AI SDK (@unchartedfr/zapcode-ai)

npm install @unchartedfr/zapcode-ai ai @ai-sdk/anthropic  # or @ai-sdk/amazon-bedrock, @ai-sdk/openai

The recommended way — one call gives you { system, tools } that plug directly into generateText / streamText:

import { zapcode } from "@unchartedfr/zapcode-ai";
import { generateText } from "ai";
import { anthropic } from "@ai-sdk/anthropic";

const { system, tools } = zapcode({
  system: "You are a helpful travel assistant.",
  tools: {
    getWeather: {
      description: "Get current weather for a city",
      parameters: { city: { type: "string", description: "City name" } },
      execute: async ({ city }) => {
        const res = await fetch(`https://api.weather.com/${city}`);
        return res.json();
      },
    },
    searchFlights: {
      description: "Search flights between two cities",
      parameters: {
        from: { type: "string" },
        to: { type: "string" },
        date: { type: "string" },
      },
      execute: async ({ from, to, date }) => {
        return flightAPI.search(from, to, date);
      },
    },
  },
});

// Works with any AI SDK model — Anthropic, OpenAI, Google, etc.
const { text } = await generateText({
  model: anthropic("claude-sonnet-4-20250514"),
  system,
  tools,
  messages: [{ role: "user", content: "Weather in Tokyo and cheapest flight from London?" }],
});

Under the hood: the LLM writes TypeScript code that calls your tools → Zapcode executes it in a sandbox → tool calls suspend the VM → your execute functions run on the host → results flow back in. All in ~2µs startup + tool execution time.

See examples/typescript/ai-agent/ai-agent-zapcode-ai.ts for the full working example.

Anthropic SDK

TypeScript:

import Anthropic from "@anthropic-ai/sdk";
import { Zapcode, ZapcodeSnapshotHandle } from "@unchartedfr/zapcode";

const tools = {
  getWeather: async (city: string) => {
    const res = await fetch(`https://api.weather.com/${city}`);
    return res.json();
  },
};

const client = new Anthropic();
const response = await client.messages.create({
  model: "claude-sonnet-4-20250514",
  max_tokens: 1024,
  system: `Write TypeScript to answer the user's question.
Available functions (use await): getWeather(city: string) → { condition, temp }
Last expression = output. No markdown fences.`,
  messages: [{ role: "user", content: "What's the weather in Tokyo?" }],
});

const code = response.content[0].type === "text" ? response.content[0].text : "";

// Execute + resolve tool calls via snapshot/resume
const sandbox = new Zapcode(code, { externalFunctions: ["getWeather"] });
let state = sandbox.start();
while (!state.completed) {
  const result = await tools[state.functionName](...state.args);
  state = ZapcodeSnapshotHandle.load(state.snapshot).resume(result);
}
console.log(state.output);

Python:

import anthropic
from zapcode import Zapcode

client = anthropic.Anthropic()
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    system="""Write TypeScript to answer the user's question.
Available functions (use await): getWeather(city: string) → { condition, temp }
Last expression = output. No markdown fences.""",
    messages=[{"role": "user", "content": "What's the weather in Tokyo?"}],
)
code = response.content[0].text

sandbox = Zapcode(code, external_functions=["getWeather"])
state = sandbox.start()
while state.get("suspended"):
    result = get_weather(*state["args"])
    state = state["snapshot"].resume(result)
print(state["output"])

See examples/typescript/ai-agent/ai-agent-anthropic.ts and examples/python/ai-agent/ai_agent_anthropic.py.

Multi-SDK support

zapcode() returns adapters for all major AI SDKs from a single call:

const { system, tools, openaiTools, anthropicTools, handleToolCall } = zapcode({
  tools: { getWeather: { ... } },
});

// Vercel AI SDK
await generateText({ model: anthropic("claude-sonnet-4-20250514"), system, tools, messages });

// OpenAI SDK
await openai.chat.completions.create({
  messages: [{ role: "system", content: system }, ...userMessages],
  tools: openaiTools,
});

// Anthropic SDK
await anthropic.messages.create({ system, tools: anthropicTools, messages });

// Any SDK — just extract the code from the tool call and pass it to handleToolCall
const result = await handleToolCall(codeFromToolCall);
b = zapcode(tools={...})
b.anthropic_tools  # → Anthropic SDK format
b.openai_tools     # → OpenAI SDK format
b.handle_tool_call(code)  # → Universal handler
Custom adapters

Build a custom adapter for any AI SDK without forking Zapcode:

import { zapcode, createAdapter } from "@unchartedfr/zapcode-ai";

const myAdapter = createAdapter("my-sdk", (ctx) => {
  return {
    systemMessage: ctx.system,
    actions: [{
      id: ctx.toolName,
      schema: ctx.toolSchema,
      run: async (input: { code: string }) => {
        return ctx.handleToolCall(input.code);
      },
    }],
  };
});

const { custom } = zapcode({
  tools: { ... },
  adapters: [myAdapter],
});

const myConfig = custom["my-sdk"];
from zapcode_ai import zapcode, Adapter, AdapterContext

class LangChainAdapter(Adapter):
    name = "langchain"

    def adapt(self, ctx: AdapterContext):
        from langchain_core.tools import StructuredTool
        return StructuredTool.from_function(
            func=lambda code: ctx.handle_tool_call(code),
            name=ctx.tool_name,
            description=ctx.tool_description,
        )

b = zapcode(tools={...}, adapters=[LangChainAdapter()])
langchain_tool = b.custom["langchain"]

The adapter receives an AdapterContext with everything needed: system prompt, tool name, tool JSON schema, and a handleToolCall function. Return whatever shape your SDK expects.

Auto-Fix, Debug & Execution Tracing

Auto-fix (autoFix)

When enabled, execution errors are returned as tool results instead of throwing — letting the LLM see the error and self-correct on the next step.

TypeScript:

const { system, tools } = zapcode({
  autoFix: true,
  tools: { /* ... */ },
});

Python:

zap = zapcode(auto_fix=True, tools={...})

Execution Trace

Every execution produces a trace tree with timing for each phase (parse → compile → execute). Use printTrace() / print_trace() to display the full session trace, or getTrace() / get_trace() to access the trace programmatically.

TypeScript:

const { system, tools, printTrace, getTrace } = zapcode({
  autoFix: true,
  tools: { /* ... */ },
});

// After running...
printTrace();
// ✓ zapcode.session  12.3ms
//   ✓ execute_code    8.1ms
//     ✓ parse          0.2ms
//     ✓ compile        0.1ms
//     ✓ execute        7.8ms

const trace = getTrace(); // TraceSpan tree

Python:

zap = zapcode(auto_fix=True, tools={...})

# After running...
zap.print_trace()
trace = zap.get_trace()  # TraceSpan tree

Debug Logging

For detailed logging of generated code, tool calls, and output, see the debug-tracing examples which show how to inspect each execution step:

What Zapcode Can and Cannot Do

Can do:

  • Execute a useful subset of TypeScript — variables, functions, classes, generators, async/await, closures, destructuring, spread/rest, optional chaining, nullish coalescing, template literals, try/catch
  • Strip TypeScript types at parse time via oxc — no tsc needed
  • Snapshot execution to bytes and resume later, even in a different process or machine
  • Call from Rust, Node.js, Python, or WebAssembly
  • Track and limit resources — memory, allocations, stack depth, and wall-clock time
  • 30+ string methods, 25+ array methods, plus Math, JSON, Object, and Promise builtins
  • Async callbacks in .map() and .forEach() — each await suspends and resumes the VM sequentially

Cannot do:

  • Run arbitrary npm packages or the full Node.js standard library
  • Execute regular expressions (parsing supported, execution is a no-op)
  • Provide full Promise semantics (Promise.race, etc.) — .then(), .catch(), .finally(), and Promise.all are supported
  • Run code that requires this in non-class contexts

These are intentional constraints, not bugs. Zapcode targets one use case: running code written by AI agents inside a secure, embeddable sandbox.

Supported Syntax

Feature Status
Variables (const, let) Supported
Functions (declarations, arrows, expressions) Supported
Classes (constructor, methods, extends, super, static) Supported
Generators (function*, yield, .next()) Supported
Async/await Supported
Control flow (if, for, while, do-while, switch, for-of) Supported
Try/catch/finally, throw Supported
Closures with mutable capture Supported
Destructuring (object and array) Supported
Spread/rest operators Supported
Optional chaining (?.) Supported
Nullish coalescing (??) Supported
Template literals Supported
Type annotations, interfaces, type aliases Stripped at parse time
String methods (30+) Supported
Array methods (25+, including map, filter, reduce) Supported
Async callbacks in .map(), .forEach() Supported
Math, JSON, Object, Promise Supported
import / require / eval Blocked (sandbox)
Regular expressions Parsed, not executed
var declarations Not supported (use let/const)
Decorators Not supported
Symbol, WeakMap, WeakSet Not supported

Security

Running AI-generated code is inherently dangerous. Unlike Docker, which isolates at the OS level, Zapcode isolates at the language level — no container, no process boundary, no syscall filter. The sandbox must be correct by construction, not by configuration.

Deny-by-default sandbox

Guest code runs inside a bytecode VM with no access to the host:

Blocked How
Filesystem (fs, path) No std::fs in the core crate
Network (net, http, fetch) No std::net in the core crate
Environment (process.env, os) No std::env in the core crate
eval, Function(), dynamic import Blocked at parse time
import, require Blocked at parse time
globalThis, global Blocked at parse time
Prototype pollution Not applicable — objects are plain IndexMap values

The only escape hatch is external functions that you explicitly register. When guest code calls one, the VM suspends and returns a snapshot — your code resolves the call, not the guest.

Resource limits

Limit Default Configurable
Memory 32 MB memory_limit_bytes
Execution time 5 seconds time_limit_ms
Call stack depth 512 frames max_stack_depth
Heap allocations 100,000 max_allocations

Zero unsafe code

The zapcode-core crate contains zero unsafe blocks. Memory safety is guaranteed by the Rust compiler.

Adversarial test suite — 65 tests across 19 attack categories
Attack category Tests Result
Prototype pollution (Object.prototype, __proto__) 4 Blocked
Constructor chain escapes (({}).constructor.constructor(...)) 3 Blocked
eval, Function(), indirect eval, dynamic import 5 Blocked at parse time
globalThis, process, require, import 6 Blocked at parse time
Stack overflow (direct + mutual recursion) 2 Caught by stack depth limit
Memory exhaustion (huge arrays, string doubling) 4 Caught by allocation limit
Infinite loops (while(true), for(;;)) 2 Caught by time/allocation limit
JSON bombs (deep nesting, huge payloads) 2 Depth-limited (max 64)
Sparse array attacks (arr[1e9], arr[MAX_SAFE_INTEGER]) 3 Capped growth (max +1024)
toString/valueOf hijacking during coercion 3 Not invoked (by design)
Unicode escapes for blocked keywords 2 Blocked
Computed property access tricks 2 Returns undefined
Timing side channels (performance.now) 1 Blocked
Error message information leakage 3 No host paths/env exposed
Type confusion attacks 4 Proper TypeError
Promise/Generator internal abuse 4 No escape
Negative array indices 2 Returns undefined
setTimeout, setInterval, Proxy, Reflect 6 Blocked
with statement, arguments.callee 3 Blocked
cargo test -p zapcode-core --test security   # run the security tests

Known limitations:

  • Object.freeze() is not yet implemented — frozen objects can still be mutated (correctness gap, not a sandbox escape)
  • User-defined toString()/valueOf() are not called during implicit type coercion (intentional — prevents injection)

Architecture

TypeScript source
    │
    ▼
┌─────────┐   oxc_parser (fastest TS parser in Rust)
│  Parse  │──────────────────────────────────────────►  Strip types
└────┬────┘
     ▼
┌─────────┐
│   IR    │   ZapcodeIR (statements, expressions, operators)
└────┬────┘
     ▼
┌─────────┐
│ Compile │   Stack-based bytecode (~50 instructions)
└────┬────┘
     ▼
┌─────────┐
│   VM    │   Execute, snapshot at external calls, resume later
└────┬────┘
     ▼
  Result / Suspended { snapshot }

Contributing

git clone https://github.com/TheUncharted/zapcode.git
cd zapcode
./scripts/dev-setup.sh   # installs toolchain, builds, runs tests

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

zapcode-1.5.3-cp313-cp313-win_amd64.whl (784.1 kB view details)

Uploaded CPython 3.13Windows x86-64

zapcode-1.5.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (989.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

zapcode-1.5.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (965.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

zapcode-1.5.3-cp313-cp313-macosx_11_0_arm64.whl (887.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

zapcode-1.5.3-cp313-cp313-macosx_10_12_x86_64.whl (907.1 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

zapcode-1.5.3-cp312-cp312-win_amd64.whl (784.4 kB view details)

Uploaded CPython 3.12Windows x86-64

zapcode-1.5.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (989.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

zapcode-1.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (965.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

zapcode-1.5.3-cp312-cp312-macosx_11_0_arm64.whl (888.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

zapcode-1.5.3-cp312-cp312-macosx_10_12_x86_64.whl (907.3 kB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

zapcode-1.5.3-cp311-cp311-win_amd64.whl (786.1 kB view details)

Uploaded CPython 3.11Windows x86-64

zapcode-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (994.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

zapcode-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (969.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

zapcode-1.5.3-cp311-cp311-macosx_11_0_arm64.whl (891.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

zapcode-1.5.3-cp311-cp311-macosx_10_12_x86_64.whl (907.5 kB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

zapcode-1.5.3-cp310-cp310-win_amd64.whl (786.2 kB view details)

Uploaded CPython 3.10Windows x86-64

zapcode-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (994.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

zapcode-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (969.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

zapcode-1.5.3-cp310-cp310-macosx_11_0_arm64.whl (891.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

zapcode-1.5.3-cp310-cp310-macosx_10_12_x86_64.whl (907.7 kB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

Details for the file zapcode-1.5.3-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: zapcode-1.5.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 784.1 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for zapcode-1.5.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 4fe0c657c1b6ff369fb944bd55bb7750e5b2408c7bd14eb43fb1554308444e50
MD5 67a4fcafd1ffc63625f4c9fdbf9c92e6
BLAKE2b-256 08d319bca5f4f5f03351c16e7bb5b622a491355d803dce3e399433ef59211abf

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2b903fa9ff48c73bed8fc53b46ce837bb28833b4583961028a58aec271381d38
MD5 c54957e11bd3aafadf4a2c5fd49177f0
BLAKE2b-256 aebba553db946bc6f96adf0e8ea7e5591b546324fc644f42f5b5f20697d5fdeb

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bb41c0a1f4615710f5462fe17ffa8124bc70f0eee2b2a887cb5bce72bd79888e
MD5 760b06cc18a39c5f066bbe339d1eedee
BLAKE2b-256 076c0b357735b4c2bbc30b2eca9c0038fe29c185035435af85551a3b5c6665a0

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6026fcc5f50c5b044d5246eb554a0a73f794e215bd83c1fa1068b4029ad0bf22
MD5 e441c89cdd2fdef6953ba7443123de1f
BLAKE2b-256 a5e3b34d3587a0d3d016bec6391c997245209f9849777d92613b0773db58726b

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 fc2d9c3e136593bc7fc17405ee1ee8b06fef5b21d1dc8cb9572a4d4c0bf70df5
MD5 c887ca4d42dd8230da5be7917d081252
BLAKE2b-256 0920210d8df9610d4297fb0b5f726a4bd57ce89306fb6500e1b5379a85d73afe

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: zapcode-1.5.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 784.4 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for zapcode-1.5.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fb34f7a17fc5a0b6a7fced10ede432196fa7893ef1050f34e0da11351182430a
MD5 be92079a50aeb0eb8cd23eab8b90dcd9
BLAKE2b-256 ad010d2d2e738170a93e718e2e06d5b96e0c82f5c3c84b5077b8cf102523f025

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 27ad050007068f66dc48cbbf11a63451bcb98b0caa12a4ed3034101905d21dc6
MD5 9d3c67574271e26b7c9a2ab3093a8021
BLAKE2b-256 bc0787e773c86f23f8ea19276f92973519c384d7544dc128ad4706eadba5223b

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1c0015f539e94196be45416676c5e5147f37db90f9ec8212eef54e998c77a60e
MD5 2c04c672f490e837190dc58d7936ef7a
BLAKE2b-256 be4134fd4f65016f5b1e49449cfa755e3c703ae178462f5f6e4752537704b536

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f4baa3650ea8f4d7b19db679aa591c13a13545094d82826cb24aff6c128723cb
MD5 61f6bd0dcb7b97cc1ec859d1f3f2e519
BLAKE2b-256 0cd373cafc0f958e94c994e6cedbde6a1dcc7e7c22bfc8c2568bf0eda01ae3fd

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1ea7f8a4628a0c63cefd06572e9bbe7953aaaded9de5b55ca6d6ccbfd97f468d
MD5 4f59a0399d251dced20f0c92b03b5f0b
BLAKE2b-256 93a1531f4b2ebd1772f0aac73dd42679e9b8cdc2e5406fa0fdd1a77825439dfa

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: zapcode-1.5.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 786.1 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for zapcode-1.5.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2a1404c7ebc075ece682bdbd2c844c5bd9666975e5a4a1070c72fb38cab6930e
MD5 11698a984e1b3559a00a2ca5e5bad2b5
BLAKE2b-256 cd18b0e94028803f121a42a414db0b3e77d5bbcb993bf9f9abae8e0d564db7f0

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c7580199a788b2c09bd7b61c085cd53da7c459845d7d4814e7f11e5989d44d77
MD5 14f0ebdb0d18b4775f2792966f64f4ec
BLAKE2b-256 19d90c0933dd9c16d822575d72c0202d92ed52d7b22a5807cca86230c3ed1ca1

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b455106449a8a0c0561dcc8f91fd85346f45651e9e24b01be27eb9cd71229446
MD5 5b58e4859b9c2bb2ba8d9f00b22c5191
BLAKE2b-256 35347a33782c6bc04f179cb38c6298cfad0a7ea248b78122fdcf5840dd2d214d

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6929da09a8bec6ce041a2e902f9904fd78f9cacac2b9369212a7e9aeda9cf3a7
MD5 5c89c0cf6e8688880ac9a982a8a48297
BLAKE2b-256 943d239cded30552c30ccda3a4b57a99ad49f2f87c4b7d21b582d14fee579c7a

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 21df28badefa1cfca106500b525322674f965881a45fe8d618deeea0f8352a32
MD5 d1f38500e066d74f46696e019132cce3
BLAKE2b-256 72b9765c496f3cfe4877d57fff0f7a8e23a881b00c00ae3668686343679b7a87

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: zapcode-1.5.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 786.2 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for zapcode-1.5.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 833380418ca58fe630986d55108eaeeab202755aa68c78bbb206e932e9d6fcaa
MD5 1d9a8546bdd8e578b5448b4600caf38f
BLAKE2b-256 f2601795edcd45a45a00394c40cf1c586fe474e1998d377b65391d08a15e4cb2

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6ba68b8b1cc947abd8d11d574802114256626c101343b8dc565d535a97ae6d78
MD5 f64b1679a6517e8665b68776ca890519
BLAKE2b-256 59167b0f888691125e94b3380209b6b7204b60c234dddc0ac3664abd13bb4a44

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 45a2778e58fe2ed9f283bf1fca871b28c48ab839dac4d1beb73261e1df03a7ab
MD5 1a85a9d100533f3a01220809c143816a
BLAKE2b-256 2fece735550d702a0fcb3f56cd19d728e6f09aadc8031d090c0833c7b31b3e04

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5ec1093e555b5b80e433e13e1608f680cce75ec448c8c8b7c07323624c3251c8
MD5 c271a908683904a76cafcaf9ea1e48a2
BLAKE2b-256 8625bab87b6c59e726bb5c5696aac2faba96531d049f77d0dff5bdaf63e1c8e6

See more details on using hashes here.

File details

Details for the file zapcode-1.5.3-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zapcode-1.5.3-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a2248df64523d8ee28277d931d7b6453e46c8221aff41ef4a0fd53b884843a93
MD5 017f92e84fd31d2030a861b4802f1a44
BLAKE2b-256 2064099a7b115d58e7ba8316925bc0cc80702eb6bc117e5c2e9d890082fa81ed

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page