All pages
Quickstart
Install the CLI, sign in, run something in a sandbox, and put a directory on a URL. Nothing here needs a Dockerfile, a YAML file, or an account with a cloud provider.
Install the CLI
One static binary, no runtime. The script picks the build for your machine and puts it on your path.
curl -fsSL https://pilots.run/install.sh | sh
If you would rather have a package manager own it, the same binary ships on npm and the package is a launcher around it.
npm install -g pilots
Sign in
pilot login opens a browser, signs you in with GitHub, and
stores an API key for this machine. It is a command you run yourself: it holds a
credential, so it is not one to hand to an agent or a script.
pilot login
pilot whoami
pilot whoami answers with the key, the fleet and the
organization every other command will act as, and where each of those came from. It is
the first thing to run when a command surprises you.
Run something in a sandbox
A sandbox is a machine. It has a shell, Node, Python and a permanent URL, it starts in well under a second because creating one is a restore rather than a boot, and it suspends by itself after 60s of quiet.
pilot machine create scratch
pilot machine exec scratch -- python3 -c "print(6 * 7)"
pilot console scratch
Creating one drops you into a console in it, and --skip-console
is how a script says not to. exec runs one command and hands back stdout,
stderr and the exit code. A console is a session that outlives its connection: detach from
it and pilot attach comes back with what was printed while you were gone.
A suspended machine costs nothing and holds no memory on any host. The next request or exec wakes it with its processes exactly where they were, and a request that arrives while it sleeps is held rather than bounced, for up to 120s.
Put a directory on a URL
In the directory of an app, one call builds it and runs it as a service. The platform reads the directory to decide what it is: a compose file, then a Dockerfile, then a framework it recognises. Writing a Dockerfile first is the reflex to resist, because it is the step being removed.
cd ./my-app
pilot deploy
plan web webjs (package.json, @webjsdev/core)
build web ok
deploy web healthy
web https://web.pilotrun.app
The URL is permanent. It survives suspend, wake, redeploy, rollback, promotion to production and a move to another host, which is the one promise everything else here is arranged around.
When it does not work
- Every error carries a
codeto branch on and anextnaming the one thing to do. Readnextand do that. The whole list is on the errors page. unknown_frameworkmeans nothing recognised the directory. The answer carries the listing, the manifests and the two rules a Dockerfile must obey, which is enough to write one without opening the repository again.health_gate_failedmeans the app never answered its health check. It is almost always the port or the bind address. Runpilot doctoron your own machine anddiagnoseon the replica before deploying again, because nothing changed and a second deploy will fail the same way.
Clean up, or do not
A sandbox you leave alone suspends and costs nothing, so there is no hurry. When you do want it gone, destroying it is irreversible and takes its checkpoints with it.
pilot status
pilot machine destroy scratch