Skip to main content

runtime-sdk

Python SDK and CLI for Runtime.

Install

Supported host OS for scriptable CLI commands: Windows, macOS, and Linux.

The interactive dashboard ships in native wheels for Windows ARM64/x64, macOS 13+ ARM64/x64, and 64-bit Linux with glibc 2.17+. Other supported environments receive the universal wheel with the complete scriptable CLI but without the OpenTUI dashboard.

uv tool install runtime-sdk

To upgrade an existing install:

uv tool upgrade runtime-sdk

Configure

The CLI talks to https://api.runruntime.dev by default.

For local or self-hosted Runtime, override it with:

export RUNTIME_BASE_URL=http://127.0.0.1:8080

Or pass --base-url per command.

MCP

ChatGPT and Claude can connect to Runtime at https://api.runruntime.dev/mcp. The connector uses WorkOS OAuth and provisions the same verified-email Runtime account as the CLI. The initial read-only tools are runtime_whoami and runtime_list_computers.

Usage

# Auth
runtime                          # open the interactive dashboard; sign in first if needed
runtime signup                   # enter email, then the six-digit code
runtime login                    # same verified-email flow for new and returning users
runtime login --email me@example.com
printf '%s\n' '123456' | runtime login --email me@example.com --code-stdin
runtime whoami
runtime logout
runtime login --api-key sk_...   # explicit headless credential mode
# Or set RUNTIME_API_KEY for one process without saving it.
runtime api-keys list
runtime api-keys create "my laptop"
runtime api-keys revoke key_01...
runtime integrate github
runtime github list
runtime github disconnect acme

# Computers
runtime switch --repo owner/repo feature/login      # open or create the branch workspace computer
runtime switch -c feature/login --repo owner/repo   # create a new branch workspace from the repo default branch
runtime checkout --repo owner/repo feature/login    # alias for switch
runtime create                       # creates a computer with the starter app already published
runtime create myapp --command "python3 app.py" --cwd /home/runtime --port 3000
runtime create locked --network allowlist --allow-host api.example.com
runtime enter <name-or-id>         # open an interactive shell; accepts slug/name or computer id
runtime enter <name-or-id> -- claude   # open a real TTY and run an interactive command
runtime enter <name-or-id> -- python   # use enter for REPLs, agents, prompts, and full-screen apps
runtime ssh <name-or-id>           # open SSH through Runtime's authenticated tunnel
runtime ssh <name-or-id> -- uptime # run a command with the local ssh client
runtime list                    # print a human-readable computer table
runtime list --json             # one JSON response for scripts and agents
runtime list --json --watch 2   # newline-delimited JSON updates
runtime info <id>
runtime share public <id>
runtime share private <id>
runtime start <id>
runtime run <id> "echo hello"      # one-shot foreground command only
runtime run <id> "apt install -y nodejs" --uid 0
runtime exec <id> -- bash -lc 'for i in 1 2 3; do echo $i; sleep 1; done'
printf 'hello' | runtime exec <id> --stdin -- cat
# runtime run and exec both return the remote exit code; use exec for streamed output and piped stdin.
# Use runtime enter -- <cmd> for interactive TTY commands.
runtime files ls <id> /home/runtime
runtime files read <id> /home/runtime/app.py --output app.py
runtime files write <id> /home/runtime/app.py --input app.py --mode 0644
runtime files mkdir <id> /home/runtime/data --parents
runtime files upload <id> ./local-app /home/runtime/app
runtime files download <id> /home/runtime/app ./downloaded-app
runtime files rm <id> /home/runtime/data --recursive
runtime startup show <id>
runtime startup set <id> --command "python3 app.py" --cwd /home/runtime --port 3000
runtime startup clear <id>          # low-level durable service config
runtime service show <id>           # user-facing alias for the durable published app
runtime service clear <id>
runtime publish <id> 3000 -- python3 app.py
runtime delete <id>

