HOW IT WORKS
We don't read your code. We don't run AI to detect AI. We use hooks the agents already provide and we use git itself as the database.
The naive approach
"Use a model to detect AI-generated code from the diff."
It doesn't work. Detection accuracy hovers around 60%. False positives. False negatives. And once a developer touches the AI code, the signal is gone. We don't detect. The agent itself reports.
From Claude editing a file to your dashboard
Before Claude Code (or Cursor, Codex, Windsurf) edits a file, it calls a registered hook with the tool name and target file. We capture a snapshot.
Normal Claude/Cursor behavior. Nothing intercepted. The user accepts or rejects in their normal flow.
The agent calls the post-hook. We compare snapshot vs current. The new lines are AI's. The unchanged ones are human's. We attribute, we don't guess.
Attribution gets stored in .git/ai/working_logs/{base_commit}.jsonl.
Append-only, file-locked, safe under concurrent edits.
Our git post-commit hook reads the working log, builds an Authorship Log,
and stores it as a git note under refs/notes/ai.
No network needed. obsly-ai blame foo.py reads the git note and shows attribution.
If your org uses Obsly AI cloud, the post-commit hook also POSTs the note to your tenant. Or you install our GitHub App and we read the notes via GitHub API on push events.
Personal (private to the dev), Vendor (the team/org), Enterprise (a buyer comparing multiple vendors). Same git notes underneath. Different lenses on top.
A single file, attributed line by line. Multiplied by every commit, every repo, every vendor.
Local-first, cloud-optional
No. The CLI reads files locally to compute diffs, but only line metadata (number, agent, model) leaves your machine — never the content. The cloud only stores attribution metadata, not source.
We support Claude Code, Cursor, Codex, Windsurf via official hooks. If an agent doesn't fire a hook, that edit is treated as human. We don't try to detect after the fact.
Our post-rewrite hook updates the git notes to follow the new commit SHAs. Attribution survives rebase, amend, and cherry-pick. Force-push is the only thing that can break it.
That line gets re-attributed to the human. We track who currently owns each line, not history. The "durability" metric measures exactly this: how much AI code stays AI-owned over time.
No. We use the open git-ai standard v3.0.0. Your notes are portable to any tool that reads the same format. If you stop using Obsly AI, your data leaves with you.
Hook cycle is sub-100ms for normal files. The CLI is Python stdlib only — no heavy imports, no network calls, no LLM in the path. We measured.
Two commands. No account needed for the CLI.