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 Checked with pyright

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).

Getting started

tethered has two complementary APIs. Both use the same Allow list syntax.

Process-wide ceiling: 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() will 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. See Locked mode.

Context-local restriction: scope()

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

import tethered
import httpx

def charge(amount: int, token: str) -> dict:
    with tethered.scope(allow=["*.stripe.com:443"]):
        # ... 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()

Or as a decorator:

@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()

No deactivate() needed — cleanup is automatic when the context exits or the decorated function returns. Works with both sync and async functions.

scope() works on its own — no activate() required. When used alone, the scope IS the policy for that code path. Code outside the scope is unaffected.

Scopes can only restrict, never widen. If the app also called activate(), the effective policy is the intersection — a connection must be allowed by both.

Package maintainers: Use scope(), never activate(). Your library doesn't own the process — the app does. activate() is a process-wide operation that would interfere with the host application's own policy. scope() is context-local and safe to use from any library.

How activate() and scope() work together

  • activate() sets a process-wide ceiling. No code anywhere in the process can reach destinations outside it.
  • scope() creates a temporary restriction within the current context. It can only narrow the effective policy, never widen it.
  • When both are active, the effective policy is the intersection — a connection must be allowed by both the global policy and every active scope.
# Process ceiling: allow Stripe and Twilio
tethered.activate(allow=["*.stripe.com:443", "*.twilio.com:443"])

# Payment endpoint: scope restricts to Stripe only
# (tethered logs a warning that *.sendgrid.com has no overlap with the global policy)
with tethered.scope(allow=["*.stripe.com:443", "*.sendgrid.com:443"]):
    # *.stripe.com:443   — allowed (in both global and scope)
    # *.sendgrid.com:443 — blocked (not in global policy — scope cannot widen)
    # *.twilio.com:443   — blocked (not in scope)
    httpx.post("https://api.stripe.com/v1/charges")  # works
    httpx.post("https://api.sendgrid.com/v3/mail")   # raises EgressBlocked

Nested scopes

Scopes nest naturally — each level further restricts:

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

with tethered.scope(allow=["*.stripe.com:443", "*.twilio.com:443"]):
    # db.internal:5432 is excluded by this scope

    with tethered.scope(allow=["*.stripe.com:443"]):
        # Now only *.stripe.com:443 is allowed
        httpx.post("https://api.stripe.com/v1/charges")    # works
        httpx.post("https://api.twilio.com/v1/messages")   # raises EgressBlocked

Examples

Runnable examples covering each feature:

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()

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.

API

tethered.activate()

tethered.activate(
    *,
    allow: list[str],
    log_only: bool = False,
    fail_closed: bool = False,
    allow_localhost: bool = True,
    on_blocked: Callable[[str, int | None], None] | None = None,
    locked: bool = False,
    lock_token: object | None = None,
)
Parameter Description
allow Required. Allowed destinations — see Allow list syntax. Pass [] to block all non-localhost connections.
log_only Log blocked connections instead of raising EgressBlocked. Default False.
fail_closed Block when the policy check itself errors, instead of failing open. Default False.
allow_localhost Allow loopback addresses (127.0.0.0/8, ::1). Default True.
on_blocked Callback (host, port) -> None invoked on every blocked connection, including in log-only mode.
locked Enable tamper-resistant enforcement via C extension. Prevents deactivate() and activate() without the correct lock_token, and installs a C-level integrity verifier that blocks ALL network access on tamper detection. Default False. See Locked mode.
lock_token Opaque, non-internable token required when locked=True. Must be an instance like object() — internable types (str, int, float, bytes, bool) are rejected with TypeError. Compared by identity (is), not equality.

Can be called multiple times to replace the active policy — calling activate() again does not require deactivate() first. If the current policy is locked, the correct lock_token must be provided. Each call creates a completely new policy; no parameters or state carry over from previous calls.

tethered.scope()

tethered.scope(
    *,
    allow: list[str],
    allow_localhost: bool = True,
    log_only: bool = False,
    fail_closed: bool = False,
    on_blocked: Callable[[str, int | None], None] | None = None,
)
Parameter Description
allow Required. Allowed destinations — see Allow list syntax.
allow_localhost Allow loopback addresses. Default True.
log_only Log blocked connections instead of raising. Default False.
fail_closed Block when the policy check itself errors. Default False.
on_blocked Callback (host, port) -> None on every blocked connection.

