CLI & daemon

Start coding sessions and run actions from any terminal — and leave a Linux or macOS box running as an always-on agent machine your team starts work on from the web.

Install

shell
curl -fsSL https://exponential.at/install.sh | sh

Self-hosting? Same script, with your instance in EXP_INSTANCE:

shell
curl -fsSL https://exponential.at/install.sh | EXP_INSTANCE=https://issues.example.com sh

Builds are published for Linux (x86_64 and arm64) and macOS (Apple Silicon). The script verifies the binary's checksum and installs it to ~/.local/bin/exponential, then hands straight over to exponential login when it has a terminal.

You also need git, plus at least one agent CLI — Claude Code, Codex, or pi — for coding sessions. See Coding agents for what each one supports. The installer only warns about missing tools; exponential doctor is the one that checks them properly.

~/.local/bin on your PATHThe script says so if it isn't. Add it with export PATH="$HOME/.local/bin:$PATH" in your shell profile, or set EXP_INSTALL_DIR to install somewhere else.

Sign in

shell
exponential login

This is a device code flow (RFC 8628). The CLI prints a short code and a URL — <instance>/auth/device — you open it in any browser where you're already signed in, type the code, and approve. The terminal picks up the session by itself.

Nothing has to be typed into the machine you're installing on, so this works the same over SSH on a headless server as it does locally, and it works for password and SSO accounts alike. Confirm with exponential whoami.

Non-interactive setups

For provisioning scripts, skip the browser: generate an API key under Settings → API keys in the web app and hand it to the CLI as EXP_TOKEN:

shell
EXP_INSTANCE=https://issues.example.com EXP_TOKEN=expu_... exponential login

Commands

  • exponential login [--instance <url>]: Sign in to an instance and store the session locally.
  • exponential logout: Sign out and drop the local credentials.
  • exponential whoami: Show the signed-in account and its instance.
  • exponential status: Account, device id, daemon state, installed agents, and git in one summary.
  • exponential doctor: Check git and the three agent CLIs, and say what's missing.
  • exponential code <ISSUE> [--agent claude|codex|pi] [--model <m>] [--effort <e>] [--plan] [--skip-permissions] [--detach]: Start a coding session for an issue, by identifier ("EXP-42") or id.
  • exponential run <action> [--team <id>] [--input k=v ...]: Run a team action by name or id — the same agent flags apply.
  • exponential daemon [--foreground] [--label <name>]: Run the remote-start daemon in this terminal.
  • exponential daemon install | uninstall | status: Manage the systemd user unit (Linux) or launchd agent (macOS).
  • exponential update: Self-update from the latest CLI release.
  • exponential uninstall [--yes]: Remove the daemon service and delete the binary. Signed-in accounts are kept — the data dir is shared with the desktop app.
  • exponential version: Print the CLI version.

code and run take the same agent options as the desktop's start-coding dialog, and fall back to your saved per-agent defaults when you omit them. --plan and --skip-permissions are agent-specific; see Coding agents.

Run code from a terminal and the agent's interactive TUI attaches to it — type at it exactly like you would in the desktop app. Without a terminal (in CI, over a pipe) or with --detach, the session runs headless and stays fully steerable from the web, so you can close the laptop and keep watching it from your phone.

shell
exponential code EXP-42 --agent claude --plan
exponential run "Update the changelog" --input version=1.4.0
exponential run fix-conflicts --input pr=EXP-42

Either way it's a real coding session: a worktree on an exp/<IDENTIFIER> branch, the MCP wiring, the agent opening its own pull request, and the issue moving to In Review when it does.

Run as a daemon

The daemon turns a machine into a permanent home for agent work — a spare workstation, a VPS, the build box under the desk:

shell
exponential daemon install

On Linux that writes a systemd user unit (exponential-daemon) and enables it; on macOS it writes a launchd agent that starts at login. exponential daemon status tells you whether it's up, and daemon uninstall removes the service again. Name the machine with --label if the hostname isn't what your team would recognise.

Keep it running after logoutA systemd user unit stops when your last session ends unless lingering is enabled. Run loginctl enable-linger $USER once on the server.

The machine then shows up under Agents → My machines in the web app, with its online state and the agents it has installed. Start a coding session or an action there and pick that machine, and it runs on it exactly like it would on the desktop app: the same launcher, the same live activity feed, the same steering from web, iOS, or Android. Batch runs and the built-in Fix merge conflicts action work too.

Sessions belong to you, not to the box — the agent runs under your account, with your own agent subscription and your own GitHub access. A machine with no agent CLI installed registers as offline until you install one; the daemon notices without a restart.

Updating

shell
exponential update

It checks the latest CLI release, verifies the download against the release checksums, and replaces the running binary in place. If your instance has stopped supporting the version you're on, every command says so and points here.

You rarely need it, though: on its first run the CLI asks whether to keep itself up to date automatically. With auto-update on, commands check once a day and restart themselves on the new build, and the daemon updates on its own schedule, waiting until no session is running before it restarts. Each machine's row on the Agents page also shows its version with an Update button that asks the daemon to update right away — while sessions are still running the row reads "Update queued" and the update applies as soon as the last one closes. The stored choice is cliAutoUpdate in settings.json.

Release notes for the CLI and everything else live on GitHub Releases.