# Network policy
runtime network default show
runtime network default allowlist api.example.com '*.github.com'
runtime network show <id>
runtime network denials <id>
runtime network set <id> none
runtime network set <id> open

# Inside a running computer, the helper installed by Runtime can manage the
# durable app without leaving the sandbox:
#   runtime-env publish 3000 -- python3 app.py
#   runtime-env service show
#   runtime-env service clear

Private public URLs authenticate the browser before forwarding traffic. Apps behind a private URL receive trusted X-Runtime-Account-ID, X-Runtime-User-ID, and X-Runtime-User-Email headers. Runtime strips client-supplied versions of those headers from both public and private traffic; public URLs receive no Runtime identity headers.

Python

from runtime_sdk import RuntimeClient

client = RuntimeClient(base_url="https://api.runruntime.dev", credential="sk_...")

# Or share the CLI's saved API key / WorkOS session and refresh behavior.
client = RuntimeClient.from_config()

# Create a computer. New computers start with the starter app already published.
computer = client.create_computer()
print(computer["public_url"])  # https://goldbird.runruntime.dev

# Or create one with an explicit durable app command.
# That saved service is replayed after cold restore / start.
app = client.create_computer(
    slug="myapp",
    command="python3 app.py",
    cwd="/home/runtime",
    port=3000,
)

# Account defaults are copied only to computers created later.
client.set_default_network("allowlist", ["api.example.com"])
restricted = client.create_computer()
client.set_computer_network(restricted["id"], "none")

# Run a command
result = client.run_command(computer["id"], "echo hello")
print(result["stdout"])

client.write_file(computer["id"], "/home/runtime/hello.txt", b"hello\n")
print(client.read_file(computer["id"], "/home/runtime/hello.txt"))
print(client.list_files(computer["id"], "/home/runtime"))

# Wake a cold computer explicitly
client.start_computer(app["id"])

# Promote the running app on a local port to the durable public app.
# Runtime inspects the listening process and saves its command + cwd when possible.
client.publish_port(computer["id"], 3000)

# List, info, delete
computers = client.list_computers()
info = client.get_computer(computer["id"])
client.delete_computer(computer["id"])

SDK response and stream contracts

The CLI and SDK intentionally have different envelopes:

  • CLI control commands are human-readable by default. Add --json for one JSON object with "success": true on stdout. JSON errors use non-zero process status and a JSON object on stderr.
  • SDK methods return the API payload directly. They do not add a success field. High-use payloads and exec events are exported as TypedDict types from runtime_sdk.
  • File reads return exact bytes. Streaming methods yield events as they arrive; they do not collect them into a control-response envelope.

RuntimeClient is synchronous. stream_command() yields parsed, discriminated ExecEvent objects from NDJSON. Stop iteration by calling close() on the generator (or by using contextlib.closing) to close the HTTP connection immediately. stream_service_logs() yields raw NDJSON lines. There is no async client until a concrete consumer requires one.

Command request timeouts, open stream lifetime, durable service lifetime and computer auto-delete TTL are separate boundaries. The normal client timeout is 10 seconds; lifecycle operations raise it to the 180-second warmup window; open streams have no client deadline and end on server completion, connection failure or caller cancellation.

Pre-1.0 compatibility policy

runtime-sdk supports Python 3.11, 3.12 and 3.13. Before 1.0:

  • Patch releases may add optional response fields and event variants. Clients must ignore fields they do not understand.
  • Existing method arguments, required fields and scriptable CLI output are not removed or incompatibly changed in a patch release.
  • Deprecations are documented and retained through at least the next minor release. A pre-1.0 minor release may contain a documented breaking change.
  • A breaking scriptable CLI output change is treated the same as an SDK API break; human-readable help text is not a machine contract.
  • Supported Python versions are removed only in a documented minor release.

Development

For fast local backend iteration:

make local-backend

For deploying and testing against the Hetzner production server:

make sync SERVER_IP=x.x.x.x SSH_USER=root
make smoke