Use as a context manager (with tethered.scope(allow=[...]):) or a decorator (@tethered.scope(allow=[...])). Supports both sync and async functions. Cleanup is automatic — no deactivate() call needed.

Log-only mode

Monitor without blocking — useful for rollout or auditing:

tethered.activate(
    allow=["*.stripe.com"],
    log_only=True,
    on_blocked=lambda host, port: print(f"would block: {host}:{port}"),
)

tethered logs to the "tethered" logger via stdlib logging. To see log-only warnings, ensure your application has logging configured (e.g., logging.basicConfig()).

Locked mode

Tamper-resistant enforcement backed by a C extension:

secret = object()
tethered.activate(allow=["*.stripe.com:443"], locked=True, lock_token=secret)

# Both deactivate() and activate() require the correct token
tethered.deactivate(lock_token=secret)

Calling activate() or deactivate() without the correct lock_token raises TetheredLocked. See the Security model for the full threat analysis.

tethered.deactivate()

tethered.deactivate(*, lock_token: object | None = None)

Disable enforcement. All connections are allowed again. Internal state (IP-to-hostname mappings, callback references) is fully cleared — a subsequent activate() starts fresh.

If activated with locked=True, the matching lock_token must be provided or TetheredLocked is raised.

tethered.EgressBlocked

Raised when a connection is blocked. Subclass of RuntimeError.

try:
    urllib.request.urlopen("https://evil.test")
except tethered.EgressBlocked as e:
    print(e.host)           # "evil.test"
    print(e.port)           # 443
    print(e.resolved_from)  # original hostname if connecting by resolved IP

tethered.TetheredLocked

Raised when deactivate() or activate() is called on a locked policy without the correct token. Subclass of RuntimeError.

How it works

tethered uses sys.addaudithook (PEP 578) to intercept socket operations at the interpreter level:

  • socket.getaddrinfo — blocks DNS resolution for disallowed hostnames and records IP-to-hostname mappings for allowed hosts.
  • socket.gethostbyname / socket.gethostbyaddr — intercept alternative DNS resolution paths, including reverse-DNS lookups of raw IPs.
  • socket.connect (including connect_ex, which raises the socket.connect audit event in CPython) — enforces the allow list on TCP connections.
  • socket.sendto / socket.sendmsg — enforces the allow list on UDP datagrams.

When getaddrinfo resolves a hostname, tethered records the IP-to-hostname mapping in a bounded LRU cache. When a subsequent connect() targets that IP, tethered looks up the original hostname and checks it against the allow list. If denied, EgressBlocked is raised before any packet leaves the machine.

This works with libraries built on CPython sockets (requests, httpx, urllib3, aiohttp) and frameworks like Django, Flask, and FastAPI — they all call socket.getaddrinfo and socket.connect under the hood. Asyncio and async libraries using CPython sockets are supported: audit hooks fire at the C socket level, so asyncio, aiohttp, and httpx async use the same enforcement path as synchronous code.

scope() uses contextvars.ContextVar to push a per-context policy onto a stack. The audit hook checks the context-local scope stack in addition to the global policy. When a scope is active, a connection must pass both the global policy and every scope on the stack. When the context manager exits (or the decorated function returns), the scope is automatically popped. Because ContextVar is async-safe, scopes propagate correctly through await chains and asyncio.create_task(). Scopes do not automatically propagate to child threads — use scope() at the I/O point inside the thread, or use activate() for a process-wide ceiling.

The per-connection overhead is a Python function call with hostname normalization, a dictionary lookup, and pattern matching — designed to add minimal overhead relative to actual network I/O.

Security model

tethered is a defense-in-depth guardrail, not a security sandbox. It intercepts Python-level socket operations. Code that uses ctypes, cffi, subprocesses, or C extensions with direct syscalls can bypass it. For full process isolation, combine tethered with OS-level controls (containers, seccomp, network namespaces).

What tethered protects against

Trusted-but-buggy code and supply chain threats: dependencies that use Python's standard socket module (directly or through libraries like requests, urllib3, httpx, aiohttp). tethered prevents these from connecting to destinations not in your allow list.

