Skip to main content

Runtime network egress control for Python

Project description

tethered

Runtime network egress control for Python

One function call. Zero dependencies. No infrastructure changes.

PyPI Python License: MIT
coverage CI CodeQL security: bandit
Ruff uv ty

tethered is a lightweight, in-process policy check that hooks into Python's own socket layer to enforce your allow list before any packet leaves the machine. Use activate() to set a process-wide ceiling, and scope() to tighten individual code paths — request handlers, background jobs, library calls, AI-generated code. Everything runs locally within your process — works with requests, httpx, aiohttp, Django, Flask, FastAPI, and any library built on Python sockets.

import tethered

tethered.activate(allow=["*.stripe.com:443", "db.internal:5432"])

import urllib.request
urllib.request.urlopen("https://api.stripe.com/v1/charges")  # works — matches *.stripe.com:443
urllib.request.urlopen("https://evil.test/exfil")            # raises tethered.EgressBlocked

Why tethered?

Your code, your dependencies, and AI coding agents all share the same Python process — and any of them can make network calls you didn't intend. A compromised dependency phones home. An AI coding agent writes tests that accidentally call live APIs. An AI-generated function calls an unauthorized endpoint. A misconfigured library hits production instead of staging.

Python has no built-in way to prevent this at runtime. Infrastructure-level controls (firewalls, network policies, proxies) require platform teams, separate services, or admin privileges. None of them give you a single line of Python that says "this process may only talk to these hosts."

tethered fills this gap at the application layer. One function call controls what any code in the process — yours, your dependencies', or AI-generated — can reach over the network. No proxies, no sidecars, no admin privileges. It's complementary to infrastructure controls, not a replacement.

Use cases

Use case How tethered helps
🔒 Supply chain defense activate() locks the process to your known services — a compromised dependency can't phone home.
🔬 Scoped isolation scope() restricts a specific code path — a request handler, a background job, a library call — to only the destinations it needs.
🤖 AI agent guardrails Code generated by AI coding agents can't reach unauthorized endpoints — activate() enforces your allow list on any code running in the process.
🧪 Test isolation activate() in your test setup ensures the suite never accidentally hits production services.
📋 Least-privilege networking Combine activate() for the process boundary with scope() for per-function restrictions — declare your network surface like you declare your dependencies.

Install

uv add tethered

Or with pip:

pip install tethered

Requires Python 3.10+. Zero runtime dependencies. Pre-built wheels are available for Linux, macOS, and Windows. Source installs require a C compiler (the package includes a C extension for tamper-resistant locked mode).

Quick start

tethered has two complementary APIs. Both use the same allow list syntax (see below).

Enforce process-wide — activate()

Call activate() as early as possible — before any library makes network connections:

# manage.py, wsgi.py, main.py, or your entrypoint
import tethered
tethered.activate(allow=["*.stripe.com:443", "db.internal:5432"])

# Then import and run your app
from myapp import create_app
app = create_app()

This pattern works the same for Django, Flask, FastAPI, scripts, and AI-assisted workflows — activate tethered before your application and its dependencies start making connections. Existing connections (e.g., connection pools) established before activate() continue to work — tethered intercepts at connect time, not at read/write time.

Use locked=True in production to prevent any code from replacing or disabling your policy. Full parameter list and locked-mode details: docs/API.md.

Restrict a code path — scope()

Use scope() to restrict egress for a specific code path — a request handler, a background job, a library call:

import tethered
import httpx

@tethered.scope(allow=["*.stripe.com:443"])
def charge(amount: int, token: str) -> dict:
    # ... validate input, call helper libraries, log analytics —
    # none of them can reach anything except *.stripe.com:443
    resp = httpx.post("https://api.stripe.com/v1/charges", ...)
    return resp.json()

Also usable as a context manager (with tethered.scope(allow=[...]):). No deactivate() needed — cleanup is automatic. Works with sync and async functions.

