Docs / Reference
CLI
Every reliquary command and option, with exit codes, environment variables and the project file.
Install: npm install -g @reliquary-ai/cli (Node 20 or later), or prefix every command with npx @reliquary-ai/cli. How to use it day to day: Use the CLI.
Help
The CLI's own help, generated from its source:
reliquary: a vault's environment variables on this computer
Usage:
reliquary login [--no-browser] sign in with your browser
reliquary logout revoke this computer's sign-in and forget it
reliquary vaults the vaults and environments you can read
reliquary run [--vault V] [--env E] -- <command> [args...]
run a command with the variables in its environment
reliquary env pull [--vault V] [--env E] [--file .env] [--outside-repo]
write them to a file git ignores (mode 600)
reliquary env push [--vault V] [--env E] [--file .env] [--wait [--timeout 15m]]
send a .env's values for a person to apply
in the web UI (nothing is set until then)
Options:
--server <url> the Reliquary server (else RELIQUARY_URL, else "server" in
.reliquary.json, else https://app.reliquary.redmage.cc)
--vault <v> a vault's name or id (else "vault" in .reliquary.json;
not needed if you can reach only one)
--env <e> development (the default), preview or production
(else "environment" in .reliquary.json)
--file <path> env pull's or push's file (default .env)
--wait env push: wait until a person applies or rejects it
--timeout <t> env push --wait: how long, like 90s, 15m or 2h (default 15m)
--outside-repo env pull: allow a file outside any git repository
--no-browser login: print the link without opening a browser
-h, --help this help
-v, --version the version
Values are never printed. Sign-ins are kept in the OS keychain when there is
one (macOS Keychain, Secret Service, Windows DPAPI), else in
~/.config/reliquary/credentials.json (mode 600); RELIQUARY_CREDENTIALS=file or keychain
chooses.
Commands
reliquary login
Signs this computer in with your browser. Opens the consent page (and prints its link), where you choose the vaults the CLI may read and whether it may send .env files for approval. Waits up to 5 minutes, then lists the vaults and environments it can read. Signing in again revokes the previous sign-in on this computer.
| Option | Does |
|---|---|
--no-browser |
print the link without opening a browser, to open it on another device |
--server <url> |
the Reliquary server to sign in to |
reliquary logout
Revokes this computer's sign-in on the server, then forgets it. Takes --server <url>.
reliquary vaults
Prints each vault the sign-in reaches, one per line: its id, name, your role, and the environments you may read. Takes --server <url>.
reliquary run
reliquary run [--vault V] [--env E] -- <command> [args...]
Fetches one environment's variables and starts the command directly (no shell), with your environment plus the variables. Nothing is written to disk. Standard input, output and error are the command's; SIGINT, SIGTERM, SIGHUP, SIGQUIT and SIGUSR2 are passed on. A variable that replaces one already in your environment is named on stderr. Takes --vault, --env and --server.
Exit code: the command's own; 128 plus the signal number if a signal ended it; 127 if the command wasn't found.
On Windows:
- A bare command name is looked up on
PATHwithPATHEXT, likecmd.exedoes, but not in the current directory; write.\tool.exefor one there. .exeand.comfiles start directly..cmdand.batfiles, like thenpm,npx,pnpmandyarnshims, start throughcmd.exe /d /v:off /s /cwith every argument in double quotes, so&,|,<,>,^and parentheses reach the command as text. An argument holding a double quote, a%or a line break can't be passed to a.cmdor.batsafely, so the CLI refuses it with exit code 2 and runs nothing; run the program the shim wraps directly (for examplenode <script>) instead. Other files (.ps1,.js) are refused: run them through their interpreter.- Variable names are case-insensitive: a variable replaces an inherited one whatever its case, and two variables whose names differ only in case are refused.
- Ctrl+C reaches the command directly, and the CLI waits for it to finish; closing the console window ends the command and everything it started.
reliquary env pull
reliquary env pull [--vault V] [--env E] [--file .env] [--outside-repo]
Writes one environment to a file (default .env), mode 600, one NAME="value" per line in name order, under a header saying where it came from. Backslash, double quote, newline and carriage return are escaped. Prints the names, never the values.
The file must be inside a git work tree and ignored by git; a file that isn't ignored, is tracked, or is a symbolic link is refused and nothing is written. The check runs before fetching and again before writing.
| Option | Does |
|---|---|
--file <path> |
the file to write (default .env) |
--outside-repo |
allow a file outside any git repository |
Also takes --vault, --env and --server.
reliquary env push
reliquary env push [--vault V] [--env E] [--file .env] [--wait [--timeout 15m]]
Sends a .env file's variables to the vault for approval. Nothing is set until an owner or editor applies it in the web app, within 24 hours. Lines it can't take are listed with their reasons and not sent. Prints the names (new, or replacing a value) on stderr and the approval link on stdout, never a value. The sign-in must have been allowed to send .env files; an editor can't push to an owners-only environment.
| Option | Does |
|---|---|
--file <path> |
the file to send (default .env; a regular file under 512 KiB) |
--wait |
wait until a person applies or rejects it |
--timeout <t> |
with --wait: how long, like 90s, 15m or 2h (default 15m, at most 24h) |
Also takes --vault, --env and --server.
Exit code: 0 when sent (with --wait, when applied); 1 when refused, rejected or expired; 3 when --wait ran out of time first (the push stays pending).
Options for every command
| Option | Does |
|---|---|
--server <url> |
the Reliquary server: https, or plain http only for 127.0.0.1, [::1] or localhost |
--vault <v> |
a vault's name or id; not needed if you can reach only one |
--env <e> |
an environment's name; default development |
-h, --help |
the help above |
-v, --version |
the CLI's version |
How the vault, environment and server are chosen
| Setting | First of |
|---|---|
| Server | --server, RELIQUARY_URL, server in .reliquary.json, https://app.reliquary.redmage.cc |
| Vault | --vault, vault in .reliquary.json, the only vault the sign-in reaches |
| Environment | --env, environment in .reliquary.json, development |
A vault name that two of your vaults share is an error listing their ids.
.reliquary.json
A project file the CLI finds from the current directory upwards. Commit it; it holds ids and names, never values:
{ "server": "https://app.reliquary.redmage.cc", "vault": "<vault id>", "environment": "development" }
All three keys are optional.
Environment variables
| Variable | Does |
|---|---|
RELIQUARY_URL |
the server, when --server isn't given |
RELIQUARY_CONFIG_DIR |
where sign-ins are kept, instead of the default config directory |
RELIQUARY_NO_BROWSER |
when set, login prints the link without opening a browser |
RELIQUARY_CREDENTIALS |
file or keychain: where sign-ins are kept, instead of choosing by itself |
Where sign-ins are kept
One sign-in per server, in the operating system's keychain when there is one:
| System | Where |
|---|---|
| macOS | the login Keychain, as reliquary-cli items, through /usr/bin/security |
| Linux | your keyring through the Secret Service (GNOME Keyring, KWallet), with secret-tool from libsecret, when it's installed and a keyring answers |
| Windows | credentials.dpapi in the config directory, encrypted with DPAPI so only your Windows account on this computer can read it |
Without one (a server, a container, Linux without secret-tool), sign-ins are kept in credentials.json in the config directory, mode 600 in a mode 700 directory. reliquary login says which it used. The config directory is RELIQUARY_CONFIG_DIR, else %APPDATA%\reliquary on Windows, else $XDG_CONFIG_HOME/reliquary, else ~/.config/reliquary; it also holds the lock file that keeps two commands from refreshing at once.
RELIQUARY_CREDENTIALS=file always uses the file. RELIQUARY_CREDENTIALS=keychain always uses the keychain, and fails if none answers instead of falling back to the file.
A token never goes into a command's arguments, where other programs could see it: the keychain tools get it on standard input.
A sign-in made before the keychain, in credentials.json, keeps working. The next time it changes (a refresh within the hour, a new login, or logout), it moves into the keychain and out of the file.
Exit codes and errors
| Code | Means |
|---|---|
| 0 | done |
| 1 | an error, in a plain sentence on stderr starting reliquary: |
| 2 | a usage error (an unknown command or option, a missing value, an argument run can't pass to a .cmd on Windows) |
| 3 | env push --wait ran out of time |
| other | run passes on its command's exit code |
Common errors: your sign-in was revoked or expired (run reliquary login); the keychain is locked or doesn't answer (unlock it, or set RELIQUARY_CREDENTIALS=file); your role can't read that environment; no such vault or environment for this sign-in; the server has no key for variables. No error prints a value, a token or a server response.
For agents: this page as Markdown, and every page at /llms.txt.