Skip to content
GitHubBook a demo

Start here

Browser app

Run threads, review findings, change settings and themes in the local browser app, or run the same app headless.

Terminal window
0

0 (or 0 web) starts the app on this computer. No account is needed. It binds to 127.0.0.1:48123 by default.

FlagDefaultEffect
--port <port>48123Port to bind. 0 picks a free loopback port.
--host <host>127.0.0.1Loopback address to bind (127.0.0.0/8 or ::1).
--no-openStart without opening a browser.
--db-path <path>local storeSQLite database for findings and runs.
--ready-jsonPrint the bound URL as JSON, for scripts.

Run 0 web --help for the full list.

The sidebar holds:

  • New thread, search and your thread history.
  • Findings, with a count of open findings.
  • Automations.
  • Explore: the catalog of plugins, skills and themes. Skills and Plugins open from its tabs.
  • More…: Memory, and Computers once a remote computer is connected. You can manage computers any time under Settings → Computers.
  • Your Agents, when this computer supports them.

Two cards can appear above the account row, for local users and team owners:

  • Finish setting up has two steps: connect a model provider and start your first thread. It hides once both are done, and you can dismiss it.
  • Update available shows the latest and current versions. Copy update command copies 0 doctor upgrade. Dismissing it hides that version only.

Press ? outside a text field to see every shortcut, or open Settings → Shortcuts for a searchable list. On Linux and Windows, use Ctrl instead of ⌘.

ShortcutAction
⌘K or /Search anything
⌘,Open Settings
⌘B or ⇧⌘SShow or hide the sidebar (⌘B is bold while typing)
⇧⌘BShow or hide the right panel in a thread
⇧⌘ONew thread
⌘.Stop the running thread
⌘IFocus the composer
⌘/Attach files
⇧⌘F, ⇧⌘E, ⇧⌘G, ⇧⌘L, ⇧⌘VOpen Findings, Evidence, Fixes, Browser or Visuals in the thread panel
Enter, ⇧EnterSend, or insert a new line
  1. Press New thread.
  2. Pick a folder if the job involves code.
  3. Choose a model with the model picker under the composer. Connect a provider first if the list is empty; see Models and keys.
  4. Describe the job in plain words, for example “Review this repo for auth bypasses and verify anything you find”.
  5. Watch tool activity and agents in the transcript. Findings land in Findings.

The composer also has:

  • Add to message: attach images or text files, or reference a file path.
  • Thinking effort, for models that support it.
  • Mode: whether the agent asks before it acts. See below.
  • Slash commands. Type / to list them. For example /model, /connect, /findings, /skills, /doctor and /explain.
ModeCLI nameBehavior
Act without askingyoloRuns tools without per-action prompts. The default for new threads.
Ask before actingstandardAsks you to approve each action.

Switching to Act without asking also resumes actions waiting for approval. Scope grants, folder grants and questions the agent asks you stay separate decisions. Existing threads keep their mode until you change it. Credential, private-network and sandbox protections apply in both modes.

A message you send during a response is queued. It goes out when the current response finishes, so the agent’s work is kept. Press Send now on a queued message to interrupt and send it at once. Press Stop response to stop.

Background agents that a thread starts keep running after its response ends. Stop them from the agents panel. They belong to the live thread and do not survive a computer restart.

If a model connection drops, the thread reconnects and continues from its last completed tool result. Completed tool actions are not replayed.

The agent has a web_search tool and decides when to use it. Queries go to Parallel’s anonymous hosted search, with DuckDuckGo as a fallback. No search key is needed. Results are links and snippets, not proof a page was read in full.

Set ZERO_FEATURE_WEB_SEARCH=0 on the computer to turn search off by default. This controls the search tool only, not all network access.

With Act without asking, the agent can clone a public HTTPS repository to review it. Cloning does not add the hosting service to your scope. Scope exclusions and private-network restrictions still apply. See Scope and authorization.

The Daybreak control next to the model settings requests an OpenAI cyber access program (Daybreak Blue or Daybreak Red) for eligible OpenAI and ChatGPT Codex connections. Automatic clears the request. See Models and keys.

Memory holds notes the agent saved while reading source code. Each entry records its folder and supporting files with content fingerprints. Before an entry is reused, 0 checks those files. If a file changed or is missing, the entry is skipped.

  • Open Supporting files on an entry to see its evidence.
  • Press Stop using to keep an entry out of future context. The record stays for inspection.

