# The daemon and CLI One thing to know from the start: **the daemon only knows about panes it created.** Sessions you start from the app are tmux sessions named `harness-*`, owned by the daemon. A `claude` you launch by hand in your own tmux is not picked up. Another machine needs Node ≥ 20 and tmux; `sqlite3` only for the engines that keep their conversations in SQLite (OpenCode, Kilo, Hermes, Devin). There is no token to copy between machines: a durable computer id under `~/.harness` keeps later starts attached to the same machine record. `harness` is one pure-JS bundle run by the managed Node under `~/.harness/cli`. Everything below works the same on a headless Linux server; the app is not required on a machine, only the daemon. | Command | What it does | |---|---| | `harness login [--google\|--apple\|--qr] [--force] [--json]` | Sign in and save this computer's session: Google or Apple in the browser, or a QR a signed-in phone scans. With no flag at a terminal it asks which. `--force` signs in as a different account. `--json` emits NDJSON for GUI clients. | | `harness start [-f] [--repair]` | Start the daemon from the saved session. `-f` runs in the foreground for a supervisor. `--repair` re-verifies the managed Node runtime. | | `harness stop` · `harness logout` · `harness reset` | Stop the daemon · stop and clear the SSO session · stop and clear all local state. | | `harness status` · `harness version` · `harness update [--force]` | Running, pid, machine id, session count · version · update now. | | `harness dsh list` · `harness dsh update ` | Installed harness package versions and available updates · update one package while preserving its workspaces. | | `harness machines [list] [--json]` · `harness machines delete ` | This account's machines · remove another machine (never this one). | | `harness machines engines [--engine E]… [--json]` | Asks that machine now, over the machine link, which engines it has (`engines_probe`, answered there): one JSON line per engine with `machineId`, `engine`, `installed` (`true` or `null`), `signedIn` (claude and codex only, else `null`), `installable` and `firstPrompt` (whether its Harness can start that engine with a first prompt; `null` from an older Harness). `null` means unknown, never "not there": the probe reads a missing command, a timed-out login shell and a failed spawn alike, so only a failed start says an engine is missing. `--engine` narrows the probe to the engines named, so the answer comes sooner. For a device that hands work to its person's machines (#1788). | | `harness pair ` · `harness pairings` · `harness unpair <#\|fp\|--all>` | Pair a browser with the code the web client shows; list; unpair. | | `harness pair [--json]` · `harness pair talk ` · `harness pair mcp` | Your paired daemon's control interface (below): read every harness on every machine; talk to the daemon. | | `harness remote-password set\|status\|clear` | This machine's persistent password for machine-to-machine links. | | `harness link connect [--name=