Install
Install rls on macOS, Linux, or Windows.
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
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.