vibestats

How it works

vibestats tracks your Claude Code usage across machines and surfaces it as a public heatmap on your GitHub profile and on vibestats.dev.

Architecture

Claude Code sessions
        │
        ▼  Stop/SessionStart hooks
  Rust binary (vibestats)
        │  reads ~/.claude/projects/**/*.jsonl
        │  pushes per-machine daily JSON
        ▼
  vibestats-data (private GitHub repo)
  └── machines/year=.../day=.../machine_id=.../data.json
        │
        ▼  daily GitHub Actions cron
  stephenleo/vibestats@v1
  (aggregate.py + generate_svg.py + update_readme.py)
        │
        ├──► username/username/vibestats/heatmap.svg
        │     └──► profile README (<!-- vibestats-start/end -->)
        │
        └──► username/username/vibestats/data.json
              └──► vibestats.dev/[username] (client-side dashboard)

Data flow explained

  1. Claude Code writes JSONL files — Every Claude Code session appends conversation events to ~/.claude/projects/**/*.jsonl on your local machine.
  2. Rust binary syncs on session end — The vibestats binary is invoked via Stop and SessionStart hooks in ~/.claude/settings.json. It reads the JSONL files and pushes per-machine daily JSON to your private vibestats-data GitHub repository.
  3. GitHub Actions aggregates daily — A scheduled cron workflow in vibestats-data runs stephenleo/vibestats@v1 daily. It runs aggregate.py to combine data across machines, generate_svg.py to produce a heatmap SVG, and update_readme.py to embed the heatmap in your GitHub profile README.
  4. Profile README is updated — The update_readme.py script patches the <!-- vibestats-start --> / <!-- vibestats-end --> section in your username/username profile README with the freshly generated heatmap.svg.
  5. Dashboard served client-sidevibestats.dev/[username] fetches data.json from your username/username/vibestats/ folder and renders an interactive cal-heatmap in the browser — no server required.

Multi-machine support

Each machine writes to its own path in vibestats-data using a unique machine ID. The aggregation step merges data from all machines before generating the heatmap, so your activity from every machine is reflected in a single view.