Skip to main content
The default SSH flow is certificate-backed relay access:
The CLI creates or reuses a local key under ~/.nullspace/ssh/, asks the API for a short-lived OpenSSH user certificate for that public key, writes the certificate locally, and runs your local ssh client against the Nullspace SSH relay. API credentials can mint access, but relay login still requires private key proof of possession. When the API returns relay host-key metadata, the CLI writes a pinned known_hosts entry under ~/.nullspace/ssh/ and asks OpenSSH to verify that host key.
Treat SSH certificates, access IDs, and generated commands as sensitive. They expire quickly, but they should not be pasted into logs, issue trackers, or browser-visible application state.

When to use SSH

Use SSH when a tool expects a real OpenSSH transport, when you want an interactive shell outside the SDK, or when you need multiplexed SSH channels. For programmatic commands and file transfer, prefer machine.commands, the Files API, and upload/download URLs. The relay does not expose password login or SFTP.

Quickstart

1

Install the CLI and OpenSSH

The CLI handles local key creation, certificate storage, and host-key pinning. You do not need websocat for the default relay flow.
2

Create a machine

Certificate-backed SSH access works with the normal machine runtime. You do not need to start an OpenSSH daemon inside the machine.
3

Connect with OpenSSH

Remote command exit codes propagate through the local ssh process, so shell scripts can treat the command like any other SSH target.
4

Inspect the generated command

Use this when another tool needs the exact ssh command. The command includes a short-lived certificate path and relay endpoint.

Mint access for a public key

Use the SDK, CLI, or HTTP API when application code needs to mint access for a caller-supplied public key. The TypeScript SDK does not expose an SSH-access helper.

Supported behavior

Troubleshooting

Legacy signed WebSocket fallback

Older deployments may expose SSH through a signed public port-22 websocket_url with websocat in the OpenSSH ProxyCommand. That URL is a bearer credential and is not the default product SSH flow. Prefer nullspace ssh whenever the relay is available.