Everything, without leaving the terminal
One binary, 24 commands, the whole product. Encryption runs on your machine, so the passphrase never leaves it.
The surface, measured
The CLI is the primary way developers use Envless. Authenticate once through the browser, and every command reads and writes encrypted values with a locally derived key.
Full definition
The Envless CLI is the primary way developers use Envless day to day. You authenticate once with a browser device flow, bind a directory to a workspace and environment, and from then on every command reads and writes encrypted values with a key derived and cached locally. It covers the whole product, not just reads: products, projects, environments, variables, versions, members, roles, access grants and domains all have subcommands, and every list can emit JSON so it composes with the rest of your tooling.
Installation
Global install, per-project pinning, and keeping the binary current.
Logging in
The device-code flow, what gets cached, and how sessions expire.
Linking a directory
What goes in the .envless file and why it is safe to commit.
Managing variables
Setting, reading, listing and deleting variables from the terminal.
Production and CI
Running headless with a machine key and an exported workspace key.
Troubleshooting
What each error actually means and the fastest way past it.
Commands and subcommands
24 / 54Twenty-four top-level commands expose fifty-four subcommands between them. Familiar aliases are remapped before dispatch, so ls, rm, add, copy, rollback, edit and log all land where you would expect.
Config directory and file modes
0700 / 0600Credentials live in ~/.envless/config.json. The directory is created 0700 and the file written 0600, atomically through a temp file and a rename, so nothing ever lands with your default umask.
Device login code
6 charactersDrawn from a 32-symbol alphabet that omits I, O, 0 and 1 so it can be read aloud without ambiguity. The code expires in five minutes, and the session token it mints is stored server-side only as a hash.
CLI session lifetime
90 daysEach login emits a workspace webhook carrying hostname, OS, architecture and CLI version, and the resulting device session appears in the dashboard where it can be revoked without touching the others.
Machine keys in the CLI
read onlyEvery write path refuses an ev_sk_ token and tells you to run envless login. That is a CLI-side rule: the same key writes happily over the HTTP API when it carries write scopes.
Exit code when a child is signalled
128 + nenvless run inherits stdio, drops its own signal handlers, forwards SIGINT and SIGTERM to the child, and exits with the child's own code, so it composes correctly inside CI and process managers.
The CLI FAQ
Mostly no, and it is better to be blunt about it. sync, run, build, types, var and push all fetch from the API and fail hard when it is unreachable. The two exceptions are whoami, which falls back to the cached profile with a warning, and logout, which clears your local state regardless. If you need a process to survive an outage, that is the in-process runtime package, which reads its own on-disk ciphertext cache.
In ~/.envless/config.json, written at mode 0600 inside a directory created at 0700, through a temp file and a rename so a crash cannot leave a partial file with loose permissions. It holds the session token and the derived workspace keys. envless logout clears it along with the whole cache directory.
Yes, and that is the intended path. Set ENVLESS_TOKEN to a machine key and supply a decryption credential, either ENVLESS_KEY for the raw exported workspace key or ENVLESS_PASSPHRASE, then point at a target with a committed .envless file or with ENVLESS_PROJECT and ENVLESS_ENV. Prefer ENVLESS_KEY on machines: it skips key derivation entirely and keeps a human-chosen string out of your pipeline.
It is a deliberate CLI-side guard: an unattended token that can silently mutate production variables is a bad default for a build step. The same ev_sk_ key does write over the HTTP API and the SDK when you give it write scopes, so the capability exists where you have opted into it explicitly.
None. pull is registered as a literal alias of the same handler, so the two cannot drift apart. Both write .env.<slug> files to disk. Note that neither prints variables to stdout, so redirecting the output with a shell pipe gives you a file full of status text rather than your secrets.
No. It decrypts in memory and spawns the child with the values in its environment, which is the whole reason to prefer it over sync. The only on-disk artefact in the picture is the runtime package's ciphertext cache, and even that never holds a decrypted value.
Set NO_COLOR or FORCE_COLOR=0. Both strip ANSI codes from every command, which is what you want when output is being captured into a CI log or piped into another tool.