Use make deploy instead of make sync when migrations, env files, Caddy, or systemd units changed.

Cold restore and explicit runtime start replay the saved published app command. New computers seed that durable app from the starter workspace. Later, runtime publish <id> <port> -- <command...> replaces the durable app command and starts it. Inside a running computer, runtime-env publish <port> -- <command...> does the same thing using a computer-scoped token installed by Runtime. runtime service show|clear and runtime-env service show|clear expose that same durable app state directly. The low-level runtime startup ... commands still map to the same durable state. A one-off runtime run stays one-shot: the filesystem is restored after going cold, but that ad-hoc process is not.

GitHub branch workspaces

runtime switch gives a repo branch its own Runtime computer so you can jump between parallel tasks without local worktrees.

runtime integrate github
runtime github list
runtime switch --repo owner/repo feature/login
runtime switch -c feature/search --repo owner/repo --from main

Rules:

  • GitHub must already be connected with runtime integrate github.
  • Run runtime integrate github again when you want to add another personal account or org.
  • New GitHub connects require user authorization during installation and GITHUB_APP_CLIENT_ID / GITHUB_APP_CLIENT_SECRET on the Runtime API. In GitHub App settings, enable user authorization during installation and set the callback URL to https://api.runruntime.dev/github/callback.
  • runtime switch opens an existing branch workspace, or creates the computer if the branch exists but the workspace does not yet.
  • runtime switch -c creates a new branch first, then opens that branch's workspace.
  • Each repo + branch maps to one dedicated computer.
  • The repo is cloned into /home/runtime/<repo> and new shells in that computer start there automatically.
  • runtime checkout ... is an alias for runtime switch ....

Run the SDK unit tests through the backend project environment:

uv run python -m unittest discover -s scripts/tests -p 'test_*.py'

Release

Set and commit the release version first:

cd backend
uv version <next-version>

Merge the release version to main, then run the Runtime SDK workflow with the exact committed version. The workflow tests the Python CLI and OpenTUI, builds all platform wheels, runs the installed Windows wheels against production, and only then publishes those same artifacts to PyPI.

VERSION="$(uv version --short)"
gh workflow run runtime-sdk.yml --ref main -f version="${VERSION}" -f publish=true

Preview the runner commands without building:

./scripts/release_runtime_sdk.sh --dry-run

RUNTIME_WINDOWS_SMOKE_API_KEY is the production smoke credential; UV_PUBLISH_TOKEN is used only by the publish job after every wheel and the Windows production smoke pass. The build script never publishes, changes the source version, or loads a local .env file.

Download files

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

Source Distributions

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

Built Distributions

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

runtime_sdk-0.7.0-py3-none-win_arm64.whl (38.3 MB view details)

Uploaded Python 3Windows ARM64

runtime_sdk-0.7.0-py3-none-win_amd64.whl (39.8 MB view details)

Uploaded Python 3Windows x86-64