What tethered does NOT protect against

  • ctypes / cffi / direct syscalls. Native code can call libc's connect() directly, bypassing the audit hook.
  • Subprocesses. subprocess.Popen, os.system, and os.exec* create new processes without the audit hook.
  • C extensions with raw socket calls. Extensions calling C-level socket functions are not intercepted.
  • In-process disabling (without locked=True). Code in the same interpreter can call deactivate() or activate() unless locked=True is used.
  • ctypes memory manipulation (with locked=True). Locked mode catches Python-level tampering: config replacement, method monkey-patching, frozen field mutation, bytecode swapping, and exception class replacement. sys.modules replacement is ineffective — the C guardian holds direct references to critical objects cached at activation time, so it never looks up modules through sys.modules. The remaining bypasses require ctypes to manipulate raw process memory — targeting CPython internals and/or the compiled C extension's private state. These attacks are version-specific, platform-specific, and fragile. They are not practical for opportunistic supply-chain attacks — they require a payload tailored to the exact Python version, OS, and tethered build.

Design trade-offs

  • Fail-open by default. If tethered's matching logic raises an unexpected exception, the connection is allowed and a warning is logged. A bug in tethered should not break your application. Use fail_closed=True for stricter environments.
  • Audit hooks are irremovable. sys.addaudithook has no remove function (by design — PEP 578). deactivate() makes the hook a no-op but cannot unregister it. This is per-process only — no persistent state, no system changes, everything is gone when the process exits.
  • IP-to-hostname mapping is bounded. The LRU cache holds up to 4096 entries. In long-running processes with many unique DNS lookups, older mappings are evicted. A connection to an evicted IP is checked against IP/CIDR rules only.
  • Direct IP connections skip hostname matching. Connecting to a raw IP without prior DNS resolution means only IP/CIDR rules apply — hostname wildcards won't match. On shared-IP infrastructure (CDNs, cloud hosting), multiple hostnames may resolve to the same IP. If an allowed hostname shares an IP with a disallowed one, a raw-IP connection to that address will pass hostname policy via the cached mapping. This is inherent to any system that cannot bind a socket to a specific hostname identity.
  • Localhost allows local relays. With the default allow_localhost=True, any proxy, tunnel, or forwarding agent listening on 127.0.0.1 or ::1 can relay traffic to external destinations, bypassing the intent of the egress policy. In high-security environments where local relays are a concern, set allow_localhost=False and explicitly allow only the loopback addresses and ports your application needs.

Recommendations

For defense-in-depth, combine tethered with:

  • OS-level sandboxing (containers, seccomp-bpf, network namespaces) for hard isolation.
  • Subprocess restrictions (audit hooks on subprocess.Popen events, or seccomp filters).
  • Import restrictions to prevent ctypes/cffi loading in untrusted code paths.

Handling blocked connections

EgressBlocked is a RuntimeError, not an OSError. This is intentional — a policy violation is not a network error and should not be silently caught by HTTP libraries or retry logic. You'll want to handle it explicitly at your application boundaries.

Django / FastAPI middleware

# middleware.py
import tethered

class EgressBlockedMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        try:
            return self.get_response(request)
        except tethered.EgressBlocked as e:
            logger.error("Egress blocked: %s:%s (resolved_from=%s)", e.host, e.port, e.resolved_from)
            return HttpResponse("Service unavailable", status=503)

Celery tasks

# EgressBlocked is a RuntimeError, so autoretry_for=(ConnectionError, TimeoutError)
# already won't retry it — the task fails immediately on a policy violation.
@app.task(autoretry_for=(ConnectionError, TimeoutError))
def sync_data():
    requests.post("https://api.stripe.com/v1/charges", ...)

Retry decorators

# Catch EgressBlocked before your retry logic — retrying a policy block is pointless
try:
    response = retry_with_backoff(make_request)
except tethered.EgressBlocked:
    raise  # don't retry policy violations
