Install
The CLI needs Node.js 22 or newer. You can run it without installing anything:
npx lannzo --helpIf you use it often, install it globally so the lannzo command is always available:
npm install -g lannzo
lannzo --helpSign in
Signing in uses a device code: the CLI shows you a code, opens your browser, and waits while you approve it.
lannzo loginThe token it receives is written to ~/.config/lannzo/config.json with owner-only permissions, and the CLI refuses to use the file if those permissions are ever loosened. Check which organization you are signed in to at any time:
lannzo whoamiLink a directory to a project
Linking saves the organization and project for a directory, so every later command can be run without repeating --organization and --project. Run it once per working copy.
lannzo link --project my-site
lannzo link statusDeploy
lannzo deploy packages the current directory and deploys it. Without flags it goes to preview; --prod sends it to production.
lannzo deploy
lannzo deploy --prodOnly files that Lannzo does not already have are uploaded, so repeat deployments of the same project are fast. The command then waits for the deployment to finish and exits non-zero if it did not reach ready, which is what makes it safe to run in CI. Use --no-wait to return as soon as it is queued.
To see exactly what would be sent without deploying anything:
lannzo deploy --dry-runOnce a deployment is running, follow it or read its logs from the same terminal:
lannzo inspect --wait --logs
lannzo logs --follow --level errorEnvironment variables
Variables are set per environment and can apply to the build, the runtime, or both. --value-stdin reads the value from standard input so a secret never lands in your shell history, and secret values are never printed back.
lannzo env set DATABASE_URL --environment production --secret --value-stdin
lannzo env list --environment productionYou can also run a local command with an environment's variables loaded, without ever writing them to a file:
lannzo env run --environment preview -- npm run devConnect a GitHub repository
Connecting a repository lets Lannzo deploy on its own. With --auto-deploy, every push to the chosen branch becomes a deployment.
lannzo repo connect --repository acme/web --branch main --auto-deploy
lannzo repo update --no-auto-deployFramework and commands
Lannzo detects the framework on every deployment. Run lannzo project config with no flags to see what a build would use, and set a framework to take that decision yourself — a manual selection is also what makes a custom build or start command apply.
Supported frameworks are nextjs, nestjs, express and node. The --auto-* flags clear a manual value and restore automatic detection.
lannzo project config
lannzo project config --framework nestjs --start-command "node dist/main.js"Runtime operations
An environment's runtime can be driven without creating a deployment. start brings back a stopped release, restart replaces the running revision with a new one from the same artifact, picking up current variables, and stop withdraws traffic until you start it again.
All three are asynchronous and send their own idempotency key, so a repeated command never starts a second revision. Restart and stop confirm in an interactive terminal unless --yes is passed.
lannzo runtime restart --environment production
lannzo runtime stop --environment previewCustom domains
Adding a domain returns the DNS records to create. Once they have propagated, verifying it proves ownership and queues its certificate.
lannzo domain add app.example.com
lannzo domain verify app.example.comCommand reference
Every command accepts --organization and --project to override the linked directory, and --json or --quiet to control output.
Authentication
| Command | What it does |
|---|---|
lannzo login | Sign in with a device code and store the credential. |
lannzo logout | Remove the stored credential from this machine. |
lannzo whoami | Show the organization the current credential belongs to. |
Linking
| Command | What it does |
|---|---|
lannzo link --project <id|slug|name> | Link the current directory to a project. |
lannzo link status | Show which project the current directory is linked to. |
lannzo unlink | Remove the link from the current directory. |
Organizations and projects
| Command | What it does |
|---|---|
lannzo org list | List the organizations you belong to. |
lannzo project list | List the projects in an organization. |
lannzo project inspect | Show what would be deployed from this directory. |
lannzo project create --name <name> | Create a project, optionally linking it to this directory. |
lannzo project set-root-directory <path> | Set the subdirectory to build from, or clear it. |
lannzo project config [--framework <f>] | Show or set the framework, build command and start command. |
Deployments
| Command | What it does |
|---|---|
lannzo deploy [--prod] [--no-wait] [--dry-run] | Deploy this directory to preview, or to production with --prod. |
lannzo inspect [deployment] [--wait] [--logs] | Show a deployment, optionally waiting for it to finish. |
lannzo logs [deployment] [--follow] | Read deployment logs, filtered by source, level or age. |
lannzo open [--deployment <id>] [--print] | Open the deployed site in your browser, or just print its address. |
lannzo deployment list | List a project's deployments, newest first. |
lannzo deployment retry <deployment> | Retry a deployment, which creates a new one. |
lannzo deployment cancel <deployment> | Cancel a deployment that is still running. |
Environment variables
| Command | What it does |
|---|---|
lannzo env list --environment <env> | List an environment's variables. Secret values are never printed. |
lannzo env set <KEY> --environment <env> | Create or replace a variable, optionally as a secret. |
lannzo env unset <KEY> --environment <env> | Delete a variable. |
lannzo env import <file> --environment <env> | Import variables from a file, optionally replacing the whole set. |
lannzo env copy <source> <target> | Copy variables from one environment to another. |
lannzo env pull [file] --environment <env> | Write an environment's non-secret variables to a local file. |
lannzo env run --environment <env> -- <command> | Run a local command with an environment's variables loaded. |
GitHub repositories
| Command | What it does |
|---|---|
lannzo repo list | List the GitHub repositories Lannzo can reach. |
lannzo repo status | Show the repository connected to this project. |
lannzo repo connect --repository <r> --branch <b> | Connect a repository and branch to this project. |
lannzo repo update --auto-deploy | --no-auto-deploy | Turn auto-deploy on or off for the connected repository. |
lannzo repo disconnect | Disconnect the repository, keeping deployment history. |
Domains
| Command | What it does |
|---|---|
lannzo domain list | List this project's platform and custom domains. |
lannzo domain add <hostname> | Add a custom domain and show the DNS records to create. |
lannzo domain verify <hostname> | Verify DNS ownership and queue the certificate. |
lannzo domain check-routing <hostname> | Check that a verified domain points to Lannzo. |
lannzo domain remove <hostname> | Remove a custom domain from this project. |
Runtime
| Command | What it does |
|---|---|
lannzo runtime start --environment <env> | Start the runtime of an environment whose release is stopped. |
lannzo runtime restart --environment <env> | Restart the runtime, keeping the same artifact. |
lannzo runtime stop --environment <env> | Stop the runtime and withdraw its traffic. |
Utilities
| Command | What it does |
|---|---|
lannzo doctor | Check the local setup, credential and project link. |
Scripts and CI
--json prints machine-readable output instead of a table, and --quiet suppresses progress messages. Commands exit non-zero when they fail, and lannzo deploy exits non-zero if the deployment does not reach ready, so a pipeline fails on a bad release without any extra checks.
lannzo deployment list --jsonCredentials and security
The credential is stored on your machine and nowhere else, with owner-only permissions. The CLI refuses to read it if those permissions are ever widened. Point LANNZO_CONFIG_PATH somewhere else to keep separate credentials per environment, or set LANNZO_TOKEN to skip the file entirely in CI.
~/.config/lannzo/config.jsonSigning in requests only the permissions the CLI actually uses: reading organizations, projects, deployments and logs, and writing projects, deployments, environment variables, GitHub connections and domains. It can never exceed what your own account is allowed to do.
Common issues
lannzo doctor checks the local setup, the stored credential and the project link, and is the fastest way to find out what is wrong:
lannzo doctor“Not logged in. Run `lannzo login` first.”
No credential was found at the expected path. Sign in again, or set LANNZO_CONFIG_PATH if you keep it somewhere else.
“Refusing credentials file with insecure permissions.”
The credential file is readable by other users on the machine. Restrict it to your own account with chmod 600 ~/.config/lannzo/config.json, or sign in again to have it rewritten correctly.
“File changed after manifest generation”
A file was modified while the deployment was being packaged, so the upload no longer matches what was measured. Stop anything writing into the directory — a dev server or a watcher, usually — and deploy again.