CrewroomDocs
Roadmap Changelog
Get going · 1 of 16

Get started with Crewroom

Crewroom is a Mac app that runs a coding agent on your projects with any model you bring: a plan you already pay for, an API key, or a model on your own Mac. You describe a task in plain words, the agent works in your project and shows every step, and nothing risky happens without your OK. This page takes you from install to your first finished task in about five minutes.

Install

Crewroom runs on macOS. It needs git and tmux, and brings its own copies when your Mac has none, so most people install nothing else.

  1. Open the disk imageDrag Crewroom into Applications. The app is code-signed. Apple notarization arrives with the first public release (Coming soon).
  2. Open CrewroomA short welcome walks you through four screens: check your Mac, connect a model or your agents, add a project, and your privacy choices.
  3. Start your first chatThe last screen opens a chat on your project with a starter prompt ready to send: “Explain this repository to a new teammate.”
Building from source

The app is a Bun daemon plus a web UI in a desktop shell. From a checkout, the same thing runs in development mode. Data lives in ~/.crewroom-app; set CRW_HOME to use another folder.

bun install
cd web && bun install && bun run build && cd ..
bun run dev            # the daemon, in the foreground
bun src/cli.ts ui      # prints a one-time link that opens the UI
bun src/cli.ts doctor  # checks what is missing
Updates

A built-in updater is written but not switched on yet Coming soon. Until then, install a new build over the old one.

The first-run screens

Every screen can be skipped and changed later in Settings.

ScreenWhat it does
Check your MacLooks for git, tmux and the coding agents you already have (Claude Code, Codex and others). Optional tools show as “Optional, not found”.
Connect your agents / Connect a modelSign in with a plan, or paste an API key. Crewroom tries a key once on the provider's model list, which costs nothing, and saves it only if it works.
Add a projectLists the git repositories already on your Mac, ticked, so you can add several at once. You can also choose any folder.
Your privacyThe only things Crewroom fetches by itself: model prices and benchmarks (off until you tick it) and the update check. Your code, prompts and keys stay on your Mac and go only to the models you connect.

Connect a model

Open Settings › Providers › Add. The window lists every connection Crewroom knows, grouped the way the code groups them. Subscriptions sign in through the provider's own page; everything else takes a key.

Add a provider
SUBSCRIPTIONS
ChatGPTSigned in
GitHub CopilotSign in
GrokSign in
Google GeminiSign in
ClineSign in
LABS
AnthropicKey works · 9 models
OpenAIAdd key
DeepSeekAdd key
KimiAdd key
Z.AI / GLMAdd key
Qwen · Mistral · xAI…Add key
GATEWAYS · CLOUD · LOCAL
OpenRouterAdd key
OpenCode GoAdd key
AWS BedrockSoon
OllamaFound · no key
LM StudioNot running
Custom endpointBase URL

The full list, how each sign-in works and how effort levels map per provider are on Models & providers.

Your first task

Pick a project in the sidebar, type what you want, and press Enter. The chips under the message box set the model, the effort, how actions are approved, and where the work happens.

Dark mode toggle
New task
Projects
my-app
Dark mode toggle
Fix the flaky login test
Pinned
Weekly dependency check
Add a dark mode toggle to Settings
Find where Settings draws Appearance
Add the toggle and save the choice
Run the tests
Read src/settings/Appearance.tsx
Edited src/settings/Appearance.tsx +24 −3
Ran bun test · 42 passed
Done. The toggle sits under Settings › Appearance and follows the system until you pick a side.
2 files changed +31 −4
Ask anythingSteer or queue a follow-up
Claude Sonnet 5.5mediumAsk firstYour folder
First task · example

What the composer chips mean

ChipChoicesDefault
ModelEvery model your connections list, in a two-panel picker (provider, then model).Your default model
EffortThe levels the chosen model takes, from low to max.The model's own default
AccessAsk first, Auto-accept edits, Auto, Full access. See Approvals.Ask first
WorkspaceYour folder works in the project folder itself and never switches its branch. New worktree gives the task its own copy on its own branch.Your folder
Talk to it while it works

You never have to wait for a turn to end. A message sent mid-turn either joins the running turn at its next step (Steer, the default) or waits for the turn to end (Queue). ⌘ Enter does the opposite of your setting for that one message. The details are in Queue and steer.

Review what changed

Open the right panel's Changes tab (Ctrl 2) to read the diff per file. Click any line to leave a comment; comments wait until you send them together as one review round. Commit changes commits only the files this agent touched, and Undo agent changes puts every file back to how it was when the agent started.

Give it house rules

Crewroom Agent reads the same rule files other agents do. Put an AGENTS.md (or CLAUDE.md) in the project root and every new chat starts with it.

# my-app

## Commands
- Install: `bun install`
- Test: `bun test` (run it before you say a change is done)
- Typecheck: `bun x tsc --noEmit`

## Conventions
- TypeScript, strict mode. No default exports.
- UI strings live in src/i18n/en.ts; never hard-code them.
- Ask before adding a dependency.

Which files load, and in what order, is on Memory › Rule files.

Get going · 2 of 16

Models & providers

Crewroom's own engine, Crewroom Agent, talks to models directly, so you can use almost any provider: sign in with a plan, paste an API key, or point it at a model running on your Mac. You can switch model in the middle of a chat and keep going. This page lists every connection the code knows, how each signs in, and the two settings that change cost the most: effort and the prompt cache.

Three ways to connect

Plans (sign in)ChatGPT, GitHub Copilot, Grok, Google Gemini, Cline. Billed to the plan you already have.
API keysAnthropic, OpenAI and 28 more labs and gateways. Pay per token; the cost view shows every dollar.
LocalOllama and LM Studio on their default ports, or any OpenAI-compatible server. No key, no cost.
Claude subscriptions

Claude runs inside Crewroom Agent with an Anthropic API key. A Claude plan does not sign in there; a way to use your plan through your own claude program is on the roadmap Coming soon.

Sign-ins

Each sign-in follows the provider's own flow. Tokens live only in Crewroom's secrets folder (a 0700 folder, files 0600); no other app's login is read or written.

PlanHow it signs inRefresh
ChatGPTBrowser sign-in with PKCE and a localhost:1455 callback. Requests name Crewroom as the client.Refreshed two minutes before expiry
GitHub CopilotDevice code: Crewroom shows a code, you confirm it on github.com.Copilot token renewed about every 30 minutes; model list hourly
GrokxAI device flow, for a SuperGrok or X Premium+ plan. Only xAI's own token endpoint is accepted.Refreshed an hour early
Google GeminiGoogle sign-in (OAuth), the way Gemini CLI does it.On demand
ClineCline account device sign-in, or a Cline API key on the same row.Refreshed five minutes early

API key connections

A pasted key is checked with one free GET /models call and saved only when it works. The answer also becomes the model list in the picker: chat models only, the curated models first, then the rest newest first. A key the provider rejects, a key with no credit left, and a rate-limited key each get their own plain message.

GroupConnections
LabsAnthropic, OpenAI, Google, xAI, Mistral, DeepSeek, Kimi, Z.AI / GLM, Qwen, MiniMax, MiniMax (China), Kimi / Moonshot (China), StepFun Step Plan, Arcee AI, Xiaomi MiMo, Tencent TokenHub, Alibaba Cloud (Coding Plan)
GatewaysOpenRouter, Vercel AI Gateway, Fireworks AI, NVIDIA NIM, Hugging Face, NovitaAI, GMI Cloud, OpenCode Zen, OpenCode Go, Kilo Code, Ollama Cloud, Cline, Command Code
CloudAWS Bedrock, Azure Foundry, Google Vertex AI Coming soon
LocalOllama, LM Studio (found on their default ports, no key)
CustomAny OpenAI-compatible endpoint: a base URL, a model id and an optional context window. You can keep several (custom, custom-2, …).

Model lists are refreshed in the background once a day per provider (Copilot and the price catalogue hourly). A failed refresh keeps the last good list. To refresh everything now:

crw models --refresh
Backup model

Set Backup model in Settings and Crewroom switches to it on its own when your plan or key runs out mid-task, with a banner that says which model took over. With several accounts of one provider, the next account takes over first.

Effort levels per provider

The effort chip only offers the levels the chosen model takes. When a level is not on a model's ladder, Crewroom rounds it the way that provider's own app does. Open models you have not set run at medium.

