Skip to main content

Commits and anchors

A git commit is a snapshot of your code at a point in time. It stores a diff, a message, an author, and a timestamp. It tells you what changed but says nothing about how the change was produced. An anchor extends a commit with AI context. It records which AI sessions were active, how many tokens were spent, and which lines came from AI vs. the developer. The anchor is attached to a specific commit hash, so you can always trace back from a line of code to the conversation that produced it.
FieldWhat it stores
commit_hashThe git commit this anchor is attached to
messageCommit message
authorGit author
author_typeagent, assisted, human, or automated
contributorsAll participants (humans + AI tools with model info)
branchBranch name
committed_atTimestamp
sessionsArray of linked AI session IDs (each with files_touched)
files_changedList of modified files
added / deletedAggregate diff stats
file_changesPer-file breakdown: path, added/deleted, attribution (ai/human/mixed), agent
ai_added / ai_deletedLines attributed to AI
human_added / human_deletedLines attributed to human
ai_percentageAI contribution percentage (0–100)

Author types

Oobo classifies every commit into one of four author types based on what was happening when the commit was created:
TypeWhen it applies
agentAn AI agent made the commit autonomously (no human in the loop)
assistedA human committed while one or more AI sessions were active
humanNo AI session was active during the commit
automatedNon-interactive commit (CI, scripts, bots)

Where anchors are stored

Anchors are stored in two places:
  1. Local SQLite at ~/.oobo/db/oobo.db. Always written, powers all queries and analytics.
  2. Git orphan branch oobo/anchors/v1. Always written on every intercepted commit (unless the project is ignored). This branch travels with the repo.
The orphan branch is created on the first intercepted commit and is invisible to normal git operations. It does not appear in git log, git diff, or your working tree. It is a separate git ref that carries metadata alongside your code. The pre-push hook always pushes this branch if it exists. Teammates can run oobo sync to import the anchor history into their local database.

Sessions

A session represents a single AI coding conversation. Oobo discovers sessions by reading the local storage of each supported tool (Cursor’s SQLite databases, Claude Code’s JSONL files, Gemini’s JSON files, etc.).
FieldWhat it stores
session_idUUID (prefix-matchable: abc12 matches abc12def-...)
nameSession title or first message
sourceTool name (cursor, claude, gemini, etc.)
modeInteraction mode (composer, chat, agent, etc.)
project_pathAssociated project directory
modelAI model used
input_tokens / output_tokensToken counts (native or estimated)
duration_secsHow long the session lasted
is_estimatedtrue if tokens are tiktoken estimates, false if native
created_at / updated_atTimestamps

Token sources

Some tools store exact token counts in their local data (Claude Code, Gemini CLI, OpenCode, Codex CLI). For tools that don’t (Cursor, Copilot, Windsurf), oobo estimates tokens using tiktoken and marks them with is_estimated: true. You can also configure API keys (oobo auth anthropic, oobo auth openai) to pull actual usage data from provider APIs, which gives you organization-level token numbers.

Session IDs

Every session has a UUID. You can reference sessions by their full ID or any unique prefix:
oobo sessions show abc12def         # full prefix
oobo sessions show abc1             # short prefix (as long as it's unique)
Find session IDs via the interactive TUI (oobo sessions) or JSON output (oobo sessions list --agent).

Transparency

Anchor metadata (sessions, attribution, stats) always syncs to the orphan branch on every intercepted commit. There is no opt-out for metadata — it is the core product behavior. To stop all oobo activity for a repo, use oobo ignore. Transparency controls one thing: do redacted session transcripts also sync?
ModeWhat syncs to orphan branch
off (default)Anchor metadata only. Transcripts stay local.
onAnchor metadata + redacted session transcripts.
Set via config:
[transparency]
mode = "off"    # or "on"
When transparency is on, session transcripts are redacted (secrets removed via gitleaks patterns) before being written to the orphan branch. Transparency has a global default in ~/.oobo/config.toml and can be overridden per-project via the DB project_settings table.

Projects

A project is any git repository where oobo has discovered AI sessions. Projects are found automatically during oobo scan by checking workspace metadata from each AI tool. Projects are stored in the global SQLite database with their path, git remote, associated tools, session count, and aggregate token stats.
oobo projects              # browse projects (interactive TUI)
oobo projects show myapp   # details for a specific project

Ignore list

You can opt out of oobo enrichment for specific repositories:
oobo ignore             # stop tracking the current repo
oobo unignore           # re-enable tracking
oobo ignore --list      # show all ignored repos
When a repo is ignored, git commands pass through without anchor creation, orphan branch writes, or session discovery. On first use in a new repo, oobo prints a one-time notice:
oobo: enriching commits in <project> with AI attribution. Run `oobo ignore` to opt out.