Connecting & privacy
Two ways to reach a box over SSH and over HTTP — gateway-terminated, or end-to-end.
Every box is reachable two ways, and both the SSH and the HTTP front doors offer the same choice: let the gateway terminate your session (it sees the plaintext, can render the menu, audit, and proxy you in with its own key), or run a pass-through tunnel where the gateway only shuttles ciphertext and your client talks to the box directly. Pick by how much you trust the gateway.
SSH
| Gateway mode (default) | End-to-end jump | |
|---|---|---|
| Command | ssh box@krillbox.gra.ke2.cloud.ovh.net | ssh -J krillbox.gra.ke2.cloud.ovh.net root@box |
| Who terminates SSH | Gateway, then proxies to the box's sshd | Your client ↔ the box (raw relay) |
| What the gateway sees | Plaintext (menu / CLI / keystroke audit) | Ciphertext only — it never authenticates to the box |
| Auth to the box | Gateway's per-workspace proxy key | Your own key, injected at launch |
| Default box class | Standard | Confidential by default (privacy is the point) |
Gateway mode is the friendly default: you get the interactive box
picker, on-demand spawn/wake, and the in-band CLI (ssh cli@krillbox.gra.ke2.cloud.ovh.net …). The
gateway holds an inner SSH session to the box on your behalf.
# default — gateway terminates and proxies you in
ssh box@krillbox.gra.ke2.cloud.ovh.net
# end-to-end — gateway is a dumb jump host, your client meets the box's sshd
ssh -J krillbox.gra.ke2.cloud.ovh.net root@mybox
# pin an image / lifetime on the jump target
ssh -J krillbox.gra.ke2.cloud.ovh.net root@mybox+1h:debian-default
-J path the gateway performs a raw TCP relay
(direct-tcpip) and never holds a key to your box, so it cannot read or replay your session.
A box left unpinned on this path is provisioned confidential; pin an image
(root@box:debian-default) or use the gateway endpoint for a standard box.HTTP
| Gateway mode | CONNECT proxy | |
|---|---|---|
| Endpoint | /ws/<box> (WebSocket PTY), /exec | HTTP CONNECT tunnel (proxy port) |
| Who terminates TLS | Gateway, renders a browser terminal | Your client ↔ the box (box-direct TLS) |
| What the gateway sees | Plaintext PTY stream | Ciphertext only — it just tunnels bytes |
| Use it for | The in-browser terminal on the landing page | Driving a box programmatically / privately over HTTP |
The WebSocket and /exec endpoints are the HTTP twins of SSH gateway mode — the
gateway terminates, runs the inner SSH, and streams you a PTY. The CONNECT
proxy is the HTTP twin of the -J jump: a tunnel the gateway opens to the box and
then stays out of, so the TLS is end-to-end.
# browser terminal (gateway-terminated PTY over WebSocket)
wss://krillbox.gra.ke2.cloud.ovh.net/ws/mybox
# HTTP CONNECT tunnel to a box, box-direct TLS (gateway only shuttles bytes)
curl -x https://krillbox.gra.ke2.cloud.ovh.net:8081 https://mybox.internal/
Running a command: POST /exec/{box}
For one-shot commands there's POST /exec/<box> (Bearer api-key). The
request body is a JSON header line {cmd, args, env, image, flavor, stay_alive}
followed by a newline and optional raw stdin. Streaming SSE is the default
(event: stdout/stderr base64 frames + a final event: exit);
?stream=false returns a buffered JSON envelope
{exit_code, signal, stdout, stderr, duration_ms}.
printf '{"cmd":"echo hi; exit 7"}\n' | curl -sN \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/x-runtime-exec" \
--data-binary @- https://krillbox.gra.ke2.cloud.ovh.net/exec/mybox?stream=false