Data ingestion

Branchmore reads the session logs your coding agents write to disk. This page covers what the bmor CLI does on your machine, what Branchmore collects in Full Mode and Stats Mode, how bmor removes secrets before anything leaves, how we use AI, how to limit what we collect and how we use it, and how long we keep what arrives. It describes what the code does today.

Last updated October 4, 2026

How to install, update, and remove bmor, and how releases are verified, is covered on Installation.

#What runs on your machine

bmor is a single binary. It doesn't wrap your agent, proxy its API calls, or sit anywhere in the request path. Your agent talks to Anthropic, OpenAI, or Cursor exactly as before. bmor init registers hooks in each agent's own config so the agent calls bmor when a session starts and ends:

AgentFile bmor editsHooks
Claude Code~/.claude/settings.jsonSessionStart, SessionEnd, and the statusLine command, which is where rate-limit data comes from
Codex~/.codex/config.tomlSessionStart, Stop. bmor init also sets hooks = true under [features], and Codex runs the hooks only after you approve them with /hooks.
Cursor~/.cursor/hooks.jsonsessionStart, sessionEnd

When a session starts, the hook spawns a detached background process that uploads anything left over from earlier sessions, so your agent never waits on our network. When a session ends, bmor strips and scans that session's log and uploads it. If the upload fails, it's retried at the next session start.

bmor keeps its settings, your login, and its logs in ~/.branchmore.

#Full Mode and Stats Mode

Branchmore has two modes, and you choose one when you run bmor init. Full Mode is the default, and it's the one we strongly recommend.

  • Full Mode gives you all of Branchmore. We collect your conversations, with the bulky and sensitive parts taken out on your machine first. They power every feature, including Chat Transcripts, session titles and summaries, and Tool Call Safety.
  • Stats Mode works mainly as an advanced token tracker. We collect numbers and structure, with none of your conversation text, so you get a subset of Branchmore's features.

We offer Stats Mode because Branchmore's analytics go further than most token trackers', and we want you to be able to use them while keeping what we collect to a minimum. You can switch modes at any time. Optional Stats Mode explains how, and which features it turns off.

#What Branchmore collects

What we collect depends on your mode. In Full Mode, we collect your transcript after bmor strips the bulky and sensitive parts on your machine: tool output, file contents, edit bodies, thinking, and images. In Stats Mode, we collect only numbers and structure, with no transcript content. Here is the same excerpt of a Claude Code session in each form:

~/.claude/projects/-Users-sam-billing-api/4f1c9e2a.jsonl
{"type": "branchmore_envelope", "hostname": "sams-mbp",
"email": "sam@acme.dev", "github_repos": ["acme/billing-api"], …}
{"type": "user", "timestamp": "2026-09-30T17:02:11Z",
"cwd": "/Users/sam/billing-api", "gitBranch": "fix/webhooks",
"text_metrics": {"char_count": 58, "word_count": 8, …},
"message": {"role": "user", "content":
"CI fails. Locally I use postgres://app:s3cr3t@localhost/db"}} "CI fails. Locally I use postgres://[REDACTED]@localhost/db"}} "x"}}
{"type": "assistant", "message": {"model": "claude-sonnet-5-5",
"content": [
{"type": "thinking", "thinking": "The test reads WEBHOOK_SECRET…"},
{"type": "text", "text": "Let me read the handler first."}, {"type": "text", "text": "x"},
{"type": "tool_use", "name": "Read",
"input": {"file_path": "/Users/sam/billing-api/src/hooks.ts"}}, "input": {"file_path": "f.ts"}},
{"type": "tool_use", "name": "Bash",
"input": {"command": "npm test -- webhooks"}}], "input": {}}],
"usage": {"input_tokens": 18204, "output_tokens": 311}}}
{"type": "user", "message": {"content": [
{"type": "tool_result", "content": "import Stripe from 'stripe';…"}, {"type": "tool_result", "content": { {"type": "tool_result", "content": ""},
"file_path": "/Users/sam/billing-api/src/hooks.ts", "file_path": "/Users/sam/billing-api/src/hooks.ts",
"num_chars": 2214, "num_lines": 71, "num_words": 236}}, "num_chars": 2214, "num_lines": 71, "num_words": 236}},
{"type": "tool_result", "content": "PASS src/hooks.test.ts …"}]}} {"type": "tool_result", "content": ""}]}} {"type": "tool_result", "content": ""}]}}
What Claude Code writes to disk during a session. bmor reads this file after the session ends. Nothing is sent until it has been stripped and scanned. What Branchmore collects in Full Mode. Thinking is removed, file contents become a size summary, successful command output is dropped, and the database password in the prompt becomes [REDACTED]. bmor adds one line at the top saying which machine and account sent the file. What Branchmore collects in Stats Mode. Text becomes "x" plus counts, file paths keep only their extension, and the working directory and branch are dropped. The project is sent as a salted hash.

