Skip to main content

git log for your Claude Code agent runs 🐾

Project description

ferretlog 🐾

git log for your Claude Code agent runs.

Your agent ran for 11 minutes. What did it actually do? Right now: scroll. Forever.

ferretlog turns Claude Code's session history into a queryable, git-style log — zero config, zero deps, pure stdlib Python.

$ ferretlog

  6fcbac30  2026-04-08 12:27  write changelog for v2.1 release
             3 calls   1 file   1m27s   bash×1, read×1, write×1

  e045f8c8  2026-04-08 09:27  refactor the database layer to use async
            10 calls   4 files 11m13s   bash×3, edit×3, read×2

  3f201ab7  2026-04-07 13:27  add rate limiting to the API endpoints
             9 calls   4 files  6m55s   bash×3, read×2, write×2

  21180c86  2026-04-06 13:27  fix the authentication bug in login flow
             7 calls   2 files  3m56s   bash×3, read×2, edit×1

git log proved that structured history + a sharp CLI is transformative. Nobody's done it for agent runs. Until now.

Ferrets hoard everything. So does ferretlog.


Install

pip install ferretlog     # one command. no config. no API keys.

The four commands

ferretlog                         # recent runs, git log style
ferretlog show <id>               # tool-by-tool replay of a single run
ferretlog diff <a> <b>            # what changed between two runs?
ferretlog stats                   # aggregate stats across every run

show — replay any run

$ ferretlog show e045f8c8

  run      e045f8c8
  task     refactor the database layer to use async
  date     2026-04-08 09:27
  duration 11m13s
  git      a3f2b1c

  files touched:
  M  src/db.py
  M  src/db_async.py
  M  src/models.py
  M  src/api.py

  tool calls:
  00  read    src/db.py
  01  read    src/models.py
  02  bash    $ grep -r 'db.session' src/
  03  write   src/db_async.py
  04  edit    src/models.py
  ...

diff — why did the same prompt go differently?

$ ferretlog diff 3f201ab7 e045f8c8

  tool sequence:
  =  00  read
  =  01  read
  ~  05  write → edit
  +  09  write  (only in B)

  files:
  =  src/api.py
  -  requirements.txt   (only in A)
  +  src/db_async.py    (only in B)

  DIFFERENT

stats — your agent, by the numbers

$ ferretlog stats

  runs           47
  tool calls     412   (avg 8/run)
  files touched  89
  total time     6h14m

  top tools:
  bash    180  ████████████████████
  read    102  ████████████
  edit     74  █████████
  write    56  ███████

How it works

Claude Code already writes complete session logs to ~/.claude/projects/. ferretlog parses the JSONL, reconstructs the tool-call sequence, and correlates each run to the nearest git commit by timestamp.

  • Local-only. Nothing leaves your machine. No network calls, ever.
  • Zero config. No init, no daemon, no database.
  • Zero deps. Pure Python stdlib. Reads files. That's it.
  • Already there. Works on every Claude Code session you've ever run.

Why

You can't improve what you can't see. Agents are becoming the most expensive thing in your dev loop — and the least observable. ferretlog is the smallest possible step toward fixing that: take the data Claude Code is already writing to your disk, and make it grep-able, diff-able, stat-able.

If you've ever scrolled a 4,000-line agent transcript looking for "wait, when did it touch that file?" — this is for you.

License

MIT. Go wild.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ferretlog-0.1.0.tar.gz (9.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ferretlog-0.1.0-py3-none-any.whl (9.5 kB view details)

Uploaded Python 3

File details

Details for the file ferretlog-0.1.0.tar.gz.

File metadata

  • Download URL: ferretlog-0.1.0.tar.gz
  • Upload date:
  • Size: 9.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for ferretlog-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a55c826f375775d3771883b18cb901d34c1c155cc815bd72b5e0567abdff40a5
MD5 2a7f9b95e8098df11c094eb460361bae
BLAKE2b-256 c12ac85872325d1ec8e9d0478f5ba687091e20e253b43236e53d9a217d3ac102

See more details on using hashes here.

File details

Details for the file ferretlog-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: ferretlog-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for ferretlog-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 094987668228dae8605c8fd55cfbb1d53c738d475619bbe7c603427026e31697
MD5 757efe32dc5c1a5bf83cafcac24b5ddb
BLAKE2b-256 6c830466f72c83d51235cc788668e97a296e90798e383436c6b7fdeda0bb2689

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page