Skip to main content

runtime-sdk

Python SDK and CLI for Runtime.

Install

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

The interactive dashboard requires macOS 13+ or 64-bit Linux with glibc 2.17+ or musl 1.2+. On older macOS/Linux environments, the universal wheel keeps scriptable subcommands available, but bare runtime cannot open the OpenTUI dashboard.

Windows is not supported at this time.

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                          # first run in a real terminal prompts for email + verification code, then creates your first computer
runtime login                    # interactive email + verification code flow
runtime login you@example.com
runtime verify 123456
runtime whoami
runtime logout
runtime login --api-key rt_live_...
runtime api-keys list
runtime api-keys create "my laptop"
runtime api-keys revoke 123
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 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
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           # promote the running app on port 3000 to the public durable app
runtime delete <id>

# Inside a running computer, the helper installed by Runtime can manage the
# durable app without leaving the sandbox:
#   runtime-env publish 3000
#   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", api_key="rt_live_...")

# 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,
)

# 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> can promote a running listener into the saved public app definition by inspecting the live process. Inside a running computer, runtime-env publish <port> 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 scripts.tests.test_runtime_sdk

Release

Preview the next release without changing files:

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

Publish a patch release:

./scripts/release_runtime_sdk.sh --publish

Publish a different version bump:

./scripts/release_runtime_sdk.sh --bump minor --publish

The script loads backend/.env automatically, so UV_PUBLISH_TOKEN can live there.

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.4.44-py3-none-musllinux_1_2_x86_64.whl (42.4 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

runtime_sdk-0.4.44-py3-none-musllinux_1_2_aarch64.whl (42.2 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

runtime_sdk-0.4.44-py3-none-manylinux_2_17_x86_64.whl (43.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 13.0+ x86-64

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

Uploaded Python 3macOS 13.0+ ARM64

runtime_sdk-0.4.44-py3-none-any.whl (41.2 kB view details)

Uploaded Python 3

File details

Details for the file runtime_sdk-0.4.44-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for runtime_sdk-0.4.44-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c43d437d976466173fb5d6aed3787ee97692b1f8b06348827d069a00a321981d
MD5 fe829e34af709c9b79997fd1a613cc65
BLAKE2b-256 1c814ebdc183f8b4d145fe54064b81841aed2f0f7b40495ed62f1eb8f5c2c35d

See more details on using hashes here.

File details

Details for the file runtime_sdk-0.4.44-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for runtime_sdk-0.4.44-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9e9e4d8c344a0e3053e61bf79a3471e0bde907efda7075b0430b85834d9bc80c
MD5 080627dd1625b4ed64582b1bff7595a8
BLAKE2b-256 4ff62d7f3425920e890baa9f35a53e3a70574889d23a672f38ad472a60b75c9f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for runtime_sdk-0.4.44-py3-none-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 e3443b898e934bb33693c0fcc71bc4956e506629682d054927ca2097b05a26ea
MD5 1cbf42ff9484d367983d1ae155f8b22f
BLAKE2b-256 44a9bf4c2544048a47e15493a02c7b6bd31d6e4e21b91d6c1e4de3dc0598405a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for runtime_sdk-0.4.44-py3-none-manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 631bf6f39505d9710c5872c58b2a5bb6263a9eadfeebd14760e130b94bc49c29
MD5 488977985c4e064dd5014f34f57825ae
BLAKE2b-256 7d393b84d5a4ca0b958415f204fc4a409d3ac983c934f91d0737f013735ce33c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for runtime_sdk-0.4.44-py3-none-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 aff8c2ff47f4f5fcf9cc285b64cabe3347f8e4cb99021db7504238c5769beab4
MD5 8c0ef9a0a0543606b27c6e8b79cb9d9e
BLAKE2b-256 460a834a118808dda5631e240bc2a13afbdd690ecb5d42d677cc062b0e061a1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for runtime_sdk-0.4.44-py3-none-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 d13234e31762bc9f822a9c441489cb4f63d6f01af9ad1be731e49266cd414333
MD5 26b22f6b68d5a9a6169aeb3cc7c2611c
BLAKE2b-256 d77b89494da53af832d3c4f6259008839545698b0c0f79230fb5b1ac0e689e86

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for runtime_sdk-0.4.44-py3-none-any.whl
Algorithm Hash digest
SHA256 7be47066c227f1cbef157185db099ba10270e272a3aa3c79f572f3067481e15a
MD5 c99484cbdd3b7ffbb29eec6406746d52
BLAKE2b-256 24ee3711e08a5ceab615d0cdd531735c0d16323786109ca155c4ddfad27de0e3

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