The full list. A row or line tagged with an agent's name applies only to that agent. Everything else is the same for Claude Code, Codex, and Cursor.

DataFull ModeStats Mode
Your prompts and the agent's repliesSent, scannedCounts only
Thinking
  • Claude CodeCursorRemoved
  • CodexSummaries sent, scanned
Removed
Tool namesSentSent
Tool inputs: commands, file paths, search patterns, URLs, subagent prompts Sent, scanned
  • Claude CodeCursorExtension only
  • CodexRemoved
Command output
  • Claude CodeRemoved if it succeeded. The first 200 characters are kept if it failed, so you can see why.
  • CodexSent, scanned, and so are results from MCP tools
  • CursorSize only
Removed
Contents of files the agent read
  • Claude CodeCursorSize only
  • CodexSent, scanned. Codex reads files with commands like cat, so their contents arrive as command output.
Removed
Bodies of file edits and new files
  • Claude CodeCodexSize only, plus lines added and removed
  • CursorSent, scanned
Removed
Claude CodeBodies of NotebookEdit and MultiEdit callsSent, scannedRemoved
Pasted images and screenshotsType and size onlyRemoved
Claude CodeHook output, file-history backups, system remindersRemovedRemoved
CodexYour AGENTS.md instructions, which Codex copies into each session's logSent, scannedRemoved
Working directory and git branch
  • Claude CodeCursorSent
  • CodexSent, with the commit hash and remote URL
  • Claude CodeCodexSalted hash of the directory
  • CursorUnsalted hash of the folder name
Token counts, model, timestampsSentSent
Claude CodeStatus line: model, cost, context window, rate limitsSentSent
Machine name, GitHub repo name, and the Claude account signed in on the machine: email, organization name and IDs, plan tier
  • Claude CodeCodexSent
  • CursorSent, except the repo name
  • Claude CodeSent with status-line data, except the repo name
  • CodexCursorNot sent

"Scanned" means the secret scanner below runs over it before upload. "Size only" means a character, line, and word count replaces the content. The file itself never leaves.

#Secret scanning

Anything that survives stripping is scanned on your machine before upload. bmor bundles the default rules from the open-source gitleaks scanner, which recognize credential formats for many common services, and adds its own checks for things like private keys, access tokens, and credentials inside URLs or password=-style assignments.

Each match is replaced with [REDACTED]. Where a pattern has a recognizable shape, the shape is kept so the transcript still reads correctly. For example, postgres://app:s3cr3t@db/billing uploads as postgres://[REDACTED]@db/billing.

Pattern matching catches known formats. It won't catch a password you made up, a secret split across two messages, or one that's base64-encoded. If you paste secrets into prompts often, use Stats Mode or exclude those projects.

Three things skip the scanner. Two of them contain no transcript text: the identity line bmor adds at the top of each Full Mode upload, which says which machine and account sent it, and Claude Code's status-line uploads, which go out as recorded. The third is rare: if bmor can't piece together a Cursor conversation from Cursor's local files, it falls back to uploading the editor's transcript file for that session, with patch-style edits reduced to sizes but without secret scanning.

#AI processing

"How do you use AI?" can mean three different things, each with its own concern: which AI services process your sessions, whether your data trains AI models, and how we use AI coding agents to build Branchmore. We answer each one separately.

#AI inference providers

