The CLI never asks for your password and never asks you to copy an API key.
Approving in the browser creates the credential, stores it in a file only your
user account can read, and you revoke it from Settings whenever you want.
Before you start
A terminal, and nothing else
The standalone build needs no Node and no Python. If you would rather use a
package manager you already have,
pip and npm install the same client.A role that can deploy
Connecting a terminal grants package downloads, so it needs a role in the
workspace that can deploy. A viewer sees an explanation instead of an
Approve button.
Install
Three ways in. They install the same client, so pick whichever matches the machine you are standing on.- No Node, no Python
- Python
- Node
Whichever you choose, the CLI tells you when a newer version is out. It reads
that from a response header on a request it was already making, so it never
phones home, and it never updates itself. It prints the one command to run,
correct for how you installed it.
The happy path
1
Connect the terminal
2
Approve it in your browser
Open the URL on any device where you are signed in to RunInfra and type the
code. You will see the account, the workspace, the terminal that asked
(shown as Access lasts 90 days unless you revoke it sooner.
user@host), the code you typed, and the single thing it grants:
downloading optimized model packages the workspace already owns.Press Approve. The browser confirms, and the terminal continues on its
own:3
Pull the package
MODEL=$(runinfra pull qwen3-6-27b) captures the path and nothing else.--concurrency N (1 to 16, default 8) to tune parallel connections, and
--out DIR to choose the destination. Without --out the file lands in the
current directory.
On a headless GPU host
Nothing changes. The CLI does not try to open a browser over SSH, in CI, or on a machine with no graphical display, so it goes straight to the code and tells you why:runinfra login --device forces this path from any machine.
Check what a machine is holding
Verify the CLI you downloaded
The installers already do this for you and refuse to install anything that does not check out. This section is for when you want to confirm it yourself, or when your policy requires a signature on anything that reaches a production host. Every release publishesSHA256SUMS alongside the executables, and
SHA256SUMS.sig, an Ed25519 signature over those checksums.
A key you downloaded from the same place as the file it verifies proves
nothing on its own, because whoever replaced one could replace both. That
fingerprint is also pinned inside
install.sh and published on the
npm page, neither of which
serves the binaries./usr/bin/openssl is LibreSSL and has no -rawin, so the command
above needs a real OpenSSL, for example brew install openssl@3. Windows
PowerShell has no built-in Ed25519 at all, so install.ps1 verifies the
checksum and tells you the signature was not checked rather than pretending
otherwise.
Revoke a terminal
Two different actions, and it matters which one you need.End a terminal's access for good
End a terminal's access for good
Open Settings, API keys in the dashboard. Every terminal you connected
is listed as This is what to use for a lost laptop, a decommissioned GPU host, or a
contractor who is finished. Revocation applies to the next request. A
download URL already handed out stays usable for up to 30 minutes, so
revoking stops new downloads rather than reaching into a transfer already in
flight.
RunInfra CLI: user@host, with when it was created and when it
was last used. Revoke the row.The next command that terminal runs is refused:Sign out of the machine in front of you
Sign out of the machine in front of you
When a download is interrupted
Run the same command again. That is the whole procedure. The CLI keeps the bytes it already has and continues from there.<name>.part holds the bytes, and <name>.part.json records which parts are
safely written. Both disappear when the download finishes. The finished file only
ever appears under its real name once the bytes are complete and verified, so
anything watching that directory can never pick up a half-downloaded package.
It says it is starting over instead of resuming
It says it is starting over instead of resuming
The CLI restarts rather than resuming in three cases, and prints which one
applies:
- The resume record is missing or unreadable. The partial file is preallocated to the full size, so its length says nothing about which bytes are real. Guessing would produce a file that fails its checksum hours later.
- The package was republished while you were downloading. Continuing would mix two versions into one file.
- A file with the final name already exists at a different size. Nothing is
overwritten. Move it, or pass a different
--out.
The checksum did not match
The checksum did not match
.part file and pull again. If
it happens twice on the same package, contact support with the slug.It stopped before downloading anything
It stopped before downloading anything
Free space is checked before the first byte is written, against what is left
to fetch plus a small margin:Free space or point
--out at a larger volume. Anything already downloaded
is still there.It says the workspace does not own the package
It says the workspace does not own the package
runinfra whoami prints the workspace id.It says access expired
It says access expired
A connected terminal lasts 90 days. Run
runinfra login again to reconnect
it. Downloads you already completed are unaffected.