The command line guide

Ship with rls.

Install the CLI, then publish your first release:

rls login
rls project create "Grove"
rls push 1.0.0 grove.tar.gz

Run rls --help or rls COMMAND --help for the full set of flags.

Run rls --version to check your installed version. If the server no longer supports it, API commands stop with a message asking you to update to a supported version.

Install

Install rls on macOS, Linux, or Windows.

terminal

INSTALL THE CLI

$ curl -fsSL 'https://release.camp/rls/latest/install.sh' | sh
PS> irm 'https://release.camp/rls/latest/install.ps1' | iex

Project setup

rls project create writes rls.yml in the current directory. Commands look for rls.yml or rls.yaml here or in a parent directory.

project: grove

Use --project SLUG to select another project for push, yank, open, and project management commands.

Log in

Open the dashboard in your browser and approve CLI access. The CLI saves your key in your system keychain.

rls login
rls login --no-browser

Use --no-browser on SSH sessions to print the approval URL and open it on another device. The CLI waits for approval and tells you to retry if the request times out.

Shell completion

Command help includes examples. Enable completion for flags, visibility, member roles, project slugs, and channels:

# Bash
source <(rls completion bash)

# Zsh
autoload -Uz compinit
compinit
source <(rls completion zsh)

# Fish
rls completion fish | source

# PowerShell
rls completion powershell | Out-String | Invoke-Expression

Add the setup for your shell to its startup file to keep completion enabled. Project and channel lookups use your saved key or RG_API_KEY, with a one-second request timeout. Offline, the CLI can suggest the local project and the stable channel.

Output and scripting

Inspection commands print aligned tables or details to stdout. Add --json to me, status, all list commands, or license get for JSON:

rls project list --json
rls release list --project grove --json
rls status --json
rls license get LICENSE_ID --json

JSON lists include every page and return [] when empty. Status includes config_path, which is null when --project overrides the local config. Inspection output never includes complete API or license keys.

Progress, confirmations, and prompts go to stderr. Release URLs and newly created keys go to stdout; keep files containing keys secure.

rls push 1.2.0 ./dist/grove.tar.gz >release-url.txt

Me

Print the email address for your current CLI key.

rls me

Log out

Revoke your saved CLI key and remove it from your keychain.

rls logout

Create a project

Create a project and write its slug to rls.yml in the current directory.

rls project create "Grove"
rls project create "Grove" --visibility private --slug grove

Visibility defaults to public. Private projects require Plus. Omit --slug to generate one from the name; an explicit slug must be available.

Connect a project

Write rls.yml for an existing project in the current directory. Refuses to overwrite rls.yml or rls.yaml. Runs without login or network access; project access is checked when you use the API.

rls init --project grove

Project status

Show the selected project, config path, visibility, and each channel's current non-yanked release. Works with public and private projects you can access.

rls status
rls status --project grove

--project overrides the local config. Status uses your account or project automation key.

Browse projects and releases

rls project list
rls release list
rls channel list
rls release list --project grove
rls channel list --project grove

Lists use aligned tables and fetch every page automatically. Projects are sorted by slug and show your role. Releases appear newest first, including yanked releases, with their current channel targets and publish dates in UTC.

Release and channel lists use the local config unless you pass --project. Account keys list owned and joined projects; automation keys list only their project.

Rename a project

Change the project's display name. Its slug and links stay the same.

rls project rename "New Name"

Change a slug

Change the slug used in project URLs. The CLI updates the nearest rls.yml or rls.yaml if its project field directly contains the old slug. Update configs in other checkouts, or those using YAML anchors or merges, yourself.

rls project slug new-slug

Set visibility

Projects are public by default. Plus accounts can make project pages and downloads private.

rls project visibility public
rls project visibility private

Delete a project

Delete the project and all its releases. The CLI asks for confirmation.

rls project delete

Open the dashboard

Open the current project's dashboard page in your browser.

rls open

Create a project key

Owners can create keys to publish releases and manage licenses. Keys expire after 30 days and are shown once. Save the key.

rls project key create --name "CI"

List project keys

List active keys with their IDs, labels, prefixes, and expiration dates.

rls project key list

Revoke a project key

Immediately stop a key from working. The CLI asks for confirmation unless you pass --yes.

rls project key revoke KEY_ID

List members

Owners and members can list the people with access to the project and their roles. Owners manage everything; contributors publish and yank releases; support members issue, inspect, and revoke licenses.

rls project member list

Change a member's role

Owners can switch an existing member between contributor and support.

rls project member role MEMBER_ID support

Remove a member

Owners can remove a member by the ID shown in the member list. The CLI asks for confirmation unless you pass --yes.

rls project member remove MEMBER_ID

Leave a project

Members can leave a project they do not own.

rls project member leave

Invite a member

Owners can email an invitation to a collaborator. Choose contributor or support; contributor is the default. The invitation expires after seven days.

rls project invite create [email protected] --role support

List invitations

List pending invitations and their IDs and expiration dates.

rls project invite list

Cancel an invitation