Provider and modelsLevelsNotes
Anthropic (Claude)low medium high xhigh maxDefault per model, as Claude Code sets it: medium on the 5.5 family, xhigh on Opus 4.7, else high. A model without xhigh or max runs it at high.
OpenAI / ChatGPT planlow … maxCodex's table: GPT-6 and GPT-5.6 models take up to max, GPT-5.5 up to xhigh, others low–high. An unlisted level becomes the middle listed one.
DeepSeek V4low medium high maxxhigh is sent as max; thinking can be switched off.
Kimi (Moonshot)low high maxmedium → high, xhigh → max. K2 on OpenCode Go: low–high.
Z.AI GLMGLM-5.3: low–max; GLM-5.2: high maxGLM-4.5 and later think with a toggle only. GLM-5.3 cannot stop thinking.
Google GeminiGemini 4 and 3: low medium high; 3+ Pro: low highGemini 3 and later always think; Crewroom gives them room for it.
Other relaysnoneNo level is sent where the wire takes none (OpenCode Zen, xAI's chat API, Qwen on DashScope, MiniMax).

Prompt cache (Anthropic)

On an Anthropic key, every turn re-sends the whole conversation. The prompt cache keeps that prefix warm so it is billed at a fraction of the price. Settings › Providers › Anthropic › Prompt cache picks how long it stays warm:

ChoiceWhat it doesCost note
AutomaticClaude Code's rule. On an API key that is 5 minutes; sub-agents always use 5 minutes.Default
5 minutesThe cache lapses after 5 quiet minutes.Writing the cache costs 1.25× the input price
1 hourStays warm across a coffee break or a meeting.Writing costs 2×, but coming back after a pause does not re-pay the whole chat. Long idle chats are compacted just before it expires (see idle compaction).

The setting is stored as cache_policy. Two more values, simple and smart, exist for experiments; the picker shows them only if they are already set.

Switching models mid-chat

Pick another model in the composer and the next turn runs on it, with the same conversation. When a turn is running, the switch waits for it to end. Tools adapt to the family: GPT models get Codex's tool set (exec_command, apply_patch, update_plan…), every other model gets Claude Code's (Bash, Edit, TodoWrite…). See Tools & MCP.

How it works · 3 of 16

How the engine works

Every chat gets its own small background program, the engine, which calls the model and runs the tools. The Crewroom app talks to it over one private channel and keeps a log of everything it does, so a crash, a quit or a sleeping laptop never loses a turn. This page explains the moving parts, from the wire format to the rules that decide when a chat is compacted or stopped.

The picture

WindowMac app Phonepaired iPhone Daemonone per Mac · 127.0.0.1 queue (inbox)approval cardskeys, sign-inslog reader, indexidle sweepcrash resumecrewroom.db Seatbelt box Engine, one per chatcrw agent run --servemodel loop, tools, helpers Commands, MCP, hooksunder the shell guard Chat log (.jsonl)one writer: the engine Model providerplan, API key or local WebSocket HTTP fd 3JSON append reads only new lines
The daemon owns the queue, the approvals and the keys; the engine owns the conversation and is the only writer of its log.

The daemon and one engine per chat

Crewroom's background service, the daemon, listens on 127.0.0.1 with a random token and serves the window and paired phones. For each Crewroom Agent chat it starts one engine process:

  • The engine is crw agent run --serve, started without a shell, in its own process group, inside a macOS Seatbelt box.
  • Its standard output and errors go to engine.log in the chat's folder, token-redacted a line at a time. They can never corrupt the protocol.
  • Keys never sit in the engine's environment (which ps would show). The engine asks the daemon for a credential when it needs one, and the daemon handles sign-in refresh and account rotation.
  • The engine never opens Crewroom's database.
Two transports

This page describes the pipe engine, the new transport. Older installs run Crewroom Agent inside a hidden terminal pane; the setting engine_transport switches between them. Making the pipe engine the default for new installs, then removing the terminal path, is next on the roadmap Coming soon. Claude Code, Codex and other CLIs keep running in their own terminals either way.

The pipe: fd 3, one JSON object per line

Daemon and engine speak over file descriptor 3, both ways. The envelope is Codex app-server's: JSON-RPC 2.0 without the "jsonrpc" field, one object per line. The handshake is initialize then initialized, with a 30-second timeout.

{"id":12,"method":"turn/start","params":{"input":[{"type":"text","text":"Add a dark mode toggle"}],"typed":"Add a dark mode toggle","clientIds":[412]}}
{"id":12,"result":{"turn":{"id":"t7","status":"inProgress"}}}
{"method":"turn/started","params":{"turn":{"id":"t7","status":"inProgress"},"endOffset":18342}}
{"method":"item/agentMessage/delta","params":{"turnId":"t7","itemId":"i3","delta":"Reading the settings","offset":0}}
{"method":"item/completed","params":{"turnId":"t7","itemId":"i3","endOffset":19107}}
{"method":"turn/completed","params":{"turn":{"id":"t7","status":"completed","durationMs":48210},"endOffset":26655}}
DirectionMethods
Daemon → engineturn/start, turn/steer, turn/interrupt, thread/revert (rewind), thread/compact/start, command/run (slash commands), mode/set, mode/get
Engine → daemon (events)thread/started, turn/started, turn/completed, item/started, item/completed, streaming deltas, thread/status/changed, thread/tokenUsage/updated, error, serverRequest/resolved
Engine → daemon (asks)approval requests for commands, file changes and permissions; questions for you; credentials/get

Errors use four codes: -32700 bad line, -32000 the handler threw (the reader keeps going), -32601 unknown method, -32602 wrong turn state. Streaming deltas are never stored; they are placed by offset and the finished item is read back from the log.

The per-chat log

Each chat's conversation lives in one append-only .jsonl file in Claude Code's transcript shape, so the same parsers, usage readers and hooks work on it. Rules that keep it trustworthy:

  • One writer. Only the chat's engine writes it, guarded by a lock file that holds its process id.
  • Bytes before news. Each line is on disk before the daemon is told about it; notifications carry only an endOffset.
  • Read only what is new. The daemon keeps an index (next_offset, turn rows) that it can rebuild from the log at any time. A torn last line is left alone; a corrupt line is skipped but still counted.
  • Engine records. Turn starts and ends, approvals, mode changes and engine exits are written as system lines with crewroom_* subtypes. Your approval decisions are written by the daemon, never by the engine, so the log can never claim you approved something.

Queue and steer

Every message you send goes into the chat's inbox (SQLite) first. What happens next depends on whether a turn is running:

WhenSteer (default)Queue
The agent is idleSent at once as turn/start.
A turn is runningSent as turn/steer; the engine takes it at its next tool step. If the turn is already closing, it falls back to the queue.Waits, then goes out as the next turn/start when the turn ends.

A message counts as delivered only when its id appears on a user line in the log, so a message can never run twice or get lost between the two. The queued list can be paused, resumed, reordered and cleared.

Stop rules

  1. Stop pauses the queue first: anything queued before you pressed Stop stays put until you resume.
  2. The engine aborts the turn, stops the running shell commands, gives unfinished tool calls an “interrupted by user” result, and tells the model with a short marker that you stopped on purpose.
  3. A message you send after Stop runs once the stopped turn has ended.
  4. A Stop that lands before a turn's request goes out cancels that request, so a crash's re-delivered turn never starts after you said Stop.
  5. If the engine does not confirm within 10 seconds it gets SIGTERM, then SIGKILL at 15 seconds. It leads its own process group, so the whole group is stopped and nothing is left behind.

Crash recovery

When an engine dies mid-turn, or the app quits or restarts during one, the turn is marked interrupted and continues by itself:

  • Auto-continue, at most twice. The engine restarts on the same log with a note telling the model the turn was cut off and to check what is already done. If the crash cut tool calls before their results were saved, the note names them: each ran at most once and its result is unknown.
  • Only fresh turns. A turn auto-continues only if it was cut within the last hour, and never while it waits on one of your cards.
  • Never a loop. The same turn cut by three restarts in a row is suspended with a notice and continues on your next message.
  • Lost message, same message. A turn that died before your message reached the log simply runs that message again, without the note.

On quit or restart, the daemon closes every engine's pipe; engines interrupt their turns and exit within five seconds (then SIGTERM, then SIGKILL at ten). On the next start, any stray engine still holding a log lock is stopped before anything else runs.

The idle stop

A chat that sits quiet does not need a live engine. Every second the daemon looks at its engines; one with no open turn, no pending card, nothing queued, no background work (shells, sub-agents, scheduled wake-ups) and no request in flight for engine_idle_minutes (default 60, 0 = never) is stopped. Your next message starts it again from the log in a moment.

Idle compaction

Long chats get summarised (compacted) so they fit the model and cost less. Two idle rules apply:

RuleWhen it firesSetting
Before the cache expiresA quiet chat of 100k+ tokens whose last request used a 1-hour Anthropic cache is compacted at 90% of that hour, 54 minutes after its last cache use, in one summary request over the still-warm cache. If the idle stop comes first, it fires 30 seconds before it.idle_compact_pre (on)
On returnA chat of 100k+ tokens left idle for 6 hours is compacted on your next send, before your message.idle_compact_hours (6, 0 = off)

The first rule never fires for sub-agents, forks, unattended runs or goals, nor when a scheduled wake-up is due before the cache expires. Anything you send while it runs stops it at once, because the cache is still warm and you are back. Its own frames do not keep the engine alive, and a failed attempt is logged, never shown. Turning automatic compaction off turns both rules off.

What the model sees vs what you see

The model seesYou see
The system prompt, your rule files (AGENTS.md, CLAUDE.md…), a Project memory section, and the tools. Rarely used tools are listed by name and loaded on demand through a tool search.The chat: your messages, the replies, and folded step rows (“Read …”, “Edited … +24 −3”, “Searched the web for …”).
Tool output with keys and passwords masked before it is sent (switch: Hide secrets from AI models, on).The same output, unmasked, on your Mac.
Web pages, MCP results and repository text fenced as outside content, with a warning not to follow instructions inside it.Link cards for pages the agent opened, and MCP results as cards.
A marker when you interrupted, and a note when a turn was auto-continued after a crash.“Interrupted” on the turn, then the turn continuing.
Never: a secret you pass with the secret card, other chats (unless the agent searches them), Crewroom's own keys.Cards for approvals, secrets, plans and questions that need you.

Step limits and the loop guard

A turn stops after 100 tool steps (step_limit) and asks before it keeps going, with a Keep going button. Background helpers, bots and goals, which run while nobody is watching, get 1000 (step_limit_unattended). A loop guard stops a turn that repeats the same call over and over, and non-Claude models are asked once to run the project's checks before they say a code change is done.

How it works · 4 of 16

Planning & the crew

For a bigger job the agent can plan first, show you the plan, and split the work across helpers that run side by side. Each helper can get its own copy of the project so they never trip over each other, and you decide what gets merged. This page covers plan cards, sub-agents, folder isolation and review.

Plan first

Type /plan (optionally with a description) to turn on plan mode, or ask for a plan. In plan mode the agent reads the code without changing anything and then shows a plan card:

Usage page in Settings
Ready to code?
1. Read the usage data in src/usage.ts · 2. Draw the weekly spend chart · 3. Add the page to Settings · 4. Tests for the chart's totals
Yes, auto-accept editsYes, manually approve editsNo, keep planning
CopySave as .mdBuild it in a new chatTell Crewroom Agent what to change

Once work starts, the plan becomes a checklist at the top of the turn that ticks itself off as steps finish, and is closed at wrap-up. Build it in a new chat starts the build in a fresh chat with the plan as its prompt, and the planning chat stops there.

Sub-agents

The agent can start helpers with its Agent tool (on GPT models, Codex's spawn_agent). Built-in helper types:

TypeUse
general-purposeAny multi-step job.
Explore, PlanRead-only search and planning, without the project's rule files.
DebugInvestigates a failure with its own debug log; cannot start more helpers.
ReviewerRead-only review, on Opus when the account has it.
BrowserDrives Crewroom's browser (in app chats).

Helpers run in the background by default and report back when done; the main agent can message a running helper. A helper uses the Sub-agent model setting, or the parent's model when that is empty.

Your own helper types

Drop a Markdown file with frontmatter into .crewroom/agents/ (or Claude Code's .claude/agents/, Cursor's .cursor/agents/, or a Codex .codex/agents/*.toml). Project files win over user files, and .crewroom wins over the others.

---
name: test-writer
description: Writes missing unit tests for a module and runs them until they pass.
tools: Read, Edit, Write, Bash
model: inherit
effort: medium
isolation: worktree
maxTurns: 40
---
You write focused unit tests. Read the module first, cover the edge cases
the code already handles, run the suite, and report which tests you added.

Same-folder isolation

By default a chat works in your project folder itself. Two agents editing one folder would mix their changes, so Crewroom keeps them apart:

  • When another chat is busy in the project folder, a new task starts in its own copy of the folder, uncommitted files included. Its edits stay in that copy until you merge them, and the agent is told so.
  • A helper started with isolation: worktree also works in its own git worktree.
  • If two chats do end up in one folder, the chat shows: “X is also working in this folder: your changes mix.” A change that could be either agent's counts as yours and is never undone.

Pick New worktree in the composer to give any task its own copy on its own branch from the start.

Review and merge

  • Review it yourself. In the Changes tab, click lines to comment, accept hunks or files, and send all comments to the agent as one review round. Manual review is free: no model runs.
  • Second opinion. Sends the conversation and the current diff to a reviewer model of your choice, read-only, and puts its review in the chat with its cost.
  • Merge. A task on its own branch can be squash-merged into its base on your Mac (“Merged locally into main, not pushed”) or through a pull request. A local merge can be undone with a revert commit.
  • Commit. Commit changes commits only the files this agent touched.
How it works · 5 of 16

Safety

The agent can read your project freely, but every command it runs is boxed in by macOS itself: it can only write where the work happens, and it can never read Crewroom's keys. Anything risky asks you first on a card that shows exactly what will run, and when a command needs a password or a token, you type it into a card the model never sees. This page lists the exact rules.

Publish the package
Publish 1.2.0 to npm
Ran bun run build
Do you want Crewroom Agent to run this command?
query run NPM_TOKEN --reason "publish to npm" -- npm publish
Always allow in this projectDenyAllow once
Allowed once
SECRET REQUEST
Pass NPM_TOKEN to this command?
“publish to npm” · ~/Projects/my-app · npm publish
Goes only to this command while it runs. Never to the chat, the model or a file.
DeclinePass to command
Secret · NPM_TOKEN · Passed to the command and kept private
Published [email protected]. The token went only to npm publish; it never entered this chat.
Approval, then a secret card · example

Four layers

LayerWhat it stopsCan you turn it off?
The engine's boxThe engine itself runs in a Seatbelt box and gets keys from the daemon one request at a time.No
The shell guardEvery shell command, tool server and hook writes only in an allow-list and never reads Crewroom's secrets.Per command, with your approval
ApprovalsEdits, commands and tools ask first unless your mode or a rule allows them.Yes: pick an access mode
Secret handlingKeys in tool output are masked before the model sees them; secrets you pass go only to one command.Masking: yes, in Settings

The shell guard

Every agent shell command runs under macOS Seatbelt with a write allow-list, the same idea as Claude Code's sandbox.filesystem.allowWrite. Reads stay open, so the agent can still read your code, docs and tools.

# writable roots
the working folder and any folders added with /add-dir
the chat's own folders in Crewroom's home
/tmp, $TMPDIR and the per-user temp folder
a worktree's git folder (but never its hooks or config)

# package and tool caches under your home
~/Library/Caches   ~/.cache          ~/.npm             ~/.bun/install/cache
~/.cargo/registry  ~/.cargo/git      go/pkg/mod, sumdb  ~/.gradle/caches
~/.m2/repository   ~/.yarn/berry/cache  ~/Library/pnpm/store  ~/.local/state/pnpm
~/.local/share/uv  ~/.ssh/known_hosts

Mandatory denies

Inside those roots, some names are never writable, wherever they are. These are Claude Code's mandatory denies plus Crewroom's own settings:

  • Shell start-up files: .bashrc, .bash_profile, .zshrc, .zprofile, .zshenv, .profile and the rest.
  • Git's code-running files: .git/hooks, .git/config, .git/info/attributes, .gitconfig, .gitmodules, ~/.config/git, plus fish's config.
  • Editor and agent settings: .vscode, .idea, .mcp.json, .ripgreprc, .claude/commands, .claude/agents, .claude/settings*.json, .crewroom/settings*.json.
  • No creating, moving or writing a .git, commondir or gitdir (a planted one could point git at another repository). Deleting a clone with rm -rf still works.
  • Your home folder itself, ~/Library/LaunchAgents, app updates staged in the caches, and renaming ~/.crewroom, ~/.claude, ~/.codex or ~/.ssh.

The guard also refuses reads of Crewroom's secrets (stored keys, sign-ins, the database, other chats' tokens, browser profiles) and blocks handing code to a program outside it: launchctl, crontab, at, osascript, open, automator, shortcuts, Apple Events and the browsers' debugging ports.

Because the guard writes git objects, refs and the index, commit, branch, checkout, merge, rebase, fetch and push keep working. git init, git config and hook installs write git's config, so they need to leave the guard. Crewroom's own git calls run with hooks and filters switched off, so a hook a command planted never runs.

Leaving the guard

When a command fails on a guard refusal, the agent is told why and can retry the same command outside the guard. That retry always goes through the approval gate: a card in Ask first, the safety check in Auto. A refusal on a credential, a file or a host the task does not involve is meant to stop there, and the agent is told to say so instead of retrying.

Approvals

The access chip in the composer sets how actions are approved. New tasks start in the mode set under Settings › Sessions › Default permissions.

ModeBehaviour
Ask first (default)Asks before editing files or running commands, except what your rules already allow.
Auto-accept editsFile edits go through; commands and other actions still ask.
AutoA small safety model reviews each action and approves routine ones; anything it is unsure of still asks you. There is no daily limit.
Full accessRuns without asking. The shell guard still applies.

The approval card shows what will happen and makes you look at it:

  • A command card shows the whole command; a long one must be scrolled to the end before Allow turns on.
  • An edit card shows the change as a diff (first 400 lines).
  • Hidden or direction-changing characters are written out as codes, with a warning.
  • Always allow in this project says what it covers (for example “Covers: npm commands”) and is saved as a rule you can see in the project's Permissions.
  • Commands Crewroom judges dangerous ask even when a rule would allow them.

Allow rules, including Claude Code's

Rules use Claude Code's format and are read from the same places, so the rules you already wrote for Claude Code are respected. A personal allow rule runs that tool without asking, even in Ask first. Settings › Sessions lists your personal rules with the file each came from; each project's own rules are in its Settings › Permissions.

{
  "permissions": {
    "allow": ["Bash(bun test:*)", "Bash(git status)", "Edit(src/**)"],
    "ask": ["Bash(git push:*)"],
    "deny": ["Read(./.env)", "Read(./secrets/**)"]
  }
}
ScopeFiles, in the order they are read
Personal~/.claude/settings.json, ~/.crewroom/settings.json
Project (shared).claude/settings.json, .crewroom/settings.json
Project (local).claude/settings.local.json, .crewroom/settings.local.json
ManagedThe system policy file, if your organisation has one

Deny wins over ask, ask over allow. Block reads outside the working directories refuses file-tool reads (Read, Grep, Glob, LSP) outside the project in every mode; add a folder with /add-dir.

The secret card

The model is told never to ask you to paste a key into the chat. When a command needs one, it runs that command through query:

query run NPM_TOKEN --reason "publish to npm" --timeout 300 -- npm publish
  1. A Secret request card opens in the chat with the reason, the folder and the whole command. Pass to command stays off until you have scrolled through them.
  2. You paste the value into a masked field (password managers are told to stay out).
  3. Crewroom itself runs that exact command, in that folder, in the box the chat's engine gives it, with the value only in that one process's environment.
  4. The agent gets the command's output and exit code. Never the value. query: cancelled (exit 1) means you declined; exit 124 means nobody answered in time.

Secret cards can only be answered on the Mac, never from a paired phone. One card shows at a time per chat; a second request waits its turn.

Masking in tool output

With Hide secrets from AI models on (the default), keys and passwords in files and command output are masked before they are sent to the model: API key shapes (sk-…, ghp_…, github_pat_…, AKIA… and more), private key blocks, bearer headers, token=…-style assignments and curl -u user:secret. The real values stay on your Mac.

Tool servers and hooks inside the guard

Every stdio MCP server you configure, and every hook, starts under the same guard: Crewroom's secrets are closed, the network is open, and writes go only to its own folder, temp and the tool caches. A server from a project file (.mcp.json) runs only after you approve it, and stops running if its entry changes after that.

A server or hook that genuinely needs your whole disk can run outside the guard. This is only possible for entries in your own user settings, never a project's or a plugin's, and it is saved for that exact entry in ~/.crewroom/settings.json:

{
  "mcpOutsideGuard": [ { "name": "files", "scope": "user", "file": "~/.crewroom/mcp.json", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem"], "envHash": "…" } ],
  "hooksOutsideGuard": [ { "source": "~/.claude/settings.json", "command": "~/bin/notify-done.sh" } ]
}

You never write this by hand: use Runs outside the guard on the server's row in Settings › Plugins & MCP, or on the hook in /hooks. A server's environment is kept only as a hash, and a changed entry is no longer trusted.

Outside text

Web pages, MCP results and text from the repository are fenced as content someone else wrote, with an instruction not to follow anything inside. If such text tries to address the model, the model is told to report it with a short quote. Messages between agents and bots have hidden characters stripped.

Keys

Keys and sign-in tokens live in Crewroom's secrets folder (folder 0700, files 0600), never in the database or a settings row. The guard refuses every read of that folder, and the engine gets a credential from the daemon per request instead of from its environment.

macOS Keychain

Moving keys into the Keychain is being built and is not protecting keys yet Coming soon.

How it works · 6 of 16

Tools & MCP

Tools are what the agent can do: read and edit files, run commands, search the web, start helpers. Crewroom gives each model the tool set its own makers trained it on, adds a few of its own, and lets you plug in any MCP server. This page lists the built-in tools and shows how to add and trust servers.

Two tool sets, one engine

ModelsTool setTools
GPT (OpenAI, ChatGPT plan)Codex'sexec_command write_stdin apply_patch update_plan view_image spawn_agent send_message followup_task wait_agent interrupt_agent list_agents request_user_input
Every other modelClaude Code'sRead Write Edit NotebookEdit Bash Monitor TodoWrite WebFetch WebSearch Skill Agent SendMessage EnterPlanMode ExitPlanMode AskUserQuestion LSP EnterWorktree ExitWorktree CronCreate CronDelete CronList ScheduleWakeup SendUserFile PushNotification ReadNotifications GetTask TaskStop

Rarely used tools are not sent up front; the model sees their names and loads one through ToolSearch when it needs it. That keeps every request smaller and the prompt cache stable.

Crewroom's own tools

ToolsWhat they do
memory_remember memory_save memory_search memory_showRead and write project memory.
session_searchSearches the text of your past chats (its own and granted projects, never the chat it is in).
git_commit git_diff git_logGit with Crewroom's safe settings.
show_cardDraws a chart or visual card in the chat, with Download PNG, Copy image and Download CSV.
navigate read_page find form_input get_page_text javascript_tool …Drive the built-in browser panel, with per-site rules.
computer screenshot open_application …See and control Mac apps you grant in Settings › Computer access.
image_genMakes images when an image-capable key is connected.

Web search uses the model's own server-side search where it has one. Otherwise it goes to the first backend you have set up, in this order unless you pick one: Firecrawl, Tavily, Exa, SearXNG, Brave, DuckDuckGo.

Adding an MCP server

Use Settings › Plugins & MCP › Add server, or the command line, which mirrors claude mcp:

# a local (stdio) server, for every project
crw mcp add -s user files -- npx -y @modelcontextprotocol/server-filesystem ~/Projects/my-app

# a remote (HTTP) server, shared with the project through .crewroom/mcp.json
crw mcp add -s project -t http docs https://mcp.example.com/mcp

crw mcp list
crw mcp login docs      # OAuth sign-in for an HTTP server

Or write the file yourself. The format is the one Claude Code and Cursor use:

{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres", "${DATABASE_URL}"],
      "env": { "PGCONNECT_TIMEOUT": "5" }
    },
    "docs": {
      "type": "http",
      "url": "https://mcp.example.com/mcp",
      "headers": { "Authorization": "Bearer ${DOCS_TOKEN}" }
    }
  }
}

${VAR} and ${VAR:-default} are expanded from your environment, as are Cursor's ${env:VAR}, ${workspaceFolder} and ${userHome}. Per-server startupTimeout and toolTimeout (milliseconds) are honoured.

Where servers come from

Crewroom reads the servers of every tool you use and merges them like Claude Code's scopes: local beats project, which beats user. Within a scope, Crewroom's files beat Claude Code's, which beat Cursor's, which beat Codex's. Crewroom only ever edits its own files.

ScopeFiles
User~/.crewroom/mcp.json, ~/.crewroom/settings.json, ~/.claude.json, ~/.cursor/mcp.json, ~/.codex/config.toml (mcp_servers), enabled plugins
Project.crewroom/mcp.json, .crewroom/settings.json, .mcp.json, .cursor/mcp.json
Local.crewroom/settings.local.json, your project entry in ~/.claude.json

Trust

  • Project servers wait for you. A server from a repository file runs only once you approve it, and the approval pins the entry: if it changes, it does not run until you approve again. The approval says plainly when an entry pulls a key-shaped environment variable.
  • Malware check. Before an npx or uvx server starts, its package is checked against the OSV database for known-malicious advisories. A failed lookup is shown as “unchecked”.
  • Per-tool choices. Each server's tools are grouped as Read-only, Write/delete and Other. Set each to Always allow, Needs approval or Blocked. Tools marked read-only by the server run without asking unless a rule says otherwise.
  • Inside the guard. Stdio servers run under the shell guard unless you take a user-scope server out of it.

Hooks

Hooks use Claude Code's protocol: JSON on stdin; exit 0 is fine (stdout JSON is read), exit 2 blocks, anything else is a non-blocking error. Project hooks load only in a folder you trust, and not after they change.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [ { "type": "command", "command": "jq -r .tool_input.file_path | xargs bun x prettier --write" } ]
      }
    ]
  }
}
Around the agent · 7 of 16

Bots & schedules

A bot is an agent with a standing job: a role, its own chat and workspace, and a schedule or a trigger that starts it. You set it up once from a template, and it reports back when something needs you. This page covers templates, schedule kinds, triggers and what a bot is allowed to touch.

Crew bots
my-app
Dark mode toggle
Bots
Monitor · Idle
Reporter · IdleWorkingIdle
▸ Run now
New crew bot: pick a template
C
Chief of staffCoordinates the crew
R
ResearcherLooks things up
M
MonitorWatches a page
R
ReporterDaily summary
I
InboxSorts requests
P
PlannerTracks a goal
New crew bot from Reporter
NameReporter ScheduleNoneEvery N hoursDailyCustom cron At17:00 Also start whenMessage from another bot ApprovalAsk first AccessRead: project, memory, documents · Write: documents, its own workspace
Create
Read merged pull requests since yesterday
Wrote docs/reports/daily.md
Daily report. 3 pull requests merged, 1 waiting on review. Nothing needs you today.
A bot from a template, then Run now · example

Templates

Every template comes with standing instructions (its soul.md), access limits and sometimes a schedule. Change anything before you create it.

TemplateJobSchedule
Chief of staffCoordinates the crew and talks to youDaily 09:00
ResearcherLooks things up and writes short notes (web browser)—
MonitorWatches a page and tells you when it changesEvery 60 minutes
ReporterSends a daily summary of what happenedDaily 17:00
InboxSorts incoming requests and drafts replies—
SocialDrafts posts and keeps an eye on replies—
SchedulerKeeps the calendar and reminders in order—
Data analystTurns spreadsheets and exports into answers—
Web scoutFinds sources and pages worth reading—
Note takerTurns conversations into clean notes—
Price trackerTracks prices and flags dropsDaily 08:00
Trend spotterSpots what is rising in a topic—
PlannerBreaks a goal into steps and tracks it—

Schedule kinds

In the appStored asRules
Every N hours{"kind":"every","minutes":120}1 minute to 7 days
Daily{"kind":"daily","at":"17:00"}Local time
Custom cron{"kind":"cron","expr":"0 9 * * 1-5"}Five fields in local time: *, numbers, ranges, */n steps and lists. Day of month and day of week match either, as in cron.

A bot can also ask you for a schedule from its chat. It proposes one, and nothing changes until you approve it:

crw bot schedule propose "cron 0 9 * * 1-5" "weekday stand-up notes before the 9:30 call"
crw bot schedule propose "daily 09:00" "morning summary"
crw bot schedule propose "every 90" "check the status page"   # minutes

What to do on each run is the message every scheduled run starts with. Leave it empty and the bot checks its tasks and carries on with its role.

Triggers and Run now

Besides its schedule, a bot can start when:

  • CI failure — a check fails in the project;
  • Labelled issue — an issue gets the label it watches;
  • PR review comment — someone comments on a pull request;
  • Message from another bot — a bot it accepts messages from writes to it.

To run a bot right now, open its row menu in the sidebar and pick Run now. A paused bot shows no Run now and ignores its triggers.

What a bot may touch

  • Access: reads of project files, project memory and documents; writes to documents and its own workspace. Enforced by the sandbox: any other write is blocked.
  • Approval mode: Ask first, Auto-accept edits, or Full access. Each scheduled run starts its agent without asking, and scheduled or bot-started runs never get more than the bot's own mode.
  • Computer: off (terminal only), a managed headless web browser, or a full Linux desktop in Docker. On a CAPTCHA, bot check or login wall the bot stops and asks you; it never tries to solve or bypass one.
  • Keys: a bot's key works only for its own chat. Bot-to-bot messages have hidden characters stripped and are limited to the bots you allow (“May message”).
  • Spend: the bot's card shows today's and the last 7 days' cost.
Scheduled tasks inside a chat

Separately from bots, the agent's CronCreate and /loop tools schedule work inside one chat (up to 50 jobs, with jitter). Those live with the chat. Lasting scheduled tasks the agent creates from a chat, with a card to toggle and run them, are on the roadmap Coming soon.

Around the agent · 8 of 16

Memory

Crewroom keeps what agents learn on a project, the decisions, the gotchas, the mistakes not to repeat, and hands the relevant pieces to the next task. Memory lives on your Mac, one store per project, and you can read, pin, correct or forget every entry. Rule files like AGENTS.md sit next to it for the things you want said every time.

How recall works

Memory is stored in Crewroom's local database, one per project. When a new task starts, the pinned entries and the entries that match the task go in front of its first prompt as a Project memory section, up to the size limit (1,500 characters by default). Entries marked wrong are never recalled. Nothing in your own agent config changes.

SettingDefaultWhat it does
memory_recallonOne switch: off means nothing is saved and nothing is recalled.
memory_recall_chars1500Size limit of the Project memory section (200–8000).
memory_model_recalloffLets a small model pick up to 5 entries per prompt instead of keyword ranking. Measured: finds more of the right entries (recall 0.63 → 0.95) but includes more wrong ones (precision 0.92 → 0.64), about 1.3 s and a cent or so per prompt.
memory_model_cents_day50Daily spend cap, in cents, for background memory jobs across projects.

Four kinds of entry

Decision“We store money as integer cents.”
Learning“The e2e tests need the dev server on port 5173.”
Mistake“Running migrations twice corrupts the seed data.”
Fact“Staging deploys from the release branch.”

Entries come from three places: the agent saves them with its memory tools, capture rules pick them up when a chat ends, and you add them yourself. Hover any message and choose Remember this, then Remember this as a type. Each entry records its source chat and evidence, and shows a tier: Observed, Human or Agent claim.

Recently learned, forget and correct

  • Recently learned lists what agents and capture rules saved lately, newest first. Agents use these right away; Forget takes one out of recall.
  • Pin an entry to recall it in every task; Mark wrong to keep it but never recall it; Edit or Delete it.
  • Select several and Forget selected; a preview lists exactly what goes.
  • Missed lists chats that ended without leaving anything in memory. Capture now reads that chat with your chosen model and adds what it finds to Pending.

Entries also age on their own:

StatusMeaning
StaleIts evidence no longer matches the code, so it is not recalled. Mark it active if it still holds.
ExpiredNot recalled or verified for 28 days, so it is no longer recalled.
UnsignedWritten outside Crewroom, so it is never recalled.
From repo textThe text came from repo files, commit messages, issue titles or tool output.

Sharing across projects

An entry belongs to its project. Share with all my projects lets every project on this Mac find and recall it, which suits habits and personal preferences. Promote to AGENTS.md turns an entry into a line in the project's AGENTS.md; you review the line first and nothing is written until you confirm.

Agents can also search your past chats with session_search (“find the chat where we fixed the login test”). It reads only redacted message text, from its own and granted projects.

Rule files

Rule files are instructions you write and want in every chat. Crewroom Agent reads, for each folder from the repository root down:

AGENTS.md
CREWROOM.md
.crewroom/rules/*.md
CLAUDE.md
.claude/CLAUDE.md
.claude/rules/*.md          (a file of the same name in .crewroom/rules wins)
AGENTS.local.md  CREWROOM.local.md  CLAUDE.local.md

And globally: your own ~/.crewroom/AGENTS.md, always. Claude Code's ~/.claude/CLAUDE.md (with ~/.claude/rules/) and Codex's ~/.codex/AGENTS.md load only when you opt in with Global rules (engine_global_rules: off, claude, codex or both). They are off by default because they often carry orders meant for that one tool.

Around the agent · 9 of 16

Dashboards

A dashboard is a board of small live widgets that an agent builds for you: describe what you want to see, and it writes the widget and the automation that keeps it fresh. Crewroom's own numbers (spend, agent activity, plan quota) are there as built-in widgets. Open Dashboards in the left rail.

The parts

PartWhat it is
DashboardA 12-column grid with up to 20 widgets, a name and a description the model reads when it updates the board. Each dashboard has its own edit chat.
WidgetOne index.html (up to 10 MB) drawn in a sandboxed frame. Drag it anywhere outside its buttons to move it; enlarge it, pin it, or delete it everywhere.
AutomationA task that produces the widget's data. Bound to a widget, it delivers each run's result to it.

The shapes follow Kimi's Blueprint tools, so skills written for those work here too. The same operations are open to the UI, the REST API and crw dashboard.

Built-in widgets and starters

  • Add a Crewroom widget: Tokens & cost, Agent activity, Plan quota.
  • New installs start with two sample dashboards to try: Dashboard basics and Hello Crewroom. A Daily Finance starter can be added too.

When automations run

TriggerShown as
Interval“Hourly”, or every N
Schedule (cron)“Daily at 08:00”, “Weekdays at 08:00”, or the cron line
OnceAt a date and time
ManualOnly when you press Run

The runner looks every 30 seconds and runs at most two automations at once. A slot more than a minute late is skipped, not caught up, and every run has a timeout. Each widget keeps its last 20 runs with their status (Succeeded, Failed, Running, Cancelled); View task opens the chat that ran it.

Around the agent · 10 of 16

Cost view

The Usage page shows what you spent, where the tokens went, and what is wasting money, with a one-click fix where one exists. Plan limits always show as how much is left. Numbers Crewroom can measure are labelled as measured, the rest are marked as estimates, and nothing is dressed up.

Usage
SummaryAdvancedSummaryAdvanced
Spend
$42.18
last 7 days, vs $51.02 the 7 days before
By provider
Anthropic $19.40 · OpenAI $10.12 · DeepSeek $7.59 · OpenRouter $5.07
71% of 4.2M prompt tokens came from the cache · Plan limits: ChatGPT 62% left
Where the tokens come from
estimatedSystem prompt$6.12
estimatedTools and MCP$8.47
estimatedTool results$9.80
estimatedMemory$0.94
Subagents$3.21
$ needs new trackingRetries4 turns
Covers $31.40 of $42.18 spent: Crewroom Agent chats only
Top waste
FixExample finding from CodeBurn~$6.40 / 30 daysApplyApplied
Apply this fix?
CodeBurn makes this change itself. It backs up every file it touches, and Undo here puts them back. CodeBurn will change: CLAUDE.md
CancelApply
Waste · Health grade B
CodeBurn's 21 checks over 30 days, re-measured each run
Applied fixes
AppliedExample finding from CodeBurn
today · applied
–Undo
Summary, Apply, then Advanced · example numbers

Summary

Open Usage from the sidebar (or the rail when the sidebar is folded). The Summary tab answers “what did I spend, and on what”:

  • Spend for the selected days, compared with the same number of days before.
  • Where it went: input, output, cache read and cache write, in tokens and dollars; the share of prompt tokens that came from the cache; and By provider, one bar and one legend from the same provider list.
  • Where the tokens come from: the categories below.
  • Top waste: up to three findings, ranked by estimated dollars saved.
  • Plan limits: always “N% left”, never “% used”.

Categories, “estimated” and “needs new tracking”

Where the tokens come from splits every chat active in the period, over its whole life, into categories. Only Crewroom Agent chats can be measured this way, from the engine's own context breakdown; other agents report their totals only. A coverage line says how much of the spend that is: “Covers $X of $Y spent: Crewroom Agent chats only”.

CategoryLabelWhy
System prompt, Memory, Tools and MCP, Skills and agents, Tool resultsestimatedSplit from each request's measured size by its share of the prompt.
Compaction and backgroundestimatedSummaries and background calls, with the number of compactions.
SubagentsdollarsHelper runs are recorded with their own cost.
Files read$ needs new trackingRe-reads and lines skipped are counted (with the read proxy on); their dollar cost is not tracked yet.
Retries and failed$ needs new trackingFailed and interrupted turns are counted, not priced yet.
Other agentsnot measurableClaude Code, Codex and others: their totals only.

Advanced

Advanced goes deeper: Memory and Tools and MCP in detail, the full Waste list with CodeBurn's Health grade (its 21 checks over the period, measured again on every run) and the Applied fixes history with Undo, Cache and time, Plan limits in detail, the ledger, run numbers and the context weight card. Each chat's row shows its cost in the selected days; its drawer shows the full cost of the chat.

Waste findings, Apply and Undo

Findings come from CodeBurn. Each one is tagged Fix, Habit or FYI, says whether it is improving or still happening, and estimates the saving per 30 days.

  1. Apply appears only when CodeBurn can make the change itself. A dry run first lists the files it will change.
  2. You confirm. CodeBurn backs up every file it touches, makes the change, and the finding shows Applied.
  3. Undo, in Advanced › Applied fixes, puts the files back. If a file changed since, CodeBurn's own refusal is shown.

A finding CodeBurn cannot apply from here gets Ask agent, which starts a chat with the finding and asks the agent to show each edit before making it. An FYI finding gets Review.

About CodeBurn

CodeBurn is a separate, open-source spend analyser that Crewroom runs for spend by day, token kinds, models, the waste findings and their fixes. Without it the page says what is missing (“CodeBurn is not installed: spend by day, token kinds and models need it”) and the per-chat numbers Crewroom measures itself still show. CodeBurn never runs in the daemon's own folder.

Inside a chat

The ring in the composer shows how full the context is, with the numbers on hover. The chat's cost breakdown splits it by item: Main agent, Compaction summary, Page summary, Advisor and Second opinion.

The biggest single lever on an Anthropic key is the prompt cache length; the next is keeping rule files and MCP tool lists short, which the Tools and MCP category makes visible.

Around the agent · 11 of 16

Phone app

The Crewroom iPhone app connects to the Crewroom on your Mac, so you can follow chats, answer approval cards and steer the agent while you are away from the desk. Nothing runs on the phone: the work stays on your Mac, and the phone only gets what you allow it.

Preview

Today the app is built from the repository's mobile/ folder onto your own iPhone. An App Store release is not out yet Coming soon.

Pairing

  1. Turn on remote accessOn the Mac, open Settings › Phone & remote and turn on Let your phone control this Mac. It is off by default.
  2. Choose where to listenAutomatic uses Tailscale first, then your local network. This Mac only is for a tunnel you run yourself.
  3. Scan the QR codeScan it with the phone. The Mac shows Allow “iPhone”? with a code; check that your phone shows the same code, then press Allow.
  4. Set its rightsEach phone gets its own rights: Read, Operate, Approve, Source control, Terminal. Every phone action is logged with the device name.
Not encrypted on a plain network

Crewroom serves plain HTTP, so anyone on the same network could read the traffic. Use Tailscale, which encrypts the link, or a home network you trust, and never forward the port on your router.

Access from anywhere

To reach your Mac when you are out, turn on a tunnel you already have: Tailscale (only your own devices), Tailscale Funnel (public internet) or a Cloudflare quick tunnel (public internet; the address changes each time, so phones pair again). Crewroom never installs anything or signs in for you. Remote access turns itself off after a set number of hours unused (12 by default).

What you can do

ScreenWhat it does
HomeYour chats on that Mac and what each is doing.
ChatThe live chat with its step rows and plan card. Messages go out as Steer or Queue, like on the Mac; written offline, they wait in an outbox and send when the phone reconnects. Dictation works in the message box.
ApprovalsApproval cards open as a sheet with the same Allow once, Always allow and Deny. Questions from the agent open as their own sheet.
New taskStart a task on any project.
Board, Changes, Usage, SettingsRunning work, a chat's changes, plan limits and spend, and the phone's own settings.

Secret cards can only be answered on the Mac; the phone shows “Answer this on your Mac”. Memory is read-only on a phone.

Notifications

Approvals and finished tasks can reach the phone's lock screen through Apple's push service. This needs your own APNs key: create one at developer.apple.com, save the .p8 file where Settings › Phone & remote shows, and enter its Key ID and your Team ID.

Reference · 12 of 16

Keyboard shortcuts

Every shortcut below is a default from the app's own shortcut table. Change any of them in Settings › Keyboard shortcuts; Crewroom stores only the ones you changed, so new defaults still reach you. Punctuation shortcuts match the typed character, so ⌘ [ works on layouts like German where [ needs ⌥.

General

ActionKeys
Command palette (also searches inside chats)⌘ K
New task⌘ N
Open settings⌘ ,
Toggle sidebar⌘ B
Toggle terminal⌘ J
Show or hide details⌘ I
Toggle theme⇧ ⌘ L
Add project⇧ ⌘ O
Zoom in / out / actual size⌘ = · ⌘ - · ⌘ 0
Open DevTools⌥ ⌘ I

Moving around

ActionKeys
Back / forward through visited chats and views⌘ [ · ⌘ ]
Open chat 1–9 in the sidebar⌘ 1 … ⌘ 9
Open project 1–9⌥ ⌘ 1 … 9
Previous / next session⇧ ⌘ ← · ⇧ ⌘ →
Jump to the next chat waiting on you⇧ ⌘ J
Toggle board / sessions⇧ ⌘ B

In a chat

ActionKeys
SendEnter (or ⌘ Enter, in Settings › General › Send with)
Mid-turn: do the opposite of your Steer / Queue setting⌘ Enter
Send and start the next task⇧ ⌘ Enter
Find in chat⌘ F
Toggle side chat⌘ ;
Composer: model · effort · access · workspace⇧ ⌥ ⌘ 1 · 2 · 3 · 4
Add scheduled task⇧ ⌘ D
Rename / pin / archive session⌥ ⌘ R · ⌥ ⌘ P · ⇧ ⌘ A
Open the worktree in your editor⌘ O

The right panel

ActionKeys
Panel: Terminal · Changes · PreviewCtrl 1 · Ctrl 2 · Ctrl 3
Focus terminal / leave the terminalCtrl ` · ⌘ Esc
Close the pane, page or window⌘ W
Reopen closed tab⇧ ⌘ T
Go to file (in a diff)⌘ P
Toggle annotation mode (browser)⇧ ⌘ .
Open a surface from the empty panel, when not typingB browser · T terminal · F files · D diff · P pull request · L linked PRs · A agents · M device · I iOS Simulator · O logs · C console

On the board, Enter opens a lead's chat and Space opens the focused task. Both belong to the crew features, which are off by default.

Reference · 13 of 16

Settings reference

Settings are grouped the way the Settings window groups them: Personal, Agents, Integrations and System. The tables list the settings that change how the agent behaves, with the key Crewroom stores, its default and what it does. Keys outside this list are refused by the settings API, so this is the whole surface for those areas.

The Settings window

GroupTabs
PersonalGeneral, Appearance, Notifications, Voice, Keyboard shortcuts, Phone & remote
AgentsAgents, Skills & commands, Sessions, Providers, Memory
IntegrationsPlugins & MCP, Git & pull requests, Browser, Computer access
SystemFeatures, Data & storage, Advanced, Doctor, About

The search box at the top of Settings finds a row on any tab.

Agent behaviour

KeyDefaultWhat it does
default_model / default_effort—The model and effort new chats start on.
default_approvalaskHow new tasks start: ask (Ask first), auto-safe (Auto-accept edits), auto-review (Auto), auto (Full access).
followup_modesteerWhat sending mid-turn does: steer or queue.
send_keyenterenter or mod_enter; the other key adds a new line.
step_limit100Tool steps per turn before the agent asks to keep going (0 = no limit).
step_limit_unattended1000The same for background helpers, bots and goals.
auto_compactmodel's limitWhen context is compacted: empty (the model's limit), off, a percentage such as 80%, or a token count.
idle_compact_hours6A 100k+ chat idle this long is compacted on the next send (0 = off).
idle_compact_preonCompact a quiet 100k+ chat before its 1-hour prompt cache expires.
cache_policyautoAnthropic prompt cache: auto, 5m, 1h (plus simple, smart for experiments).
engine_global_rulesoffAlso load Claude Code's and/or Codex's global rule files: off, claude, codex, both.
engine_output_style—Output style; a project's own setting wins.
subagent_model—Model for helpers; empty uses the parent's.
fallback_model—Backup model when a plan or key runs out mid-task.
classifier_model—Auto mode's safety model; empty uses the chat vendor's smallest.
redact_tool_secretsonMask keys and passwords in tool output before the model sees it.
verify_before_finishonAsk non-Claude models once to run the checks before finishing.
search_backendautomaticWeb search for models without their own: firecrawl, tavily, exa, searxng, brave, duckduckgo.
goal_max_turns / goal_max_cents / goal_max_minutes50 / 0 / 0Stops for a runaway /goal (0 = no limit).
engine_unattended_modebypassPermissionsWhat unattended runs (bots, schedules, headless) start in; auto is opt-in.
agent_teamsoffNamed teammates that message each other.

Engine and sessions

KeyDefaultWhat it does
engine_transporttmuxpipe runs each chat's engine as a child process over fd 3 (see the engine). The pipe engine becoming the default is Coming soon.
engine_idle_minutes60Stop an idle pipe engine after this many minutes (0 = never).
max_concurrent_sessions4How many agent sessions run at once (1–32).
auto_archive_days0Archive chats inactive this long; never a running one, uncommitted work kept on its branch.
worktree_clean_days14Remove idle worktrees of archived sessions after this many days.
keep_awake / keep_awake_ac_onlyon / offKeep the Mac from idle sleep while agents work, optionally only on power.
show_context_usageonThe context ring in the composer.
crew_featuresoffOther agents, board, leads and reviews. Off runs Crewroom Agent alone.

Memory, notifications, network

KeyDefaultWhat it does
memory_recallonSave and recall project memory.
memory_recall_chars1500Size of the Project memory section.
memory_model_recalloffModel-picked recall instead of keyword ranking.
away_summary_enabledonA short recap when you come back after 5+ minutes away (recap_cents_day 25¢ cap).
notify_needs_you, notify_done, notify_error, notify_usageonMac notifications by kind; notify_sound is off.
webhook_event_*offSend needs_you, done, error and limit events to your webhook.
remote_enabled / remote_idle_hoursoff / 12Phone access, and when an unused tunnel turns off.
catalog_refreshoffTwice-daily model prices and benchmarks; the first run asks.
update_checkonThe desktop app's update check.
warp_spendoffCount Warp's spend (macOS asks for access to Warp's data).
telemetry_enabledoffLocal diagnostics only; nothing is sent anywhere.
languageenen or de.

Settings files

Besides the app's own settings, Crewroom reads the files other agents use, so one setup works everywhere:

FileHolds
~/.crewroom/settings.jsonYour permission rules, MCP servers, hooks, per-tool MCP choices, and the outside-the-guard lists.
~/.crewroom/mcp.json, ~/.crewroom/AGENTS.mdYour MCP servers; your rules for every chat.
.crewroom/settings.json, .crewroom/settings.local.jsonA project's shared and private settings.
.crewroom/mcp.json, .crewroom/agents/, .crewroom/rules/A project's servers, helper types and rule files.
~/.claude/settings.json, .mcp.json, .claude/agents/…Claude Code's files, read (never edited) with the same meaning.
Reference · 14 of 16

Architecture

Crewroom is a local system of a few small parts: a background daemon that owns state, one engine process per chat, a window and a phone that only talk to the daemon, and the guard around everything that runs commands. This page shows how they fit and where each one lives in the code.

How the parts connect

The whole system

Your devices Desktop appTauri shell · React UIbrowser and terminal panelsdesktop/ web/src iPhone appTailscale, LAN or tunnelmobile/ Command linecrw modelscrw mcp · crw bot DaemonBun · 127.0.0.1 · random token api HTTP + WebSocket engine-host engines, fd 3 queue inbox, steer permission approval cards secrets keys, sign-ins facts crash resume memory recall, capture bots schedules dashboards automations usage cost, CodeBurn remote phone pairing Crewroom homecrewroom.db secrets/sessions/<id>/engine.log Seatbelt box, per chat Engine (Crewroom Agent) loop turns, retriesprovider one wire per familytools Claude Code / Codexagents helperscompact summaries Shell guardcommands, MCP servers, hooks Chat log (.jsonl)append-only, one writer MCP serversstdio (guarded) or HTTP Your projectyour folder or a worktree Other agent CLIsClaude Code, Codex… (tmux) Model providersplans, API keys, local fd 3 writes only here model calls
The accent lines are the per-chat protocol. The daemon is the only part that holds keys and the database; engines and everything they start stay inside their box.

The parts

PartCodeJob
Desktop appdesktop/src-tauri, web/srcA Tauri shell, code-signed (notarization coming soon), around the React UI. Owns the window, menus, notifications, the built-in browser and the terminal panel.
Daemonsrc/daemonBun server on 127.0.0.1 with a random token. Owns the database, keys, sign-ins, queue, approvals, memory, bots, dashboards, usage and phone access.
Enginesrc/daemon/engineCrewroom Agent: the model loop, provider wires, both tool sets, sub-agents, MCP clients, compaction and the permission gate. One process per chat.
Guardsrc/daemon/seatbelt.ts, engine/permissionsSeatbelt profiles for the engine, its commands, MCP servers and hooks; danger checks and rules.
Phonemobile/Expo iPhone app; pairs with the daemon and goes through one gate for every byte it gets.
Command linecrw (src/cli.ts)crw models, crw mcp, crw bot, crw dashboard, crw agent and more.

One message, end to end

  1. The window posts your message; the daemon stores it in the chat's inbox.
  2. The daemon starts the chat's engine if it is not running (single start, waiting for a dying one to exit), then sends turn/start over fd 3.
  3. The engine writes a turn-start line and your message to the log, then calls the model with a credential it asked the daemon for.
  4. Tool calls run in the engine; shell commands, MCP servers and hooks run under the guard. Anything that needs you becomes a request to the daemon, which shows a card and writes your decision.
  5. Each finished item is appended to the log; the daemon reads the new bytes, updates its index and pushes chat items to the window and phone.
  6. At the turn's end the daemon marks the message delivered, sends notifications, and starts the next queued message if there is one.

What talks to the network

  • The engine, to the model providers you connected (and web search, MCP servers and pages the agent opens).
  • The daemon, for model lists of connected providers, and, only when you turned them on, the price catalogue and the update check.
  • Paired phones, over the address you chose. Remote access is off by default.
  • Webhooks, only to the address you set.
Project · 15 of 16

Roadmap

What is queued next, grouped by area and in plain words. Everything here is planned, not shipped; anything elsewhere in these docs marked Coming soon is listed here too. The order inside a group is roughly the build order.

Engine

  • The pipe engine becomes the default for new installs, then the old terminal-pane path is removed.
  • Helper runs and one-off background runs move to the pipe engine too.
  • Start a chat's engine while you type, so the first reply after an idle stop does not wait.
  • Approval cards and scheduled wake-ups that survive a restart.

Safety and updates

  • Keys in the macOS Keychain.
  • The built-in updater (signed updates).
  • Mask secrets you type or paste into the chat, for safe screenshots.
  • Sandbox switches in Settings, and MCP sign-ins for bots inside the box.

Models and providers

  • Your own Claude plan, through your own claude program; other agents through ACP.
  • Providers screen: search, sign-in cards on top, key and usage links, an on/off switch per connection, status with “% left”.
  • More sign-ins (Qwen, MiniMax, Nous Portal and others) and custom prices for models without one.
  • Prompt-cache markers on OpenRouter and Qwen, and OpenAI's 24-hour cache for GPT chats.
  • AWS Bedrock, Azure Foundry and Google Vertex, on request.

Chat and composer

  • Answer the agent's multiple-choice questions right in the chat.
  • Live output inside a running command's card.
  • Quote part of a reply into the message box; park a half-written prompt.
  • Transcript views (Normal, Thinking, Verbose) and chapters for long chats.
  • Send one prompt to several models at once, each in its own chat.

Changes and git

  • See the changes of any earlier turn; find inside the changes view.
  • Generated commit messages and pull-request text; branch names from the task.
  • Pull-request panel: merge when ready, review threads in the diff.

Usage and cost

  • “% left” that updates live during a turn, and one bar per provider across accounts.
  • “What's using your limits?”: the top causes over a day and a week.
  • A per-reply inspector: the exact prompt, tools and tokens of each model call.

Bots and schedules

  • Lasting scheduled tasks the agent creates from a chat (“every Monday…”), with a card to toggle and run them.
  • Run history, missed-run notices, pause after repeated failures, and waking the Mac for a scheduled task.

Reach

  • Crewroom Agent inside other editors (Zed, JetBrains) over ACP.
  • The iPhone app on the App Store, with its document viewer.
  • Later: work modes for docs, research, data and design; a design canvas; Windows.
Project · 16 of 16

Changelog

The recent stable builds and what changed for you in each, newest first. Each build is a tagged commit that was installed and checked before it was tagged. Test-only and internal changes are left out.

stable-1104c Nov 4, 2026

  • Reopen closed tab (⇧ ⌘ T) also brings back a panel that a header toggle folded.
  • Forward (⌘ ]) shows the view it recorded; the Usage row is lit only while Usage is open.
  • The “requests are slow” clock stops while the window is hidden.

stable-1104b Nov 4, 2026

  • Crash resume: a turn that died before your message reached the log runs that message again, with no extra note.
  • Approval cards across restarts: when the daemon stops with a hook's card open, the card expires on the next start instead of the turn auto-continuing past it.
  • Cost view: a coverage line under the categories (“Covers $X of $Y spent: Crewroom Agent chats only”); the spend legend uses the provider bar's list.

stable-1104a Nov 4, 2026

  • New cost view: Summary and Advanced; cost per chat in the selected days with the full cost in its drawer; per-chat categories from the engine's own context breakdown; tokens and cache split per chat.
  • Waste fixes through CodeBurn: a dry run before Apply, its own Apply and Undo, plain errors; fixes to CLAUDE.md and project files go to an agent.
  • Insights keeps token kinds apart, with dollars per kind, model, task type and sub-agent; model rows add up to spend. The heatmap tab and two tile rows are gone.
  • Stop is final: a Stop before a turn's request goes out cancels it, so a crash's re-delivered turn no longer starts after Stop.
  • Nothing left behind: the pipe engine leads its own process group; on stop or quit the whole group gets SIGTERM, then SIGKILL after a second. Claude Code and Codex panes get time for their end-of-session hooks.
  • Models: Gemini's thought signatures are kept on tool calls; effort is sent to Gemini, GLM and DeepSeek in their own request shapes; Gemini 3+ and GLM-5.3 get room to think on short calls.
  • One ask, one card: the Details view links to the chat's approval card instead of repeating its buttons.
  • Polish: the chat scrollbar shows; one Enter glyph everywhere; a focused sidebar row shows only a ring; disabled buttons dim once; the built-in browser caps reloads.

stable-1103f Nov 3, 2026

  • Prompt cache choice: Automatic, 5 minutes or 1 hour on the Anthropic connection and its key form.
  • Idle compaction before the cache expires: a quiet 100k+ chat on a 1-hour cache is compacted at 90% of the hour, in one request over the warm cache. A send stops it; a failure is logged, never shown.
  • Reply options: a reply that ends on a real choice shows its 2–6 short options as buttons under it; a click sends one.
  • Link cards: links in your message and the reply's sources show as result rows; titles and favicons only for pages the agent actually opened.
  • Named web steps: step rows say “Read <site>”, “Searched the web for …” with result rows, “Opened <site>”, “Built page …”.
  • The Usage button sits above Settings in the rail while the sidebar is folded.

stable-1103e Nov 3, 2026

  • Shell guard v2: writes are an allow-list (the working folder, the chat's folders, temp, and the package caches) with Claude Code's mandatory denies inside; no creating or writing .git; whole cache folders and ~/.ssh/known_hosts writable so installs work.
  • Tool servers and hooks in the guard: every stdio MCP server you configure and every hook runs under it; Run outside the guard for your own user-scope entries, saved per exact entry.
  • MCP approvals say plainly when a project entry pulls a key-shaped environment variable; a guard refusal is flagged on the server's row.
  • Search inside chats: the command palette finds chats by their words and opens them at the message; agents get a session_search tool.
  • Keys on any layout: zoom with ⌘ =, back and forward with ⌘ [ ] by character; ⇧ ⌘ T reopens a closed pane.
  • Crewroom's own git calls (commit, push, merge, worktrees…) run with hooks and filters off, so a planted hook never runs.
  • An agent's edit to a slide no longer opens it as a page over the deck.