scope() works on its own — no activate() required. When the app also called activate(), the effective policy is the intersection — a connection must be allowed by both. Scopes can only narrow, never widen. Full details: docs/API.md.

Package maintainers: Use scope(), never activate(). Your library doesn't own the process — the app does.

Subprocess control

Python child processes (multiprocessing.Pool, ProcessPoolExecutor, gunicorn workers, plain subprocess.run([sys.executable, ...])) automatically inherit the parent's tethered policy — including any active scope. Non-Python launches (curl, ffmpeg, different Python interpreters, or sys.executable with -S which disables site.py) are governed by external_subprocess_policy ("warn" default, or "block").

import tethered, subprocess, sys

tethered.activate(allow=["*.stripe.com:443"])
subprocess.run([sys.executable, "-c", "..."])  # child auto-inherits policy

with tethered.scope(allow=["api.stripe.com:443"]):
    subprocess.run([sys.executable, "-c", "..."])  # child also inherits the active scope

Full mechanics, locked-mode hardening, and the auto-vs-external rules: docs/SUBPROCESS.md.

Allow list syntax

Pattern Example Matches
Exact hostname "api.stripe.com" api.stripe.com only
Wildcard subdomain "*.stripe.com" api.stripe.com, dashboard.stripe.com (not stripe.com)
Hostname + port "api.stripe.com:443" api.stripe.com on port 443 only
IPv4 address "198.51.100.1" That IP only
IPv4 CIDR range "10.0.0.0/8" Any IP in 10.x.x.x
CIDR + port "10.0.0.0/8:5432" Any IP in 10.x.x.x on port 5432
IPv6 address "2001:db8::1" or "[2001:db8::1]" That IPv6 address
IPv6 + port "[2001:db8::1]:443" That IPv6 address on port 443 only
IPv6 CIDR "[2001:db8::]/32" Any IP in that IPv6 prefix

Wildcard matching: Uses Python's fnmatch syntax. * matches any characters including dots, so *.stripe.com matches both api.stripe.com and a.b.stripe.com. This differs from TLS certificate wildcards. The characters ? (single character) and [seq] (character set) are also supported.

Localhost (127.0.0.0/8, ::1) is always allowed by default. The addresses 0.0.0.0 and :: (INADDR_ANY) are also treated as localhost. Malformed hostnames containing whitespace, control characters, or invisible Unicode are rejected and never matched by wildcard rules.

Examples

Example Description
01_basic_activate.py Process-wide allow list with activate()
02_scope_context_manager.py scope() as a context manager
03_scope_decorator.py scope() as a function decorator
04_global_with_scope.py Global policy + scope — intersection semantics
05_global_with_nested_scopes.py Global policy + nested scopes — progressive restriction
06_locked_mode.py locked=True — prevent policy tampering
07_log_only.py Monitor-only mode with on_blocked callback
08_scope_in_threads.py Scoping inside thread pool workers
09_async_scope.py Async decorator and context manager
10_package_maintainer.py Library self-restricting with scope()
11_subprocess_control.py Auto-propagation to Python child processes + parent-side external_subprocess_policy
12_scope_subprocess.py Scope propagating to spawn-mode child processes

Hardened configuration

For threat models that include compromised dependencies — a maintainer's PyPI account hijacked, a malicious release pushed, the malware exfils local secrets to an attacker C&C — combine tethered's strictest settings:

import tethered

_LOCK = object()
tethered.activate(
    allow=["api.stripe.com:443", "db.internal:5432"],   # only what you actually need
    locked=True,                                          # tamper-resistant policy (C-guardian-protected)
    lock_token=_LOCK,                                     # required when locked=True
    external_subprocess_policy="block",                   # if your app doesn't shell out
)

# Only NOW import third-party code — including potentially compromised deps
import stripe

