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.
Usage
# Auth
runtime # open the interactive dashboard; sign in first if needed
runtime login # WorkOS device login; opens the verification page
runtime login --no-open # print the URL and code for a browserless host
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 # open the computer dashboard in a terminal
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
# Use runtime exec for automation and exact exit codes; 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_...")
# 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"])
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 githubagain 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_SECRETon the Runtime API. In GitHub App settings, enable user authorization during installation and set the callback URL tohttps://api.runruntime.dev/github/callback. runtime switchopens an existing branch workspace, or creates the computer if the branch exists but the workspace does not yet.runtime switch -ccreates a new branch first, then opens that branch's workspace.- Each
repo + branchmaps 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 forruntime 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 wheel 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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file runtime_sdk-0.4.49-py3-none-win_arm64.whl.
File metadata
- Download URL: runtime_sdk-0.4.49-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.29 {"installer":{"name":"uv","version":"0.11.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aaf06f53059e81a9dca03d4a17ef7bb6b7496384c09d46749b9616416b0c1de9
|
|
| MD5 |
e5dd0101d67df04022e61ed16b06ad5f
|
|
| BLAKE2b-256 |
e54890a33563fdeea5c6b5f8143c6c4e013fb4c7012dd753303afb7d87112d80
|
File details
Details for the file runtime_sdk-0.4.49-py3-none-win_amd64.whl.
File metadata
- Download URL: runtime_sdk-0.4.49-py3-none-win_amd64.whl
- Upload date:
- Size: 39.7 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0029e44f25e23d65e5212f849e320092bae6f39f53608e0e7af53ee2a35d5958
|
|
| MD5 |
bc9cd13c7f6fe4717973db246cbf2af3
|
|
| BLAKE2b-256 |
b686a3be1e972b396585ba9d0fb41b5e86a7e4bcbc65e643570c2d905cf29135
|
File details
Details for the file runtime_sdk-0.4.49-py3-none-manylinux_2_17_x86_64.whl.
File metadata
- Download URL: runtime_sdk-0.4.49-py3-none-manylinux_2_17_x86_64.whl
- Upload date:
- Size: 43.6 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3be12c9aedab9d4ea68b736d1d8255fd0d2c5cbe0aae08411806db9f65328293
|
|
| MD5 |
c07dc084c075f71a036955bd4dfc6ddc
|
|
| BLAKE2b-256 |
1dfc822a34600159edca200d91d478c1bebb431956cd50fb48527ea59d572b86
|
File details
Details for the file runtime_sdk-0.4.49-py3-none-manylinux_2_17_aarch64.whl.
File metadata
- Download URL: runtime_sdk-0.4.49-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.29 {"installer":{"name":"uv","version":"0.11.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7b9e42957642d959d0c8cbb834b2f0624991c76dc086d7006a6bc5ffe64a4a73
|
|
| MD5 |
dfa72b7505412422535cd891e891de97
|
|
| BLAKE2b-256 |
4d2b29da825b83f5a62cbdebaa0d8e9d717f6405aee971ad29be39aea1b648c1
|
File details
Details for the file runtime_sdk-0.4.49-py3-none-macosx_13_0_x86_64.whl.
File metadata
- Download URL: runtime_sdk-0.4.49-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.29 {"installer":{"name":"uv","version":"0.11.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1875449570b16f7413a63d4ff7e17492cfbf635400723126ffa1e4294bc3e929
|
|
| MD5 |
3705e449c0354a90adb54f9b3cd3a113
|
|
| BLAKE2b-256 |
575deb6671fb88bf09e862aa3d7d275f51c448cd913a053451a8358b0ddb5404
|
File details
Details for the file runtime_sdk-0.4.49-py3-none-macosx_13_0_arm64.whl.
File metadata
- Download URL: runtime_sdk-0.4.49-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.29 {"installer":{"name":"uv","version":"0.11.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fca2104ad2ba419375021e1b504b7e116326877d5cab28044cabb29662b82af3
|
|
| MD5 |
e32bfe837a823963970a984f3749d441
|
|
| BLAKE2b-256 |
a8abc17a1fdcc69e292f6144fef955bed31fbaefc28229e741093dc9373481ea
|
File details
Details for the file runtime_sdk-0.4.49-py3-none-any.whl.
File metadata
- Download URL: runtime_sdk-0.4.49-py3-none-any.whl
- Upload date:
- Size: 58.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
354411ceab5938b1a9861145c7694cdef5d81f46b6bfc1a778fff5d757bf895e
|
|
| MD5 |
f11c2873fd630ab1b1c20042ea0b29ab
|
|
| BLAKE2b-256 |
5e9878735e1c4322d126171f8c0309274a2febcba6786f7022a5a7a173c5b973
|