Get started
Install a coding CLI
The Termdeck agent is a relay. It does not bring a coding agent with it, so every machine needs at least one of Claude Code, Codex, or Grok installed and signed in. You can install all three and pick per chat.
Why these are separate installs
Termdeck drives the official CLI, unmodified, under your own subscription. That is what keeps your local repository, environment variables, credentials, MCP servers, and model access working exactly as they do in a terminal. It also means Termdeck never sees your provider password: each CLI stores its own credentials in its own config directory, and Termdeck reads the state rather than the secret.
Claude Code
npm install -g @anthropic-ai/claude-code
claude
Running claude once starts the login flow. Sign in with the Anthropic account whose plan you want the turns billed against.
- Sessions on disk:
~/.claude/projects/<project slug>/<session id>.jsonl - Resume in a terminal:
claude --resume - Config directory:
~/.claude, or whereverCLAUDE_CONFIG_DIRpoints
Claude is the engine with the deepest Termdeck integration: live permission prompts, sub agent status, checkpoint restore and MCP server state all come from Claude's own stream. Slash commands come from two places. The CLI names them, and Termdeck reads their descriptions and argument hints off disk, including any your project defines.
OpenAI Codex
npm install -g @openai/codex
codex login
- Sessions on disk: rollout files under
$CODEX_HOME/sessions - Resume in a terminal:
codex resume - Config directory:
$CODEX_HOME, defaulting to~/.codex
Codex has native plan mode, and Termdeck exposes it in the same picker as the other engines. The slash palette lists the skills installed for a Codex chat with their descriptions, but Codex has no slash commands of its own. Picking one writes it into the composer as text for the model to act on, rather than running a command.
xAI Grok
npm install -g @vibe-kit/grok-cli
grok login
- Sessions on disk: Grok's own session files, shared with the terminal
- Protocol: Agent Client Protocol, driven through
grok agent stdio
Use grok login so turns run against your SuperGrok subscription. Grok has no plan mode of its own, so Termdeck's Plan option behaves as read only there and the interface says so under the picker.
How Termdeck finds a CLI
The agent asks the operating system the same question your shell asks: where on Windows, command -v on macOS and Linux. Anything on the path counts as installed, which matches what happens when you type the command yourself.
A machine that has just had a CLI installed is picked up without restarting anything: a negative answer is only cached briefly before being rechecked.
If a binary lives somewhere unusual, name it explicitly in the agent's environment:
| Variable | Points at |
|---|---|
TERMDECK_CLAUDE_EXE | The Claude Code executable |
TERMDECK_CODEX_EXE | The Codex executable |
TERMDECK_GROK_EXE | The Grok executable |
Add them to ~/.termdeck/agent.env and restart the agent. Note that a background service does not inherit your login shell's environment, so a CLI that only works after your shell profile runs is exactly the case these variables exist for.
A machine can hold more than one copy of the same CLI, for example an npm global and a package manager install both on the path. When that happens, Termdeck and your shell can disagree about which one is the binary, which shows up as a sign in that appears to hang. Removing the copy you do not want, or naming the right one with the variables above, resolves it.
Confirming a CLI is signed in
Open Settings, then Machines and accounts. Each machine card lists the three engines with one of four states:
| State | Meaning | What to do |
|---|---|---|
| Signed in | Installed and holding a usable login. | Nothing. It can run turns. |
| Not signed in | Installed, no usable login. Turns will not start. | Run the engine's login command on the machine. |
| Not installed | The binary is not on the path. | Install it, or point at it with an executable variable. |
| Could not check | The machine did not answer. | Nothing is broken by this alone. It is never treated as signed out. |
The distinction in the last row matters more than it looks. "We could not tell" and "it is fine" are the two answers a diagnostic must never confuse, so Termdeck reports the uncertainty rather than guessing in either direction.
Where the engines differ
Termdeck uses one vocabulary across all three so switching engine mid project does not rename every control under you. The mapping is honest about the places where an engine behaves differently, and the interface prints the caveat under the picker.
| Capability | Claude Code | Codex | Grok |
|---|---|---|---|
| Live tool approvals | Yes | Yes | Yes |
| Plan mode | Native | Native | Behaves as read only |
| Accept edits mode | Yes | Not offered | Yes |
| Slash commands from the composer | Yes | No | Yes |
| Checkpoint restore | Yes | No | No |
| Sub agent status strip | Yes | Rows in the transcript | No |
| Saved account switching | Yes | Yes | Use the CLI |
| Terminal resume | Yes | Yes | Yes |
Permission mode names and their per engine behaviour are covered in full on Approvals and permissions.
Running more than one at once
Nothing stops you from having a Claude chat, a Codex chat, and a Grok chat running at the same time, on the same machine or on different ones. They are separate processes with separate transcripts. A common split is a premium subscription on the hard problems and a cheaper engine on the routine work, with the usage dashboard showing whether the split is paying off.
Two agents writing the same transcript would fork it, so Termdeck never does that. If a session is attached to another process, for example a terminal running the CLI on the same chat, the composer stays locked and the browser follows along read only until the terminal lets go.