runtime_sdk-0.7.0-py3-none-manylinux_2_17_x86_64.whl (43.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

runtime_sdk-0.7.0-py3-none-manylinux_2_17_aarch64.whl (43.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

runtime_sdk-0.7.0-py3-none-macosx_13_0_x86_64.whl (28.2 MB view details)

Uploaded Python 3macOS 13.0+ x86-64

runtime_sdk-0.7.0-py3-none-macosx_13_0_arm64.whl (25.7 MB view details)

Uploaded Python 3macOS 13.0+ ARM64

runtime_sdk-0.7.0-py3-none-any.whl (94.9 kB view details)

Uploaded Python 3

File details

Details for the file runtime_sdk-0.7.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: runtime_sdk-0.7.0-py3-none-win_arm64.whl
  • Upload date:
  • Size: 38.3 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","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 runtime_sdk-0.7.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 6829c224966010aa7d3668f1bab74c72dc06a189aff0307191c7605653ff48df
MD5 3e554a32d222cc5c5ecb8228e0460ec3
BLAKE2b-256 1ac0d5770e60d89e9009a9f589cf67e4de4f976b74a019c933fc267aad689ab9

See more details on using hashes here.

File details

Details for the file runtime_sdk-0.7.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: runtime_sdk-0.7.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 39.8 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","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 runtime_sdk-0.7.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 571729a8b3a88ad578d3bce3c5f278821728f3ffeb20f4996bf94c9337a1c15a
MD5 684769316d3ac7bb4b1b2ba4af8aa696
BLAKE2b-256 d63ae94c72c16a59531be15ffccfd919454a57ff15fc52cfa77abae6305c56bb

See more details on using hashes here.

File details

Details for the file runtime_sdk-0.7.0-py3-none-manylinux_2_17_x86_64.whl.

File metadata

  • Download URL: runtime_sdk-0.7.0-py3-none-manylinux_2_17_x86_64.whl
  • Upload date:
  • Size: 43.7 MB
  • Tags: Python 3, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","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 runtime_sdk-0.7.0-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 e9289debb9b3ef0458e11323778049d1ff8ffab08fcd5869f662b7134abd5a59
MD5 88e1ff1e19fdacd3ec87175e84ee8588
BLAKE2b-256 9f2c1ddfbb1360d60201396c063bb06dbbdd8c1d32a03c275a3b34a42a81f969

See more details on using hashes here.

File details

Details for the file runtime_sdk-0.7.0-py3-none-manylinux_2_17_aarch64.whl.

File metadata

  • Download URL: runtime_sdk-0.7.0-py3-none-manylinux_2_17_aarch64.whl
  • Upload date:
  • Size: 43.6 MB
  • Tags: Python 3, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","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 runtime_sdk-0.7.0-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 3321a89a8bc725274fbe9060ca8c175605616881ae3e91293f1e6b22e6db9535
MD5 f0f67459ea0cf6c6828c1907b58bb7c6
BLAKE2b-256 ec4c4cb807a66975712f6f87c9520b89431475c1a07dcf7291f73f15f10df0d4

See more details on using hashes here.

File details

Details for the file runtime_sdk-0.7.0-py3-none-macosx_13_0_x86_64.whl.

File metadata

  • Download URL: runtime_sdk-0.7.0-py3-none-macosx_13_0_x86_64.whl
  • Upload date:
  • Size: 28.2 MB
  • Tags: Python 3, macOS 13.0+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","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 runtime_sdk-0.7.0-py3-none-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 2150f6989f97e444da9da0d3234176635a3b22b1237b25cb03be007ef0cb5c88
MD5 ebf7472ee86aaea1f9a98e480a631ea4
BLAKE2b-256 626f37df8fbb0806f81412daecf4f64eb7839b83d66ec9cdb08c6daee790eee7

See more details on using hashes here.

File details

Details for the file runtime_sdk-0.7.0-py3-none-macosx_13_0_arm64.whl.

File metadata

  • Download URL: runtime_sdk-0.7.0-py3-none-macosx_13_0_arm64.whl
  • Upload date:
  • Size: 25.7 MB
  • Tags: Python 3, macOS 13.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","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 runtime_sdk-0.7.0-py3-none-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 20ab19d07827ac5c75421f085bd01469d8a104199dd7b74dd60b72d8972050d8
MD5 fb42dddca9ca3aaa576accb5dfadc6b3
BLAKE2b-256 141f553ddafbce974fc38cf54a5b684ff90183704d837c486dd20a1ce607599e

See more details on using hashes here.

File details

Details for the file runtime_sdk-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: runtime_sdk-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 94.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","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 runtime_sdk-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 638070162a739f9f89c5a66830d706bb58c886102ae15a8de95521c7efeb5d40
MD5 e409fb5c5c2fcac09646da2c28366b62
BLAKE2b-256 578e380c0fa6d089c88b104a2571ec50acc7c564103c56f0f963bb0eed381e9b

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