# runtime.ovh -- Platform Skill Serverless containers via SSH. Your SSH key is your identity. No signup, no docker, no cloud console. ## Quick Start ```bash ssh myproject@runtime.ovh # spawns alpine container, drops you into a shell ssh myproject:python@runtime.ovh # python environment scp file.py myproject@runtime.ovh:/workspace/ ssh myproject@runtime.ovh "python /workspace/file.py" ``` On disconnect the container is destroyed. Files persist (IDENTIFIED/PAID tiers). ## SSH Username Format ``` workspace[~backend][:image[:flavor[+duration]]] ``` Parsed left-to-right, colon-delimited. `~` attaches a backend to the preceding segment. | Segment | Required | Default | Description | |--------------|----------|-----------|----------------------------------------------------| | `workspace` | yes | -- | Named workspace. Created on first connect | | `~backend` | no | `runtime` | Compute backend: `runtime` (k8s) or `ovh` (OVH AI)| | `:image` | no | `alpine` | Container image (locked at workspace creation) | | `:flavor` | no | `cpu` | Hardware flavor (`cpu`, `v100`, `l4`, `l40s`, `a10`, `a100`, `h100`) | | `+duration` | no | -- | Stay-alive duration after disconnect (`5m`, `1h`) | **Modifiers on workspace name:** - Append `+` to force-spawn a new container: `ssh myproject+@runtime.ovh` **Examples:** ```bash ssh myproject@runtime.ovh # alpine on runtime backend ssh myproject:python@runtime.ovh # python image ssh myproject~ovh:python:l4@runtime.ovh # python on OVH AI with L4 GPU ssh myproject:go:cpu+5m@runtime.ovh # go image, stay alive 5min after disconnect ssh myproject+@runtime.ovh # force new container (skip session reuse) ``` ## Special Usernames | Username | Purpose | |----------------|----------------------------------------------| | `cli` | Management CLI (no container spawned) | | `sudo` | Admin console (requires admin SSH key) | | `_` | Anonymous ephemeral session (no persistence) | | `session-` | Reconnect to a running session pod | ## Available Images | Image | Description | |------------|-----------------------------------| | `alpine` | Alpine Linux (default) | | `python` | Python development | | `go` | Go development | | `node` | Node.js development | | `rust` | Rust development | | `ubuntu` | Ubuntu general purpose | | `ovh` | OVHcloud CLI | | `website` | Static website server (darkhttpd) | | `react` | React app dev and serving | | `openclaw` | OpenClaw AI agent gateway | | `picoclaw` | PicoClaw AI agent | | `zeroclaw` | ZeroClaw AI agent | | `tattoy` | Shader terminal demo | | `tiny` | Minimal Alpine (bare minimum) | | `admin` | Platform admin tools | Image-specific details: `skills//SKILL.md` ## Persistence Persistence depends on tier and backend. With storage (IDENTIFIED/PAID), the init script mounts fuse-overlayfs: the container image is the read-only lower layer, JuiceFS-backed storage is the upper layer. After `pivot_root`, **all filesystem changes persist** -- installed packages, config files, everything under `/`. | Tier | Persistence | What survives sessions | |------------|-------------|---------------------------------------| | FREE | none | Nothing. Fully ephemeral | | IDENTIFIED | full | Entire rootfs (fuse-overlayfs) | | PAID | full | Entire rootfs (fuse-overlayfs) | Startup order: `RUN_COMMAND` (if set) > `/workspace/init` > `/runtime/init` > wait for SSH. ## File Transfer ```bash scp ./file.py myproject@runtime.ovh:/workspace/ scp -r ./src myproject@runtime.ovh:/workspace/ scp myproject@runtime.ovh:/workspace/output.txt ./ rsync -avz ./project/ myproject@runtime.ovh:/workspace/project/ cat data.json | ssh myproject@runtime.ovh "python process.py" ``` ## Tiers | Tier | Max Sessions | Timeout | Storage | GPU | |------------|-------------|----------|---------|-----| | FREE | 1 | 5 min | 0 | no | | IDENTIFIED | 5 | 1 hour | 100 MB | no | | PAID | 5 | 24 hours | 10 GB | yes | - **FREE**: automatic, any SSH key - **IDENTIFIED**: verify via `ssh cli@runtime.ovh acc register` - **PAID**: not yet available via CLI ## CLI Access: `ssh cli@runtime.ovh` (dashboard) or `ssh cli@runtime.ovh ` ### Top-level commands | Command | Alias | Description | |------------|-------|-------------------------------------| | `ws` | | List and manage workspaces | | `ps` | | List and manage running sessions | | `images` | `img` | Manage custom container images | | `flavors` | | List available compute flavors | | `alias` | | Manage workspace aliases | | `share` | | Share workspace access with others | | `unshare` | | Revoke shared access | | `apikeys` | `api` | Manage API keys | | `auth` | | Authorize a browser session via SSH | | `ovhai` | | OVH AI backend authentication | | `acc` | | Account & identity verification | ### Workspace commands (`ws`) ```bash ssh cli@runtime.ovh ws # list workspaces (default) ssh cli@runtime.ovh ws new mysite --image website # create workspace ssh cli@runtime.ovh ws new myapi -b ovhai -i python # create on OVH AI backend ssh cli@runtime.ovh ws start myproject # start persistent session pod ssh cli@runtime.ovh ws run myproject python train.py # run command (exits when done) ssh cli@runtime.ovh ws rm myproject # delete workspace ssh cli@runtime.ovh ws rm myproject -f # force delete (kills sessions) ssh cli@runtime.ovh ws deploy mysite --public # enable HTTP trigger ssh cli@runtime.ovh ws deploy mysite --mode ephemeral # fresh container per request ssh cli@runtime.ovh ws undeploy mysite # disable HTTP trigger ``` `ws new` options: `--backend`/`-b`, `--image`/`-i`, `--http-port`/`--port` ### Session commands (`ps`) ```bash ssh cli@runtime.ovh ps # list running sessions ssh cli@runtime.ovh ps kill session-xxx # kill a session ``` ## Deployments Deploy a workspace as a web endpoint: ```bash ssh cli@runtime.ovh ws deploy mysite --public --mode singleton ``` | Flag | Description | |--------------------|------------------------------------------| | `--public` / `-p` | No auth required for HTTP access | | `--mode singleton` | One persistent container (default) | | `--mode ephemeral` | Fresh container per request | URL: `https://.runtime.ovh` (public-id assigned at creation, e.g., `blue-jay`) Container must serve HTTP on configured port (default 8080). Deployed workspaces get 1hr default stay-alive. ## HTTP API & WebSocket - **API**: `https://api.runtime.ovh/v1` -- Auth: `Authorization: Bearer ` - **WebSocket**: `wss://ws.runtime.ovh/v1/terminal?workspace=myproject&image=python` Create API keys: `ssh cli@runtime.ovh api create mykey` ## Agent Tips 1. **Workspace = persistent identity** -- reuse the same name across sessions 2. **Image is set once** at workspace creation, cannot be changed later 3. **SSH returns exit codes** -- use them to check command success 4. **FREE = 5 min timeout** -- plan for short sessions 5. **Full rootfs persistence** on IDENTIFIED+ -- `apt install`, `pip install` survive 6. **Force new container** with `+` suffix: `ssh ws+@runtime.ovh` 7. **Reconnect to running sessions**: `ssh session-xxx@runtime.ovh` 8. **Check image SKILLs** for image-specific capabilities: `skills//SKILL.md` --- **Host**: `runtime.ovh` | **Port**: 22 | **Docs**: https://runtime.ovh/docs/ | **Image SKILLs**: `skills//SKILL.md`