Skip to main content

Add your description here

Project description

Arkitekt Gateway

A Python library for managing a Tailscale-based sidecar proxy. Arkitekt Gateway bundles a Go binary that handles secure networking via Tailscale, with full Python control over the process lifecycle, signal handling, and log streaming.

Features

  • 🚀 Multi-platform support - Pre-built binaries for Linux, macOS, and Windows (x86_64 and ARM64)
  • 🔄 Async-first API - Full asyncio support with context managers
  • 📡 Signal handling - Send SIGINT, SIGTERM, or any signal to the sidecar
  • 📝 Log streaming - Async iterator and callback-based log access
  • 🖥️ CLI included - Typer-based command-line interface
  • 🔒 Lifecycle management - Python controls when the sidecar starts and stops

Installation

pip install arkitekt-gateway

Or with uv:

uv add arkitekt-gateway

Quick Start

Command Line

# Run the sidecar proxy
arkitekt-gateway run \
  --authkey tskey-auth-xxxxx \
  --coordserver https://your-coordination-server.com \
  --hostname my-proxy \
  --port 8080

# Check binary info
arkitekt-gateway info

Environment variables are also supported:

export TS_AUTHKEY="tskey-auth-xxxxx"
export TS_COORDSERVER="https://your-coordination-server.com"
arkitekt-gateway run

Python API

Basic Usage

import asyncio
from arkitekt_gateway import Sidecar, SidecarConfig

async def main():
    config = SidecarConfig(
        authkey="tskey-auth-xxxxx",
        coordserver="https://your-coordination-server.com",
        hostname="my-proxy",
        port="8080",
    )
    
    async with Sidecar(config) as sidecar:
        print(f"Sidecar running with PID: {sidecar.pid}")
        
        # Wait for it to run (or do other work)
        await asyncio.sleep(10)
    
    # Sidecar is automatically stopped when exiting the context

asyncio.run(main())

Streaming Logs

async def main():
    config = SidecarConfig(
        authkey="tskey-auth-xxxxx",
        coordserver="https://your-coordination-server.com",
    )
    
    async with Sidecar(config) as sidecar:
        async for log in sidecar.logs():
            print(f"[{log.stream}] {log.line}")

asyncio.run(main())

Using Log Callbacks

from arkitekt_gateway import Sidecar, SidecarConfig, LogLine

async def log_handler(log: LogLine):
    if "error" in log.line.lower():
        print(f"ERROR: {log.line}")

async def main():
    config = SidecarConfig(
        authkey="tskey-auth-xxxxx",
        coordserver="https://your-coordination-server.com",
    )
    
    sidecar = Sidecar(config)
    sidecar.on_log(log_handler)
    
    await sidecar.start()
    try:
        await sidecar.wait()
    finally:
        if sidecar.is_running:
            await sidecar.stop()

asyncio.run(main())

Sending Signals

import signal

async def main():
    config = SidecarConfig(
        authkey="tskey-auth-xxxxx",
        coordserver="https://your-coordination-server.com",
    )
    
    async with Sidecar(config) as sidecar:
        # Do some work...
        await asyncio.sleep(5)
        
        # Send interrupt signal
        await sidecar.interrupt()
        
        # Or send any signal
        await sidecar.send_signal(signal.SIGTERM)

asyncio.run(main())

API Reference

SidecarConfig

Configuration dataclass for the sidecar process.

Parameter Type Default Description
authkey str required Tailscale authentication key
coordserver str required Coordination server URL
hostname str "ts-proxy" Hostname in the Tailnet
port str "8080" Port to listen on
statedir str "" State directory for Tailscale data

Sidecar

Async wrapper for the Go sidecar binary.

Properties

Property Type Description
is_running bool Whether the sidecar process is running
pid int | None Process ID of the sidecar
exit_code int | None Exit code if the process has terminated

Methods

Method Description
await start() Start the sidecar process
await stop(timeout=5.0) Stop the sidecar gracefully (SIGTERM, then SIGKILL)
await wait() Wait for the sidecar to exit
await interrupt() Send SIGINT to the sidecar
await send_signal(sig) Send any signal to the sidecar
async for log in logs() Async iterator for log lines
on_log(callback) Register an async callback for log lines

LogLine

Represents a log line from the sidecar.

Field Type Description
stream str Either "stdout" or "stderr"
line str The log message

Development

Local Setup

# Clone the repository
git clone https://github.com/jhnnsrs/arkitekt-gateway.git
cd arkitekt-gateway

# Install dependencies
uv sync --all-extras --dev

# Download the sidecar binary for local development
python dev.py

# Run tests
uv run pytest tests -v

Building

The package uses hatchling with a custom build hook that downloads the appropriate platform-specific binary during wheel building.

uv build

License

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

arkitekt_gateway-1.1.2.tar.gz (33.7 MB view details)

Uploaded Source

Built Distributions

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

arkitekt_gateway-1.1.2-py3-none-win_amd64.whl (16.7 MB view details)

Uploaded Python 3Windows x86-64

arkitekt_gateway-1.1.2-py3-none-macosx_11_0_arm64.whl (16.0 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file arkitekt_gateway-1.1.2.tar.gz.

File metadata

  • Download URL: arkitekt_gateway-1.1.2.tar.gz
  • Upload date:
  • Size: 33.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for arkitekt_gateway-1.1.2.tar.gz
Algorithm Hash digest
SHA256 3ecd1107a981575ef8f8f41ca0d7ac6b56148c2b15e5bd0f802c168d9a730903
MD5 739a5d57eced6776bd848778c5988a75
BLAKE2b-256 1e94fd3b30e39de2679c852767f3ebb3fa6e96de0242eacb1c38e36a6b032a0a

See more details on using hashes here.

File details

Details for the file arkitekt_gateway-1.1.2-py3-none-win_amd64.whl.

File metadata

  • Download URL: arkitekt_gateway-1.1.2-py3-none-win_amd64.whl
  • Upload date:
  • Size: 16.7 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for arkitekt_gateway-1.1.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 909427d22d43aa11cc0505f1bb29e0bcf3bd86abd9c9d8a860f18533d6731789
MD5 68cf8acf271dc6fc3480309e4c9ba9e6
BLAKE2b-256 2128f9af3dfb7a2537e33810946a2b87952676328176641b265a5285180626c8

See more details on using hashes here.

File details

Details for the file arkitekt_gateway-1.1.2-py3-none-manylinux2014_x86_64.whl.

File metadata

  • Download URL: arkitekt_gateway-1.1.2-py3-none-manylinux2014_x86_64.whl
  • Upload date:
  • Size: 16.8 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for arkitekt_gateway-1.1.2-py3-none-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b682b2162c355bb4420e191921597e8a46f0402ffb27e9560f3326991489bbd5
MD5 9397229446df32c0404a9c401eba665c
BLAKE2b-256 154829a652533cfbe6c4823213dd1d62b6b90d679879c3d762b129e3752740b8

See more details on using hashes here.

File details

Details for the file arkitekt_gateway-1.1.2-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: arkitekt_gateway-1.1.2-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 16.0 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for arkitekt_gateway-1.1.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d1e1e3fc88edd2d6fc11c42a0187f20762c177dba621b07a8fc1541ae12d5bb7
MD5 e55e47356f21b1c82c3a27cc8755139e
BLAKE2b-256 bf1f72fea835fe2f7f221f62c1a787c05505da76d868753808dd64cf59d1c41d

See more details on using hashes here.

Supported by

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