Owners can cancel a pending invitation by its ID.

rls project invite cancel INVITATION_ID

Accept an invitation

Sign in with the invited account, then paste the token from the invitation link when prompted.

rls project invite accept

Push a release

Pass a version first, followed by one or more file paths. Use SemVer, CalVer, or your own version labels.

rls push 1.0.0 grove.tar.gz grove.zip
rls push 2026.10.01 grove.dmg
rls push build-1842 grove.exe

Versions are case-sensitive and must be unique within a project. Use 1–1,024 ASCII characters, starting with a letter or digit. Letters, digits, dots, underscores, hyphens, and plus signs are allowed. latest and changelog are reserved.

The files are published together as one release. Any file format is supported. The CLI waits for publication, then prints the release page URL.

rls push 1.2.0 ./dist/* --dry-run

Preview the project, channel, files and sizes, selected release notes, and installer targets. Dry runs work offline without login and validate local files and installer archives. Project access, version availability, and account limits are checked when publishing.

If upload capacity is full, the CLI waits and retries for up to two hours and one minute. CI gets plain status lines. Upload or publication failures exit with a nonzero status. Connection errors are not retried automatically; check the dashboard before repeating an interrupted push.

Release channels

Pushes use the stable channel by default. Publish to another channel, then promote the same release without uploading its files again.

The most recent publish or promotion to a channel becomes its latest release. Version labels are not compared or sorted to choose it.

rls push 1.1.0-beta.1 grove.tar.gz --channel beta
rls promote 1.1.0-beta.1 --channel stable

Promotion keeps the source assignment. Use --from beta to move it atomically, or remove the beta assignment later:

rls promote 1.1.0-beta.1 --from beta --to stable
rls channel remove 1.1.0-beta.1 --channel beta

latest uses stable unless you select another channel, such as /api/projects/grove/releases/latest/files/grove.tar.gz?channel=beta. Removing a channel assignment does not withdraw the version or its files.

Yank a release

Withdraw a version and block its downloads. The version stays reserved and cannot be published again.

rls yank 1.0.0

Create a license

Grant access to a private project’s releases without a release.garden account. Requires an owner or support account key, or a project automation key. Save the key and send it to your customer; it is printed once.

rls license create "Order #1842" \
  --updates-until 2027-10-04 \
  --metadata '{"stripe_checkout_session":"cs_123"}' \
  --idempotency-key stripe:checkout-session:cs_123

--project SLUG overrides rls.yml. --updates-until accepts YYYY-MM-DD or an RFC 3339 timestamp; omit it for lifetime updates. A date includes the entire UTC day: 2027-10-04 sets the cutoff to 2027-10-04T23:59:59.999999Z. RFC 3339 timestamps keep their exact cutoff. --metadata accepts a JSON object up to 4 KiB. Use --idempotency-key to retry without issuing another license.

List licenses

List the project's licenses, newest first. Complete keys are never shown again after creation.

rls license list

Show a license

Show a single license's name, status, update entitlement, and metadata.

rls license get LICENSE_ID

Revoke a license

Immediately and permanently revoke access, including downloads and unlocked browser sessions. The CLI asks for confirmation unless you pass --yes.

rls license revoke LICENSE_ID

See license access, retries, and browser unlock.

Release notes

Pass a Markdown file with --notes, or add a matching version heading to CHANGELOG.md. The CLI uses that section automatically when you push.

rls push 1.0.0 grove.tar.gz --notes notes.md

For a different changelog location, set changelog in your project config. Relative paths start at the config file's directory.

project: grove
changelog: changelogs/CLI-CHANGELOG.md

Override it with --changelog PATH, relative to the current directory. --notes takes priority over both. A selected changelog must exist and contain a nonempty section matching the pushed version.

rls push 1.0.0 grove.tar.gz --changelog changelogs/CLI-CHANGELOG.md

Installers

Add install targets to rls.yml to generate install scripts with a release. Each target's file must be part of the push.

project: grove
install:
  targets:
    - os: linux
      arch: amd64
      file: grove-linux-amd64.tar.gz
      executables:
        grove: bin/grove
        grove-admin: bin/grove-admin

Map each command name to its path inside the archive. The installer installs every configured command; other files stay in the archive. Use .tar.gz for Linux and macOS, or .zip with matching .exe files for Windows. Command names omit .exe; Windows installers add it.

All configured executables are checked before installation. Install targets reserve install.sh and install.ps1 for generated scripts.

Signing & verification

Fetch a release’s signature bundle for independent verification. See the API reference:

curl https://release.garden/api/projects/SLUG/releases/1.0.0/signature

The bundle includes the file manifest, publisher signature, and signed release.garden attestation. Verify the attestation with the current or historical signing key:

curl https://release.garden/api/signing-keys

Both endpoints are public and unauthenticated. A release's public page also shows whether it's signed.

Automation

Create an automation key in the project dashboard and set RG_API_KEY in your CI environment. It can publish and manage releases for that project.

Use it with rls license to issue and revoke customer licenses for private projects.