except ConnectionError:
    handle_network_failure()

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.

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.4.0.tar.gz (58.2 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.4.0-cp313-cp313-win_amd64.whl (37.3 kB view details)

Uploaded CPython 3.13Windows x86-64

tethered-0.4.0-cp313-cp313-win32.whl (36.6 kB view details)

Uploaded CPython 3.13Windows x86

tethered-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl (49.4 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

tethered-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl (50.1 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

tethered-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (50.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

tethered-0.4.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49.5 kB view details)

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

tethered-0.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (48.5 kB view details)

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

tethered-0.4.0-cp313-cp313-macosx_11_0_arm64.whl (34.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

tethered-0.4.0-cp312-cp312-win_amd64.whl (37.3 kB view details)

Uploaded CPython 3.12Windows x86-64

tethered-0.4.0-cp312-cp312-win32.whl (36.6 kB view details)

Uploaded CPython 3.12Windows x86

tethered-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl (49.4 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

tethered-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl (50.0 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

tethered-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (50.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

tethered-0.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49.5 kB view details)

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

tethered-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (48.5 kB view details)

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

tethered-0.4.0-cp312-cp312-macosx_11_0_arm64.whl (34.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

tethered-0.4.0-cp311-cp311-win_amd64.whl (37.3 kB view details)

Uploaded CPython 3.11Windows x86-64

tethered-0.4.0-cp311-cp311-win32.whl (36.5 kB view details)

Uploaded CPython 3.11Windows x86

tethered-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl (48.2 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

tethered-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl (49.2 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

tethered-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (49.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

tethered-0.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (48.5 kB view details)

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

tethered-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (47.8 kB view details)

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

tethered-0.4.0-cp311-cp311-macosx_11_0_arm64.whl (34.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

tethered-0.4.0-cp310-cp310-win_amd64.whl (37.3 kB view details)

Uploaded CPython 3.10Windows x86-64

tethered-0.4.0-cp310-cp310-win32.whl (36.5 kB view details)

Uploaded CPython 3.10Windows x86

tethered-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl (47.7 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

tethered-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl (48.6 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

tethered-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (48.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

tethered-0.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (47.9 kB view details)

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

tethered-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (47.2 kB view details)

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

tethered-0.4.0-cp310-cp310-macosx_11_0_arm64.whl (34.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for tethered-0.4.0.tar.gz
Algorithm Hash digest
SHA256 eb093088fccabbd67536d41179299dab2f14f53e18e45dd659e44dc77e001318
MD5 ace5790f6ca3c72baa41b8515fa31053
BLAKE2b-256 f7e26826aed3af1d78478ba35eefc86ae1273c15e88493b42b245b7927958140

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: tethered-0.4.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 37.3 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.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 0baf46c309243828e88adfde7762a74c9148a7f08258253a7545d421dc73fc45
MD5 577000b78ef2256de73232eadc128486
BLAKE2b-256 71f9981791b289b6f1d0eb58774737b327834be09ff7e2119fed28a627a2c9b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp313-cp313-win32.whl.

File metadata

  • Download URL: tethered-0.4.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 36.6 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.4.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 951758f867600568cfd0f24f6a99a0cd02dbbc266ef8c9d2d6154760ac510c5a
MD5 99d3ecbdb39562dd83fd1220c847149c
BLAKE2b-256 d03d9a033d18af79cd0b66c6113d2405b69c6aee99b72f7be0c0f862455ddc62

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 41010c959ca2cde402e61ba50bb4453288adaf6c15082591f5b4db4cbeaa88b5
MD5 c310aae4a8d87b4de60b74c7a0a913ff
BLAKE2b-256 c9370b613606972f7ce1e0cf3b2527203967816046bc648d4c536bfda0c9c1d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 5c2829b3022273ef00ccd4cf434be57a30f0edd3a7367300a454aabfc1dd8f20
MD5 d13491e64f851240893f69d6597c7ab9
BLAKE2b-256 c1b5c707337d9dc0543c2cba442979d1c0754793ab176c19f51e2fda129ed1b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 846013742ae2ca763a5921663bea5219509433e036c685b411860f8f4e840919
MD5 e9ca01f160078c323803be38c7e65439
BLAKE2b-256 b3453f81829988c40dc618b8378f5c0ac624aa59f5e220112ad9ad9ccc55453c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.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.4.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cf5a1a08fd83501a492a2c2045cd434a10425e119423c8271d263a5811c55ebb
MD5 8bd178f2773f780266b4e313348d4f26
BLAKE2b-256 83f711316278b508588c28841f1406cdd1d7b11801dc9181b696dce79b5a18dd

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 772ca8bc7b71ab8e1ed8f8409c4aedff02e0b85d19dc7cdf6e7601ac515a356a
MD5 42af511580279dd479e2231bbf51ba1f
BLAKE2b-256 6f8b436ff663adf02a9143bf94baec627200a550e18c18dadd0c004e42f9d1e2

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 77c402688ae8be9e8f3872bb683d63857ce77f0a38719811698aa31383a80892
MD5 12a285e2cc0113fa3603bce2fb962dd5
BLAKE2b-256 286ef2cf289f07f932a2804d625fb4eeb0182108f1035668f4498c628865bce8

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: tethered-0.4.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 37.3 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.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 8e37d0072def520c2159e6a0f8c6e5aec51929d62b456fbed410e9eef9b80d8c
MD5 a57362181b7c02322c0b2db3f983b726
BLAKE2b-256 638638ca663857822667d2b5f373a320ac438df1dbe3a43b35924f2830c34e5f

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: tethered-0.4.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 36.6 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.4.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 96fe0c9b373ecd73a3dc7a74da2cdab17d743158174cb146769c055df3a245c5
MD5 eee1b2ae583f088a4b98b60028c0c54b
BLAKE2b-256 047c3c1d3b794b1e39786177581d8ab7ee11b986d0d26e1261b3910779178a73

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d51ed2f1931779786884b5406728dc95c8431ec3c24c4f9c25f25a616c3a8c22
MD5 6d9454c40bbb61206ff26edebe73b4ac
BLAKE2b-256 93d162c861859dd5ccc41b0237a186cce5881588877e02f9ab627af3501fc518

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 fad896a07cd17c46e13fee6e2186ace8aeb1bfeb6f4b232ef92232820f9eca67
MD5 8ef339127b55f6fa0dc5186008084e49
BLAKE2b-256 acda5b3e322d4f697cdb3ecade9d12f109d92c47464fe247083b8928151e80bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 be945252e01a5140f0e95e33d238a7f2169a8e055954bba78060df423e6ca426
MD5 a765c8801cb02c194ca9edefcb8c923b
BLAKE2b-256 817a0543d7cca7c3465a5c652c6da15e2d15fd0b7b22feb12d206cbc9cebdb07

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.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.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cef50acae1c643dcb1425f1156381c6afabfa8b77e65557266b3c74b0e59b320
MD5 be1a57c53bcca00727177d10a1d04b62
BLAKE2b-256 b0cbfe0a3b6137bcd1aaacc3bff9884eb5adfff1d3d8833eae1ee170d3e6d8df

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 92e443d524de9893e010ad6bcb8fc860b52f1799c0b0ed65e3ecc502e8496e6c
MD5 7c490a59badb01d2132be85081572959
BLAKE2b-256 c7345d9cf17798913c2f2a2f0f3bc83b88acc17ef31c778796b70f10e0c79cc5

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8d3ab5167e5dbd65aa43c707dc9390fb21ce0a9f3bdded3e707bd1c065fc65ef
MD5 8de75166a2dc2a297ffd3ee0d30bf843
BLAKE2b-256 81fce0d179abd3b72661a2e5bdfdeefa03d4bc5f452b8d860691503ef7876ecb

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: tethered-0.4.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 37.3 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.4.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b9fdf9d97fb16ed766ecdeb3e3e31ef2e341730f21b4b1abeb7a151a52000efb
MD5 3f79084a8132dae1916a2de430b081f3
BLAKE2b-256 ab3af36d7ea8b786dc6f757ac5c2a0c0b417c443e3242ed040e5f55017f6ce23

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp311-cp311-win32.whl.

File metadata

  • Download URL: tethered-0.4.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 36.5 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.4.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 a985af0a5b038292c50a1aba494c29bff5c59e99bd418722a1bf94c4ec74376b
MD5 e5bb2c2a4582df6fed5e37bf1b73d2b6
BLAKE2b-256 bc7e54f880d51cb8b29341b12e8ef771e515b73059c01bacb84ca4908bc42b22

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 afa8d8d44cfbe87a07351386a5e87e82fa2e333ef9ef2179af674359777ebeb9
MD5 e0b291396a17e92e95162014df483436
BLAKE2b-256 f170b715ae2ec0a8373bedc6a56e13f26646e303d16e393e41e01dc6587baf0e

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 305645faedc78b783f2ab2e6c48322704da3f3d3ef586494b6fa9dcccaa31487
MD5 5c1108d18a4f084df9c6e5a49b0c29c9
BLAKE2b-256 5853a8f1301c36edb995c2331f0f6046dbab6c62d92531ed882d633bb34f089f

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0d5f6fd5d27c700399285f6ab6ee977e78d81c28fe9128a1a1e2ae3e6660559e
MD5 d76307147201e6d0dd0981bc732ec049
BLAKE2b-256 9dd51a1f5e2443aa8387d9c7613c3e0f2300d7804b4fded2f25d5ac19c06fb33

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.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.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9db11095694ad4784111960431f4d1b940a9c561eabd6501fe5f182eb3286aac
MD5 8af1b60bcf171f303ed1e64410a98875
BLAKE2b-256 9cf87f12c9c6b9b7395879816b7c3d6cfb26966ca1243333ee91c4b376b9014e

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d1d886cc4bd69a6062229103bba7ca9e4ae87ada6ef4f5e5da205cc62611455d
MD5 4b158ace3fc7cfbebd9a6398c5eb6382
BLAKE2b-256 2c536df1e82a80ed1663efcfe888af700f0209efaecc9b7612cbd8ad54f24ba4

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7f7e3ea62ad8f5a8e64b6ee8e21f072b9f8ee03ce81b4e1410ab3eb2cabf458e
MD5 4e89579916565941becedc2d4181cea6
BLAKE2b-256 c1d575aa10c919f894e1ffc13c200c1a7e6b9ddea427f4ccfafd5e6f1daba0d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: tethered-0.4.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 37.3 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.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f550c23fe21c02657a0670c3aa5ce840ba485dd47518427938f5e49fd6865a87
MD5 2e00883931348c1e3fd3b460c211353c
BLAKE2b-256 cfa9b03857f2c23905705c82aa11c9f972909714eaae100c4f4d6200542be07b

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: tethered-0.4.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 36.5 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.4.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 a9b129dc003a3804b71c4a6c973d16bf5498d2a3f263d16b4a1abfe47669adfd
MD5 2e3ee314e69ab68fd48912b22d223f42
BLAKE2b-256 f8d3e3b9d75e612c06a9b2bf80be135fc6bd597a1ef321d48d1283e827d736a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 27185c736bbe47dc99be48c4dbf8460988a7d3214985a968d98bf5a274d5855a
MD5 a06502b82f5217d41638350d63b290d6
BLAKE2b-256 6e45597aa216442c2a72973d625a2d5e073481f2e66ff476da2609471a158614

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b4e5be4f405bb06765a72c071b86c44cf38c23021cd66d810e06e48781f36b92
MD5 b65ebaa785f488d028af43f9f05541e7
BLAKE2b-256 1596f6b8dc89b3475d70c25d960167bdc1fd7b2da9e1c7edf125129a71294ec4

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e7e18403accae473bd9b594738d100ac245fbd2821627cd73961d21529c69c77
MD5 726efe47fb6d6652c5c166785120b96c
BLAKE2b-256 603454e575ae3a530075f5a607bcd35801caf9ddbc55d8c187f7522c39b4fbd1

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.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.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 662ff7e4fa1f59c1259f27ac3bb188d8696172b6809b6f9fd16f64be53d3dc2f
MD5 24091555f969502c65d0a501d3a3a403
BLAKE2b-256 39ef8cf382ff7574fbdfe067954e7d7e820180e9a3dc1e1ee7e4ee6660ad72e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7b1c36756817258ceb87bf698a969eca183f396accd6f4158d7567e6877926ea
MD5 12aeda9556f4d0822aa639b77faf9804
BLAKE2b-256 e303ce438c86c5c3e00176b74635012d2564577445baa938157732576159b849

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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.4.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tethered-0.4.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d11d8bbd17d69a47d6e969648318a860e08bbdc1753e4b7ac009007949ad2494
MD5 2d70e5464cd278e441ddcf05a1f5c190
BLAKE2b-256 136fdc05f10f3b75f684eebeea7f0d35be1cd36bf5ad582cfdfa0b46245a31ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for tethered-0.4.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