We send parts of your sessions to AI inference providers for processing, and they don't train their models on Branchmore users' data. In Full Mode, an inference provider writes each session's title and summary and labels what kind of work it was. Some early-access features also use it to flag disagreements and risky tool calls. Today, our only inference provider is OpenAI, through its API. Vendors keeps the current list.

  • Text is trimmed to size limits before it's sent, and it has already been through the stripping and secret scanning described above.
  • Our standard requests ask OpenAI not to store what we send. Files sent through its batch API are the exception: we don't delete them from OpenAI yet.
  • In Stats Mode, nothing is sent to any AI provider.

bmor tune and bmor inspect work differently, and don't go through our providers. They run your own Claude Code or Codex on your machine, under your own account, and give it your Branchmore stats to work with.

#Training AI models

We don't train AI models on your data. We don't have AI models of our own to train, and our AI inference providers don't train theirs on your data either.

#AI coding agents

Like most of the tech industry, we use AI coding agents every day, and our business is built on them. We write Branchmore with the same agents it tracks: Claude Code, Codex, and Cursor. We use them on business and API plans that don't use our code, or any customer data, to train models.

Code an agent writes gets the same pull request, automated review, and security scanning as the rest of our code. Security practices has the details.

#Privacy settings

If Full Mode sends more than you're comfortable with, you can stop sending transcript content, or keep specific projects out entirely. You can also keep your data out of the reviews we use to improve Branchmore.

#Optional Stats Mode for greater privacy

Stats Mode sends no transcript content at all. bmor parses each session on your machine and sends a numeric outline of it: message and tool-call counts, token usage, timings, text lengths, and file extensions.

Stats Mode is either-or

It's on or off for your whole account, so every machine and project uses the same mode. While it's on, every feature that needs session content is turned off: Chat Transcripts, Tool Calls, Tool Call Safety, session titles and summaries, and the Insights reports built on session content. They stay off even for sessions you uploaded before switching. To keep a few projects private and keep these features for the rest, exclude those projects instead.

It's a setting on your account. Turn it on from the CLI or in the web app under Settings. CLI Configuration shows the commands. Our server enforces it: while Stats Mode is on, it refuses transcript uploads from any of your machines, and no session text goes to an AI provider.

Stats Mode still sends Claude Code status-line snapshots: cost, rate limits, and the identity line with your machine name, Claude account email, organization name, and account IDs.

Switching to Stats Mode doesn't delete anything already uploaded. To remove that, ask us to delete it.

#Exclude projects

To keep some repositories out of Branchmore, list them in your settings file. Transcripts of sessions in a denied directory, or any directory under it, aren't uploaded. bmor reads only enough of each file to find its working directory. Claude Code's status-line snapshots are the exception: bmor still uploads them for every session.

Which projects are tracked shows how to set up an allowlist or denylist, and which paths match.

#Opt out of product improvement

You decide whether your data helps us improve Branchmore. To monitor and improve product quality, our team reviews samples of sessions and usage data. Yours can be included unless you opt out. We ask during onboarding, and you can change your answer anytime in the web app under Settings, in Preferences, with Internal data use.

Opting out keeps all of your account's data out of these reviews. It doesn't change what bmor uploads, and staff can still read your data when it's needed to fix a problem, as Access control describes. Either way, we don't train models on your data.

#Data retention

How long we keep your data depends on your plan:

DataBasics (free)PlusPower user
Session logs: your transcripts, plus the titles and summaries we write from them3 months1 year1 year
Metrics: tokens, costs, timings, and counts1 yearLong-termLong-term

"Long-term" means we keep your metrics on purpose, as a feature, so you can compare your trends over months and years. Automatic removal at the end of the retention period is still rolling out.

Let us know what you think about retention and deletion

Branchmore is early in its journey, and we're still finding the right balance between usefulness, privacy, and keeping Branchmore affordable. If these retention periods don't work for you, we'd love to hear why. Tell us what you think.

To have your data deleted sooner, send us a request. Retention and deletion on Security overview explains how deletion works and what can stay in backups and logs afterward.

Something on this page wrong or unclear? Tell us