Install
curl -fsSL https://exponential.at/install.sh | shSelf-hosting? Same script, with your instance in EXP_INSTANCE:
curl -fsSL https://exponential.at/install.sh | EXP_INSTANCE=https://issues.example.com shBuilds 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.
export PATH="$HOME/.local/bin:$PATH" in your shell profile, or set EXP_INSTALL_DIR to install somewhere else.Sign in
exponential loginThis 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:
EXP_INSTANCE=https://issues.example.com EXP_TOKEN=expu_... exponential loginCommands
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.
exponential code EXP-42 --agent claude --plan
exponential run "Update the changelog" --input version=1.4.0
exponential run fix-conflicts --input pr=EXP-42Either 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:
exponential daemon installOn 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.
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
exponential updateIt 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.