This combination:

  • Auto-propagates the policy to every Python child (multiprocessing workers, subprocess.run, asyncio.create_subprocess_exec) — a multi-stage exfil chain (Layer 0 → spawn → Layer 1 → ...) cannot escape by launching a fresh interpreter.
  • Refuses non-Python launches (curl, wget, bash) — closes the "shell out to a binary that does the egress" bypass.
  • Refuses tampering with the propagation channel — in-process code cannot strip _TETHERED_CHILD_POLICY, delete tethered.pth, or replace the policy with a permissive one without raising SubprocessBlocked.

Activate before importing any third-party code — anything that runs in the unprotected window (e.g., during a malicious package's __init__.py) is unprotected. tethered does not protect against ctypes / cffi raw syscalls; pair with OS-level controls (seccomp, containers, network namespaces) for hard isolation.

Defense-in-depth

tethered is a guardrail at the Python audit-event layer, not a sandbox. Code that uses ctypes, cffi, subprocesses, or C extensions with direct syscalls can bypass it. For hardened environments combine with OS-level controls (containers, seccomp, network namespaces). See SECURITY.md for the full threat model.

Documentation

  • docs/API.md — full API reference (activate, scope, deactivate, exceptions, locked mode, log-only)
  • docs/SUBPROCESS.md — subprocess auto-propagation, scope propagation, external_subprocess_policy
  • docs/ARCHITECTURE.md — how the audit hook works, scope mechanics, C guardian
  • docs/COOKBOOK.md — handling blocked connections in Django, Celery, retry decorators
  • SECURITY.md — threat model, what tethered does and does not protect against
  • examples/ — runnable scripts for every feature

Badge

Using tethered in your project? Add the badge to your README:

[![egress: tethered](https://img.shields.io/badge/egress-tethered-orange?labelColor=4B8BBE)](https://github.com/shcherbak-ai/tethered)

egress: tethered

Contributing

See CONTRIBUTING.md for development setup and guidelines.

Security

See SECURITY.md for reporting vulnerabilities and the full threat model.

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 Distribution

tethered-0.5.0.tar.gz (97.3 kB view details)

Uploaded Source

Built Distributions

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

tethered-0.5.0-cp313-cp313-win_amd64.whl (54.0 kB view details)

Uploaded CPython 3.13Windows x86-64

tethered-0.5.0-cp313-cp313-win32.whl (53.0 kB view details)

Uploaded CPython 3.13Windows x86

tethered-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl (70.8 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

tethered-0.5.0-cp313-cp313-musllinux_1_2_aarch64.whl (71.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

tethered-0.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (72.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

tethered-0.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (71.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

tethered-0.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (70.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

tethered-0.5.0-cp313-cp313-macosx_11_0_arm64.whl (51.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

tethered-0.5.0-cp312-cp312-win_amd64.whl (54.0 kB view details)

Uploaded CPython 3.12Windows x86-64

tethered-0.5.0-cp312-cp312-win32.whl (53.0 kB view details)

Uploaded CPython 3.12Windows x86

tethered-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl (70.7 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

tethered-0.5.0-cp312-cp312-musllinux_1_2_aarch64.whl (71.4 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

tethered-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (72.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

tethered-0.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (71.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

tethered-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (70.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

tethered-0.5.0-cp312-cp312-macosx_11_0_arm64.whl (51.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

tethered-0.5.0-cp311-cp311-win_amd64.whl (53.9 kB view details)

Uploaded CPython 3.11Windows x86-64

tethered-0.5.0-cp311-cp311-win32.whl (52.9 kB view details)

Uploaded CPython 3.11Windows x86

tethered-0.5.0-cp311-cp311-musllinux_1_2_x86_64.whl (69.3 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

tethered-0.5.0-cp311-cp311-musllinux_1_2_aarch64.whl (70.0 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

tethered-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (70.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

tethered-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (70.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

tethered-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (69.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

tethered-0.5.0-cp311-cp311-macosx_11_0_arm64.whl (51.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

tethered-0.5.0-cp310-cp310-win_amd64.whl (53.9 kB view details)

Uploaded CPython 3.10Windows x86-64

tethered-0.5.0-cp310-cp310-win32.whl (52.9 kB view details)

Uploaded CPython 3.10Windows x86

tethered-0.5.0-cp310-cp310-musllinux_1_2_x86_64.whl (68.7 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

tethered-0.5.0-cp310-cp310-musllinux_1_2_aarch64.whl (69.2 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

tethered-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (70.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

tethered-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (69.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

tethered-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (68.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

tethered-0.5.0-cp310-cp310-macosx_11_0_arm64.whl (51.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file tethered-0.5.0.tar.gz.

File metadata

  • Download URL: tethered-0.5.0.tar.gz
  • Upload date:
  • Size: 97.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tethered-0.5.0.tar.gz
Algorithm Hash digest
SHA256 35e34080afef1a48a26527cbe0140e8f9c8df8b0f272422169714596081f549e
MD5 1984d7154adaa947f3d8c42df591e45d
BLAKE2b-256 abd3fa6e55d37fe534d327a5ce2ccdbf6a5ad13908391ed35e9f11ecd7f19cf4

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0.tar.gz:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: tethered-0.5.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 54.0 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tethered-0.5.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 218b9b788080adbdf50804044712c8ce8b41b4cbe3f5fccc8e39ad6e1bf0921d
MD5 cc91545c476179d98c10a7279bc4b5e1
BLAKE2b-256 eba445bcdccdb32a51122159c778853f760a863c45dd1b43b4650fc01737b897

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp313-cp313-win32.whl.

File metadata

  • Download URL: tethered-0.5.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 53.0 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tethered-0.5.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 2ce7b95af88196781a37489da11b032e8ad4e85322a7cdb97bc10e75179022fa
MD5 f977e94f39efdb46175b2bd205657f56
BLAKE2b-256 082292624ea6639121b60a64304030da96fa0ba98f7f6624e3ffcbbb5be21e18

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp313-cp313-win32.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e239432eb8ae1e774de52a7028a8173edcdb9d5eee87d8fc8e1e0f100ad997ee
MD5 5dd0700bdb30b45c3565432051d7df7f
BLAKE2b-256 0876c4df77f0def8e2c31950891047e53824db277ab1d1147c5bb959a002d5d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6fd9d0db086d3b7a0524d8feaba7169356362fb4edd7f70c4bccb4d16d8569c9
MD5 fd59fe3bd77fbb392b0f05cfa7e085f4
BLAKE2b-256 747fa7ae953543327754186725c480fe3c0004611be797149dab697e28b63b6f

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp313-cp313-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e96984175da44be3274d282ebe1b8ea917f6d33653a31b07e1903cc43a4cafe9
MD5 3a99d7c87fd54152395d609a0488c8d2
BLAKE2b-256 a84963b6cae9c118694365bb3aa0293c63c80450d0f1ce8cc86c7c7662584a8b

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d92059960a9cdf235036c3e647e065d16ba124f86c2ce457c4a27a71307a76b9
MD5 c522f1ea9ea26171e6311d90072319e8
BLAKE2b-256 54ef42a71e8acafc1087667f39d8ee0a7253c8b3eb67ad227697465ef6e00408

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 58d50efda89b563e020cb2bd39221adaf94d34befdce646f56e20febfac262e3
MD5 5c8899260f7e3d08fc8b757c8cdb7ec6
BLAKE2b-256 6142977be1e5b62f7fe674f672df1204ed58fef627821ba2c0f9a53c21444346

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 62cb693494d17d880dc9c7b384b86c3d2b1035923761e97b2b63bb16e21a30d2
MD5 f6e418f9eff8de5390408ceccab6e044
BLAKE2b-256 932a9a89167d227d209c936f141dafe6a26d7d790d51afaf060dea599c54f98d

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: tethered-0.5.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 54.0 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tethered-0.5.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b8ef9c16fce575950d2e2215ba09377efb8b99459dc55dd7762a0703f58dadfe
MD5 9aa8170969e92b7c4d883f07aa2dc476
BLAKE2b-256 7a8b66dbeef2207785444864345dc5df833c783edb953b6102b7ea2da64c8ea9

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: tethered-0.5.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 53.0 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tethered-0.5.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 183a0be997f793add33f40a02682cbf17ac786fa8c962c6ce52cacbc026863d1
MD5 7c2e96ae63fe596b9a72fe0ae6147ef5
BLAKE2b-256 4df465e2767ee9130656da069e85bf53cdca677e2e4ac5e22103564d48e50f9b

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp312-cp312-win32.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 285385d729f4c1849849cfd14cc17033e0dd41a3c139d2361afbcf56821c49fb
MD5 1b27bde5342d446f473b4ff7f9b13755
BLAKE2b-256 2a7257945875a949365c8237906c58c2ed7283f6b8149fe928f408105ac63f45

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d0dd85867ad318ea15365e68742d0382aaf0e94151281a67d40574dd54b0052a
MD5 a7dc39500fc2b71734d7987f35ac1f07
BLAKE2b-256 3bd7ab6f5925aeffc29eee1b1d5fea26bbbd4d91c02fbd6225b8ceda676970c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp312-cp312-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 635269e6c7d5388344e46dc93f5532fb0561d14b392e9fa880bc0186cdf5d5e4
MD5 16f790bf21bbf6c0df2ed05018f646e1
BLAKE2b-256 e1b818a2277a41acb8c14142368832aedf3c11460f440f6a40a4efe5900c0392

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b7570f6252c1266d5d7f156abb74e33f5fc8d6d2b59b775d333ddc23988c6e7d
MD5 51f29cbfccc6c8c57e2ba9fafdab9ab3
BLAKE2b-256 08a5941070d5252495423cb033ca0fbf8e7a7e73ff12341ec80149c3c26f534c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 73b817a599ec4258b3e6779b917161d92adae4f247b022c6a5bc8c8247df11ca
MD5 43c1b3f8f1ed6e60dd9cfe092887f8ed
BLAKE2b-256 12576ea7d39126731b940fbf3e17f637a606e0209c4b2a79bd1c27c060a82c8e

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e6ff8a3bfb7d6b2c64a26499d27195b9f2b152f030d06a6163fab2b0a7c57e37
MD5 bb65847a8dcc6f0a53e8e2bb7e53ee8d
BLAKE2b-256 0fa16ac06d90241f7a993acacfc1dbd8fc5dc5be13cd176de4079e83ccbc92e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: tethered-0.5.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 53.9 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tethered-0.5.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2ac0908cfc85ae196d2f2c79618d3fdb331b35a55311c40f0cbb136afa6d9776
MD5 24b1470ffa122aecc1aa9fc02d44a3f7
BLAKE2b-256 babfaf57097f2a4b23aea2bbd525843062d0c1beea3d4e544e2673a012f55ce0

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp311-cp311-win32.whl.

File metadata

  • Download URL: tethered-0.5.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 52.9 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tethered-0.5.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 8f7b3b949d4dadb380cf356aed0208957155120e2ac4457f8015f131a7449530
MD5 a104f7b103b8bfa4fa6ce645c5bbe6ed
BLAKE2b-256 b7448f12f346a5a119cb5f6f65d6c8bbc7562ccc589ca9bcf85b357dc1d18902

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp311-cp311-win32.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 895e05b6ac49de91797ec57ca16df19c9ee84d9ad702b6309162b938a90e17e8
MD5 a4781290afd1e641a687781657357e42
BLAKE2b-256 0f5e5db31be99a406295ed43382970c0073751b33ec5f5c7f0b98abc41db0e1e

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7d9ea341f472667c8d5bbe62b24836ccdf219ca8f6c7d475ec40159d48e5e64d
MD5 f80fdb1f005d8e8f8b5a5720d6c704ab
BLAKE2b-256 9eeb69d8a2273f9a6b1f9e0ad683238b9cf9612d8572bc9239974d1ffc537431

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp311-cp311-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4bb850a589f945c48a17d3de1de4cd32c260e2527d949ae11aa28e71ca9b9936
MD5 33adc4397831cfba7a286247fd4d75c2
BLAKE2b-256 d28d8686007fc682a39feac4f0b9a744834f46936c731f8e799de80db52fdcc8

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a2b79e8226e9b2a2941e88ec4fc6264e53af2e09eced00ca5304b45042f758e5
MD5 92752184834fc6605c13496736d07c1e
BLAKE2b-256 2dcfe102913cf61bf05ab370fc048021290cb23f6c367c93975cf770469bdde1

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9f6d6e86db3268173a4023b771a821abea47abf812283f0efff4c050f59b3702
MD5 b6735c85f6b834ee48c57333ecd7ac75
BLAKE2b-256 41af884b2d5e7251c20ecd1d826420cb77007ff8f2c0f2893918da499693a007

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1fc92068ddcb5a27c7845ca4053d7fab4cfdfcded4fd5bd8e7ed7e07f86c302a
MD5 efa29b38d1f9f39376cecd4fc52502ea
BLAKE2b-256 268311fbabff9f532a5ca6e5fd82c84d9ef89a3d4a389527c8b3469def821816

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: tethered-0.5.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 53.9 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tethered-0.5.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f0566807b19b915512f615462da1ef86f4254f594a0e541098f02eb0898baad2
MD5 c39c38d81a7c9b3afa985d8f70c34494
BLAKE2b-256 b930b4e57305d5997e76730549cf1ca5371834e09f502388c4d7b9735218cc1b

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp310-cp310-win_amd64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: tethered-0.5.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 52.9 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for tethered-0.5.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 78ca9add7b787cef5683740771da5ab819f29e571be03d49010102dd41b90248
MD5 6c2baeeba1b268bf54de7e06816d0d16
BLAKE2b-256 73c1688a94a4a71bb073effe32f25c60a5a9ecb8bef6ea29553a50785cbb415c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp310-cp310-win32.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 79337c178cfd103e5a38c8dbb8687c1df1db7bce72c1de224486bac8dd3b23a4
MD5 9c87075338dba0d24b4c9e9d6d36cf63
BLAKE2b-256 ebd0eac67c7e5e53f835fb2a4201e996645c4456916c9604f120d5fe98285fb2

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 504f4e8cac28fb1bfd942f3bc9407b84b25b9b4ffff13ca7554101ab5d798f8c
MD5 675a63d1e15c3dd806cc588ecb01b8a0
BLAKE2b-256 c6acf18c65188776a6e2383f93e2462cbd612ffdbba7da9921b7e41061392a38

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp310-cp310-musllinux_1_2_aarch64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0089a14351319925ad81ef37ca6c916b7bd95f560f32c8250cf218dc7b112631
MD5 f4d63df5fd2ce8a8fb864b4f3d90e4fd
BLAKE2b-256 2f524ea530d211babf77e831d0a279f0d35d5348b81a66e31b9eac2c975368f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0a3b31c4f0d7fddc1974343971229948b257175d989a9b935e806178f109a26f
MD5 e8360ef45446bc6aac8c368f8fbd02a9
BLAKE2b-256 cc690eb134b4925f803a2b059d0366f367496e684e875a68f1c6a954942b5d0a

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2d7f21c38a8798423321749f019c83de43d6bab6764de44af125f5aab2e35df4
MD5 1c55056eab87818aeebf4cd026cdae9b
BLAKE2b-256 a50671b13ed60aa50b67eef992194d70d862c481b020e178c390c8845e4ef188

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tethered-0.5.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tethered-0.5.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0555f0185f7e4d5ded433997d07ae46f846949cb38e648a78cd8a78f0c0b81e6
MD5 41f5d0e6b14477f4d3248d0a38e27904
BLAKE2b-256 9772950a81b15c3a1dbeb1e89b0a8ae7e031ad4410eb43678e0f3ee106a0ea9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.5.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish.yml on shcherbak-ai/tethered

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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