Documentation menu

The terminal app

Run nid with no arguments inside a Git repository and nid opens a full-terminal app, modelled on Claude Code: a header, the team's work streaming past, and an input box at the bottom. Everything you type goes to your team of agents.

cd my-repo
nid                         # open the app (first run sets the repo up)
nid "fix the flaky test"    # open the app with this goal already sent
nid -p "fix the flaky test" # no app: run to completion and print a summary (also --print)

The app works in Windows Terminal, macOS Terminal, iTerm2 and common Linux terminals, honours NO_COLOR, and adapts to narrow windows. When stdout is not a terminal, bare nid prints the grouped command help instead.

First run#

In a repository without a nid.yaml team, nid greets you and does the setup of undefined for you:

  1. It detects the agent CLIs on your machine (claude, codex, opencode, kimi, custom agents), whether each is logged in, and the billing mode each would use (subscription or API key, see billing).
  2. It offers team presets: a lead with workers, a writer with a reviewer from another vendor, or a solo agent. A sensible default is preselected; move with ↑/↓ and press Enter.
  3. It writes nid.yaml (setup command, local files to copy and a $20 budget are detected the same way as nid init).
  4. It asks What should your agents work on? Type a goal and press Enter: the team starts.

Nothing here needs a flag, and nid never asks for something it can detect.

The screen#

  • Header: the repository, the team (group) with each agent's model (lead (claude opus); configured until the agent reports the model it runs) and the billing mode. When an agent's model changes later, the stream says so.
  • Stream: what the agents say and do, coloured per agent. Tool calls collapse to one line each, like Claude Code; press Ctrl-O (or /expand) to show their full input and output. A command you (or the agent's permission profile) allowed shows as ✓ allowed on its tool line. nid's own coordination traffic (task offers and other nudges to agents, "synced teammates' work" notices, joins, board and status calls, tool loading for nid tools) is hidden; Ctrl-T (or /verbose) shows it, dimmed. Agent prose, real tool calls, task claims and completions, and approvals always show.
  • Input box: type to talk to the team.
  • Status line: tasks done/total, spend (billed, plus est. for subscription estimates), tokens, and rate-limit state.

Text you send goes to the team: when no team is running it starts with your text as the goal, otherwise it goes to the lead (or the only agent). Start a line with @name to send just that message to one agent: @codex use pnpm, not npm. To keep talking to one agent, use /focus codex: plain text and Esc then go to it until you run /focus again.

Keys#

KeyAction
EnterSend
TabComplete a slash command or an @name
↑ / ↓Input history
EscInterrupt the working agent: the focused one if it is working, else the lead, else whoever is working
Ctrl-OExpand or collapse tool calls
Ctrl-TShow or hide nid's coordination traffic
? (empty input)Help
Ctrl-C twiceLeave the app; the team keeps running

Leaving the app never stops your agents: they keep working in the nid daemon. Run nid again in the same repository to reattach; recent history is shown again.

Slash commands#

Type / to see the commands with inline help; Tab completes.

CommandWhat it does
/help [command]Commands and keys, or help for one command
/agentsThe agents in the team and what each is doing
/teamTeam, policy, budget and billing
/tasksThe task board
/statusTasks, spend, tokens and rate limits
/approve [all]Allow the pending permission request (or all of them)
/diff [agent]The team's integrated changes, or one agent's
/landMerge the team's work into your checkout
/pr [--draft]Push and open a GitHub pull request
/stop [agent]Stop one agent or the whole team; the work is kept
/resume [agent]Restart stopped agents where they left off
/interrupt [agent]Interrupt an agent's current turn (without a name: same as Esc)
/focus [agent]Send plain text and Esc to one agent instead of the lead; no name goes back to the team
/goal [text]Show or change the team's goal
/budget [usd|off]Show spend, or set or remove the spending cap
/billingBilling mode per agent
/compression [on|off|reset|<key> on|off|minTokens|ttlHours <n>]Token compression settings and tokens saved per agent, or change this team's setting; see compression settings
/model [agent|team] [model]Pick a model for the focused agent (or the lead) with ↑/↓ and Enter, like Claude Code's /model; Tab in the picker applies it to the whole team (agents that don't offer that model keep theirs), Esc cancels. /model <agent> <model> and /model team <model> switch directly. The switch happens between turns on the same conversation; see undefined
/permissions [agent profile]Each agent's permission profile (worktree, ask, yolo) and MCP mode, or change one agent's profile (restarts it on the same conversation)
/dashboardOpen the browser dashboard
/rc [off|status|devices]Remote control: share this team with every phone and browser signed in to your nid.dev account (the first time it links the machine through the browser and one operating-system prompt). /rc --view read-only, /rc for 8h expires, /rc all every team, /rc off [all] stops sharing, /rc rm <id> revokes a device here. The status line shows rc: N devices while anything is shared, and each new device is announced in the stream. See undefined
/initSet up (or redo) nid.yaml
/answerBring back questions you skipped with Esc
/expandExpand or collapse tool calls
/verboseShow or hide nid's coordination traffic (Ctrl-T)
/clearClear the screen (history stays in the daemon)
/quitLeave the app; the team keeps running

Permission requests and questions#

When an agent needs permission, the prompt appears inline, just as in Claude Code:

Permission needed
codex wants to run
  npm install left-pad
  Add the padding helper the tests import

Do you want to proceed?
❯ 1. Yes
  2. Yes, and don't ask again this session
  3. No, and tell codex what to do differently

The prompt shows the command (shell wrappers such as powershell -Command or bash -lc removed) and the agent's own one-line description of it; press d to show the full request. Press 1, 2 or 3 (or ↑/↓ and Enter; Esc means No). "Don't ask again" allows the same kind of request from that agent until its session stops: the same command and verb (for example any npm install ...), or the same tool for Claude. Compound shell commands and broad permission grants always ask again. With 3 you type what the agent should do instead, and that text is sent to it. Questions an agent asks you (ask_human) appear inline too; type the answer and press Enter, or press Esc to skip it for now and bring it back later with /answer. The same requests show in the dashboard.

When the team is done#

When the lead reports the goal is done, the app shows a summary card: what changed (the finished tasks), a diffstat, tasks, agents and cost. One key does the next step:

KeyAction
lLand: merge the work into your checkout
pOpen a GitHub pull request
dView the diff
kKeep going: give the team a follow-up

Once you land the work or dismiss the card, it stays gone for that team, also when you reopen the app.

Non-interactive runs: nid -p#

nid -p "add a regression test for issue 42"
nid -p --yes -g web --timeout 1800 "upgrade the linter"

In a repository without a team, -p first writes nid.yaml with the default preset (it tells you on stderr; edit the file or run nid init to change it).

Like claude -p, this starts the team with the goal, runs it to completion without the app, and prints the summary on stdout; progress goes to stderr.

Exit codeMeaning
0The lead reported DONE
1The team stopped, reached its budget, or the timeout passed
2nid "goal" without a terminal: use nid -p "goal" instead
FlagMeaning
-y, --yesAllow permission requests automatically. Without it, each request is printed on stderr with the nid approve <id> / --deny command to answer it, and the run waits.
-g, --group <group>Which team in nid.yaml to run (also works without -p)
--timeout <seconds>Give up after this long (exit code 1)