All documentation
Automation

CLI

A terminal client for deploys, environment files, and logs.

You cannot install the CLI yet

The install command below has nothing to download yet. To script Provisore today, use the REST API or a deploy hook. Do not install a provisore command from anywhere else. There is no Homebrew tap and no provisore/deploy-action GitHub Action, so anything published under those names comes from someone else.

Install

curl -fsSL https://provisore.com/install.sh | sh

The script installs one binary into ~/.local/bin and needs no privileges. It checks the download against a published SHA-256 before unpacking it, and refuses an archive whose checksum does not match. macOS builds are universal, so Apple silicon and Intel use the same file.

Set PROVISORE_INSTALL_DIR to install somewhere else, or PROVISORE_VERSION to pin a version instead of taking the newest.

Linux images this runs on

The Linux build needs a glibc userland with libcurl. Debian, Ubuntu, and the language images built on them work. Alpine and distroless images do not.

Sign in

provisore login

login opens the page that creates a personal access token and waits for you to paste it. It also prints the address, so you can reach it from an SSH session, where the browser would open on the wrong machine. Pass --no-browser to only print it.

The CLI writes the token to its credential file with mode 0600 and never echoes, logs, or prints it. provisore whoami shows who you are and which team you are in.

Everyday use

provisore sites list
provisore deploy bilero.dk --follow
provisore logs bilero.dk --source nginx_error --lines 200
provisore logs bilero.dk --follow
provisore jobs list --status failed
provisore jobs show 2446549d

--follow keeps a log open and prints lines as they are written, for a bounded time. The server ends the stream on an idle timeout or a total-duration cap, and says which.

On a site that requires passing checks, deploy exits with a conflict while the branch head’s checks have not passed. --override-checks deploys it anyway, recorded against you.

Every change runs as a job, so jobs shows what failed while nobody was watching. jobs show prints the failing step, the attempt count, and the recorded error.

provisore run executes a command on a server and exits with its exit code. provisore ssh hands off to your own client. Run provisore --help for the full list, and provisore <command> --help for one command's flags.

In a repository

A .provisore.yml at the root pins a checkout to a site, so provisore deploy works bare inside it.

site: bilero.dk
team: Acme
env_file: .env.production

team is a pin, not a selector, and never switches teams. If the token belongs to a different team, the CLI refuses to continue, for reads as well as writes, so a script aimed at production cannot report on staging by mistake.

Never put a token in the file

Everyone with a checkout can read the file. The CLI refuses a token key outright rather than ignoring it. Pass the token in PROVISORE_TOKEN instead.

In CI

Set PROVISORE_TOKEN and skip login. Every command takes --json for machine-readable output on stdout, and errors go to stderr, so the two never mix in a pipeline.

export PROVISORE_TOKEN=pvs_…
provisore deploy bilero.dk --follow || echo "deploy failed with $?"

Exit codes are stable and specific, so a script can tell a broken deploy from a bad token. 0 success · 1 the operation failed · 3 not authenticated · 4 missing token scope · 5 not found · 6 refused because of state · 7 network · 8 local configuration · 9 aborted · 64 usage.

PROVISORE_API_URL and PROVISORE_TEAM follow the same precedence: the flag (--api-url, --team) first, then the environment, then .provisore.yml. PROVISORE_SITE does the same for the site, which is an argument rather than a flag.

Shell completion

provisore completions zsh > ~/.zsh/completions/_provisore

Completions exist for zsh, bash, and fish. Generate them again after upgrading, because a completion script knows only the commands and flags that existed when it was generated.