Memory entries are hints for the agent to check again, not verified findings. A finished thread does not become an entry on its own. Memory lives in the computer’s private state, outside your repository, and are sent to your model as context when recalled. Set ZERO_DISABLE_HUNT_MEMORY=1 on the computer to turn source memory off.

The agent can put a visual in a thread with its visualize tool: an attack path, an incident timeline or a table of findings. Visuals are saved with the thread and replay when you reopen it.

kindUse for
graph, attack-graphNodes and edges (hosts, services, identities, vulnerabilities, steps) with optional severity. Layouts: layered, force, radial.
chartbar, line, area, pie or stacked.
timelineDated events.
tableColumns and rows.
mermaidSequence or flow diagrams.

Every visual has a title and a summary. The summary is the alt text and states the conclusion. A thread holds up to 200 visuals. A visual that is too large fails validation and the model retries with less data; nothing is truncated silently.

Visuals are plain data, never HTML. Markup, URLs and control characters are rejected. A node can reference a finding, a file or an agent, never a URL. The app sanitizes Mermaid. Target content is attacker-controlled, so the agent is told to shorten labels and not copy target text.

A saved thread opens at /chats/saved/<id> in the same view as a live one, with its transcript, work log and panels. Opening it does not start any work. It stays read-only until you send a message, which resumes it. Rename, clear, close and model change wait until then.

Use thread history or ⌘K search to find older work. Search matches message text and metadata, ranks relevant matches first and skips tool payloads and private reasoning.

Open Settings (⌘,). The search box looks inside pages as well as at their titles.

GroupPageWhat it controls
PreferencesGeneralUpdate policy, input behavior, privacy (usage metrics and problem reports), support, status and one reset for shared preferences.
AppearanceTheme, mode, accent color, font size and reduce motion. This browser only.
ThreadsSummarizing long threads, title instructions, idle archiving, subagent limits, transcript options and one Show cost and usage switch.
NotificationsBrowser notifications. This browser only.
ShortcutsThe searchable shortcut list.
AgentInstructionsYour own AGENTS.md text for every thread, plus one file per folder.
ModelsProviders (keys and sign-ins, see Models and keys), the default model and per-role models.
AgentsAgent collaboration and messages, model-authored plugins and where tools run.
ComputersThe machines threads run on.
Git and pull requestsThe GitHub connection, reachable repositories and the pull requests this computer opened.
ActivityUsageEstimated spend and tokens by model and by thread.
Audit logApprovals, denials, settings, plugin and provider changes. Searchable, with JSON export.
MembersTeam mode only.

The folder and permissions page opens at /project. Checks that the computer, provider and tools work open from General → Status → Details (/doctor).

Settings → Appearance → Theme opens the theme gallery. Explore → Themes shows the same gallery. Themes: Zero (the default), Dracula, Nord, Solarized, Catppuccin, Tokyo Night, Rosé Pine, One, GitHub and Gruvbox. Each has a light and a dark variant.

  • Mode: System, Light or Dark. New browsers start on Dark.
  • Accent color: orange, blue, green, violet, rose or neutral. Only the Zero theme takes an accent; other themes bring their own.
  • Font size: Small, Default or Large.
  • Reduce motion: System, On or Off.

Themes are stored in the browser. The computer and the CLI never see them.

  • Messages while working: queue your next message or interrupt the response.
  • Thread title instructions: guidance for automatic titles, such as a language or style, up to 500 characters. Credentials are still redacted.
  • Archive idle threads after: Off, 7, 14, 30 or 90 days. Runs when the computer starts. Archived threads stay searchable.
  • Concurrent subagents (1-128, default 32), Nested subagent depth (1-16, default 8) and Subagents per call (1-4096, default 1024). ZERO_SUBAGENT_CONCURRENCY, ZERO_SUBAGENT_MAX_DEPTH and ZERO_SUBAGENT_MAX_FANOUT override them. A project may only lower them. See Configuration.

Settings → Instructions edits two Markdown files you own, each up to 32,000 characters:

  • Global: ~/.0/AGENTS.md, for every thread.
  • Folder: one file per folder under ~/.0/workspaces/.

When a thread starts, both are added to its system prompt in a block marked as trusted operator instructions, global first. AGENTS.md or CLAUDE.md files inside a target repository are never loaded. Whoever wrote the target controls that text.

Turn on Notify me to get browser notifications when a thread finishes, needs your approval or asks a question, when a scan finishes, and when a fix is ready or a pull request opens. Notifications are off by default. By default they fire only while the tab is hidden and play a sound. Your browser must allow notifications. Nothing leaves the browser.

