CLI

Everything you can do in the browser, you can do from the terminal with the rezee command - 27 of them, over every surface in the workspace.

Install

One static binary per platform, with nothing to install alongside it. The script picks the right one and checks it against the release's published checksum before putting it on your PATH.

$ curl -fsSL https://rezee.app/install.sh | sh

The script picks the binary for your platform and checks it against the release's SHA256SUMS before putting it on your PATH.

Keep it current with rezee upgrade, or ask first with rezee upgrade --check.

Authentication

$ rezee auth login       # approve this machine in a browser
$ rezee auth status      # who the stored token belongs to
$ rezee auth logout      # forget it

A browser login mints a limited token - the approval page lists exactly what it may do. That covers everyday work and deliberately does not cover the commands that change who can reach what: member, invite, runner, protect, webhook, token and ssh-key need an unrestricted token from the tokens page.

$ printf %s "$TOKEN" | rezee auth login --with-token

Prefer stdin, as above: a token passed as a flag lands in your shell history and in the process list of anyone sharing the machine.

Login also offers to register rezee as git's credential helper, which is what makes git push work over HTTPS without a second credential. --git-host points clones and pushes at the git host when it is not the same as the API's.

Conventions

  • -R / --repo names a repository as <workspace>/<name>. Inside a clone it defaults to the origin, so you rarely type it.
  • -w / --workspace names a workspace. It defaults to the clone's, then to the one stored by rezee config set workspace.
  • --json on almost every command, for piping into jq.
  • Bodies, prompts, messages and secrets can all be piped in on stdin rather than quoted on the command line.
  • An issue may be written 12, #12 or WIN-12. An id may be the first few characters of one, the way the list prints it.

Exit codes: 0 worked, 1 something said no, 2 the command line was wrong, 3 not authenticated, 4 not found or not visible to this token, and 5 the thing being watched failed - a red pipeline, a failed task. 5 is separate from 1 on purpose, so a script can tell "the build broke" from "the CLI could not reach the server".

Day to day

$ rezee status                   # PR, CI, inbox and assigned issues
$ rezee inbox --unread           # what needs you
$ rezee inbox read --all
$ rezee search "retry budget"    # issues, docs, chat, PRs and code
$ rezee open                     # this branch's PR in a browser

rezee search takes --surface to narrow to some of issue, doc, chat, pull, code. A scoped token reads fewer surfaces than it asked for, and the footer says which ones it actually read.

Repositories

$ rezee repo create hello --public --clone
$ rezee repo list
$ rezee repo clone acme/hello
$ rezee repo view
$ rezee repo update --description "the thing" --visibility private
$ rezee repo topic add rust
$ rezee repo archive
$ rezee repo rename hello-again
$ rezee repo delete

Issues

$ rezee issue create "Retry budget is per-process"
$ rezee issue list --mine assigned --filter active
$ rezee issue view WIN-12
$ rezee issue update 12 --status in_progress --priority high --project Billing
$ rezee issue comment 12 --body "reproduced on staging"
$ rezee issue link 12 --kind blocks 14
$ rezee issue close 12
$ rezee issue reopen 12

rezee issue develop 12 checks out a branch named so that the issue links itself - the key anywhere in the branch name is what does it - and moves the issue to in progress unless you pass --no-start. rezee issue branch 12 prints that name without switching, for a script that wants to make its own.

Pull requests

$ rezee pr create --fill --push
$ rezee pr list --state open
$ rezee pr view                  # the one for the current branch
$ rezee pr diff --stat
$ rezee pr checkout 42
$ rezee pr comment --body "one nit inline"
$ rezee pr review --approve
$ rezee pr review --request-changes --body "the migration is missing"
$ rezee pr reviewers add alice
$ rezee pr ready
$ rezee pr merge

--fill writes the title and body from the commits on the branch; --push pushes the head branch first if the remote does not have it yet. Most commands default to the pull request for the current branch, so the number is usually optional.

Pipelines

$ rezee run list
$ rezee run watch                # follow the latest to its end
$ rezee run logs --watch         # tail the lines
$ rezee run rerun
$ rezee run cancel
$ rezee run artifacts
$ rezee run download --out ./artifacts