The GitHub card shows who is connected (Connected as <user> via GitHub CLI), what is missing (Needs permissions: repo) or Not connected, and the computer it applies to. Everything runs on that computer through the GitHub CLI (gh). 0 never reads, stores or sends a token to the browser.

Connect with one of these, in this order:

  1. GitHub CLI login. If gh auth status is already signed in on the computer, 0 uses it. A login without the repo scope shows gh auth refresh -s repo and an Update permissions button.
  2. Sign in with GitHub. Runs gh auth login --web --scopes repo,read:org on the computer, shows the one-time code and an Open GitHub button, and ends after five minutes or on Cancel. If gh is missing the card shows brew install gh and a link.
  3. Fine-grained token. Create token on GitHub opens a prefilled token page (contents and pull requests: write, metadata: read). Paste it; GitHub CLI checks it before it is saved, and the expiry is shown when GitHub reports one.

A login from GH_TOKEN or GITHUB_TOKEN is shown as via token.

The page also lists the repositories the account can reach (cached for five minutes) and the agents that use them. A published fix goes to a new branch and opens a pull request against the repository’s current branch. 0 does not track whether a pull request is merged.

0 lab console --print runs one prompt through the same app process and exits. There is no interactive terminal UI; 0 lab console without a prompt prints a pointer to the browser app.

Terminal window
0 -p "Review the selected repository" --mode standard
0 lab console --print "Summarize the open findings" --format json
printf '%s' 'Summarize the selected findings' | 0 lab console --print

0 -p is short for 0 lab console --print. Useful options:

OptionEffect
--format <text|json|ndjson>Output format. Default text.
-m, --model <id>Model to use.
--mode <mode>standard, recon, copilot or yolo. Default yolo.
--target <url>, --scope <file>Target and scope policy for the run.
--finding <id>, --finding-intent <intent>Focus on one saved finding: investigate, verify, draft_fix or impact.
--max-tool-calls <n>Tool-call rounds per message. Unlimited by default.
--resume <id>, --continueContinue a saved thread by id or prefix, or the most recent one. 0 -r <id> and 0 -c are shortcuts.

Headless runs have no approval dialog. A task that needs a human decision cannot finish there; open it in the browser.

Send a prompt to a thread that is open in a running app:

Terminal window
0 lab console --chat <id> --format json \
--print "Summarize the retained findings"
0 lab console --chat <id> --engine staging --format ndjson \
--print "Continue the investigation"

The thread keeps its own model, scope and mode, so local --model, --mode, --target and --scope flags are rejected. Pending decisions are reported, not approved. JSON prints one result; NDJSON prints computer events, then the result.

Manage live threads with 0 threads list, show, create, send, continue, cancel, force-stop and events. 0 threads cancel <id> requests a stop; the thread reports cancelling until its work drains. See Computers and teams for --engine.

0 threads does what the thread menu does, against the app started by 0 web:

Terminal window
id=$(0 threads start "Map the login flow" --folder ~/code/app --mode recon)
0 threads set "$id" --effort high
0 threads stop "$id" # --force if owned execution does not drain
0 threads retry "$id"
0 threads rename "$id" "Login flow"
0 threads export "$id" --format md -o login-flow.md
0 threads delete "$id" --yes

start --wait blocks until the turn ends and prints the reply. clear and delete need --yes. Every command takes --json. Exit code 0 means success, 1 means the request failed, 2 means a usage error. A remote token cannot change settings the browser protects.

0 api calls the app’s backend HTTP API with the computer’s normal authentication and approval checks. Keep the token in an environment variable, not on the command line:

Terminal window
export ZERO_AGENT_TOKEN="$(openssl rand -hex 32)"
0 web --no-open --engine-token-env ZERO_AGENT_TOKEN --ready-json
# From another shell with the same token variable:
0 api /api/console/sessions \
--engine-url http://127.0.0.1:48123 --engine-token-env ZERO_AGENT_TOKEN

The default method is GET. Use --method and --data <json-or-@file> (at most 1 MB) for writes. Responses look like { "ok": true, "status": 200, "data": ... }. Exit code 0 means the request succeeded, not that a queued operation finished; poll the resource to check.

  • Local means tools run on the computer host. Your model endpoint can still be remote. Where tools run and which model you use are separate choices.
  • A provider connection does not authorize a target. Scope and tool isolation are separate.
  • A source build serves the app from built assets. Rebuild after changing source.