$ printf %s "$TOKEN" | rezee secrets set NPM_TOKEN
$ rezee secrets list
$ rezee secrets rm NPM_TOKEN
$ rezee secrets rotate

See Pipelines for the file these run, and the actions.yml reference for its schema.

Agents and tasks

$ rezee agent list
$ rezee task create reviewer "review the auth refactor"
$ rezee task list --state awaiting_review
$ rezee task view <id>
$ rezee task watch
$ rezee task approve <id>
$ rezee task reject <id>

The prompt can be piped: git diff | rezee task create reviewer --prompt "review this change". And rezee mcp serves the workspace's tools to an MCP client over stdio - see MCP.

Chat

$ rezee chat channels
$ echo "deploying" | rezee chat send general
$ rezee chat send general --thread <id> --body "and it's green"
$ rezee chat schedule general "standup in 10" --at "tomorrow 9am"
$ rezee chat scheduled
$ rezee chat reschedule <id> --at +2h
$ rezee chat send-now <id>
$ rezee chat cancel <id>

--at takes what you would say out loud, in your own timezone: 9am, 17:30, +2h, in 90m, tomorrow, monday, next friday 17:00, 2026-08-24 09:00, or a full ISO timestamp.

Planning

$ rezee project list
$ rezee project view Billing
$ rezee project create Billing --status in_progress --target "next friday"
$ rezee project edit Billing --status done
$ rezee project repo add Billing acme/api

$ rezee cycle list
$ rezee cycle list --project Billing
$ rezee cycle create --project Billing --name "Sprint 12" --from monday --to "+2w"
$ rezee cycle edit 12 --project Billing --to friday
$ rezee cycle cadence set --project Billing --every 2w --starting monday --name "Sprint {n}"

$ rezee label list
$ rezee label create bug --color "#e5484d"
$ rezee label add bug WIN-12
$ rezee label remove bug WIN-12

$ rezee team list
$ rezee team view Platform
$ rezee team create Platform --description "services and the pipeline"
$ rezee team add Platform ada
$ rezee issue list --team Platform
$ rezee issue update 12 --team Platform

Releases

$ rezee release create v1.4.0 --target master --notes "$(cat CHANGELOG.md)"
$ rezee release list
$ rezee release view v1.4.0
$ rezee release delete v1.4.0

Deleting takes the notes and leaves the git tag. A tag somebody has already fetched is not ours to retract.

Administration

These need an unrestricted token - see Authentication above.

$ rezee member list
$ rezee member add alice --role admin
$ rezee member repo add bob --role write

$ rezee invite create alice@example.com --role member
$ rezee invite list
$ rezee invite revoke <id>

$ rezee protect add master --require-pr --approvals 1 --checks test,lint
$ rezee protect list
$ rezee protect remove master

$ rezee webhook add https://example.com/hooks/rezee \
    --secret "$SECRET" --events all
$ rezee webhook list
$ rezee webhook remove <id>

$ rezee runner list
$ rezee runner remove builder-1

A protection rule with no flags requires nothing - it is a rule that says the branch exists, which is rarely what somebody means. --require-pr is the usual start. A webhook secret is write-only: shown once, never returned.

There is no rezee runner register - dedicated capacity is set up with us, and revoking one is what stays yours. See runners and CI minutes.

Your account

$ rezee ssh-key add                    # finds ~/.ssh/id_ed25519.pub
$ rezee ssh-key list
$ rezee ssh-key remove <id>

$ rezee token create ci --expires 90
$ rezee token list
$ rezee token revoke <id>

ssh-key add only ever reads the .pub half. A file without that suffix is refused rather than uploaded, because the other half is the one that must not travel.

A token is printed exactly once and stored as a hash. Pipe it somewhere useful rather than reading it off the screen: rezee token create ci --json | jq -r .token.

The CLI itself

$ rezee config set workspace acme      # default outside a clone
$ rezee config list
$ rezee completion zsh                 # bash, zsh, or fish
$ rezee upgrade --check
# bash
source <(rezee completion bash)
# zsh
source <(rezee completion zsh)
# fish
rezee completion fish | source

Every command prints its own usage with --help, and it is the same text this page is written from. New to Rezee? Start with the Quickstart.