Skip to content

didrod205/coderecap

📊 coderecap

Spotify Wrapped for your git history — generated locally, nothing uploaded.

npm version bundle size CI types license

A coderecap card: The Night Owl, 600 commits, a 29-day streak, a night-skewed commit histogram.
npx coderecap            # run it in any git repo — your terminal fills with your year

GitHub's "year in review" only counts your public contributions, lives on their servers, and disappears some years entirely. Your real year is in private repos, work repos, that self-hosted GitLab, the client project you can't send anywhere.

coderecap reads your local git log and turns it into a shareable recap — a persona, your longest streak, the hour you actually code, your most-touched files, your commit-message tics — printed to your terminal and exported as an SVG card you can post. It runs on any repo, completely offline. Nothing is uploaded.

npx coderecap                 # this year, in this repo, for you
  ● coderecap  ·  nebula 2025
  🔒 100% local — nothing was uploaded

  🦉  The Night Owl
     Your best commits happen after dark.

  600 commits   ·   204 active days   ·   +65,285 -26,671 lines

  Highlights
  🔥 streak       29 days  (2025-03-02 → 2025-03-30)
  🌙 peak hour    11 PM
  📅 favorite day Wednesday
  📈 busiest day  2025-01-01 (5 commits)
  📂 files        10 touched

  When you commit  (midnight → 11pm)
  ▇▇▇▄▁▁▁▁▁▁▂▂▂▂▂▂▂▂▂▂▄▄▇█
  12a   3    6    9    12p   3    6    9   11

  Most-touched files
  src/engine.ts  252 commits
  ...

  Top words  fix×175 · add×121 · api×51 · engine×40 · dark×29
  33% "fix" · 17% "wip"/throwaway · avg 18 chars

Why coderecap?

  • 🔒 Local & private by design. It shells out to git log on your machine and computes everything in-process. No account, no API key, no network. Your proprietary repo never leaves your laptop — so you can finally run a "wrapped" on the code that actually filled your year.
  • 🎴 A card built to be shared. coderecap report writes a polished SVG (four themes) you open in a browser and screenshot. Every share carries your stats, not a login wall.
  • 🧠 A persona that fits. Night Owl, Weekend Warrior, Firefighter, Marathoner, Surgeon… picked deterministically from your patterns, not a vibe.
  • 🧩 Works anywhere git does. Public, private, monorepo, GitLab, Gitea, self-hosted. Filter to you or include the whole team. Any year, any date range.
  • 🛠️ Honest engineering. A pure, dependency-free core powers both the CLI and (soon) a browser playground — same parser, same numbers, fully deterministic.

Install

# run it now, no install
npx coderecap

# or keep it around
npm install -g coderecap      # global CLI
npm install -D coderecap      # use the library / gate it in CI

Node ≥ 18, and git on your PATH. The core is dependency-free and browser-safe.

Quick start

coderecap                              # this year, this repo, you
coderecap --year 2025                   # a specific year
coderecap --all                         # your entire history
coderecap ~/work/api --all-authors      # another repo, the whole team
coderecap --since 2025-01-01 --until 2025-06-30   # a custom window
coderecap report                        # write coderecap.svg + .md + .json to share
git log ... | coderecap --stdin         # feed a log directly (no repo needed)

By default coderecap scopes to your commits (via git config user.email). Use --all-authors for the team, or --author you@work.com to pick an identity.

What it figures out

Everything below is computed from the commit stream — no heuristics you can't audit:

Group What you get
Persona One of ten identities (🦉 Night Owl, ⚔️ Weekend Warrior, 🚒 Firefighter, 🏃 Marathoner, 🔬 Surgeon, 🚜 Bulldozer, 🤖 The Machine, 🐦 Early Bird, 🌊 Stream-of-Consciousness, 🧱 Steady Builder)
Rhythm Commits by hour and weekday, your peak hour, night-owl / early-bird / weekend share
Streaks Longest consecutive-day streak (with dates), current streak, active days
Volume Commits, lines added/removed, files touched, your single busiest day
Files Most-touched files and top-level directories, by commits and churn
Messages Top words, how often you write "fix" / "wip", average subject length

All of it rolls up into the terminal card and the SVG.

Real scenarios

1. Your year, ready to post. Every December, run it and share a card from the repos that actually mattered — including the private ones GitHub's wrapped ignores:

coderecap --year 2025 report --theme candy
# → coderecap.svg — open in a browser, screenshot, post

2. A sprint or quarter retro, in seconds. Point it at the team repo for a window and drop the Markdown into your retro doc:

coderecap ./service --since 2025-04-01 --until 2025-06-30 --all-authors report --md retro.md

3. "Where did my year go?" Run it across each work repo to see which one ate your nights — without sending a single line of proprietary code anywhere.

The shareable card

coderecap report                       # writes coderecap.svg, .md, .json
coderecap report --theme dark          # tokyonight | dark | light | candy
coderecap report --svg card.svg        # just the card, custom path
coderecap SVG card

Open the .svg in any browser and screenshot it (PNG export is on the roadmap). The card is a self-contained SVG — no fonts to embed, no network to hit.

Configuration

coderecap init writes coderecap.config.json:

{
  "authors": ["you@example.com"],   // whose commits to count (empty = your git identity)
  "identifyBy": "email",            // match authors by "email" or "name"
  "excludePaths": [                  // ignored in *file* stats (lockfiles, build output)
    "package-lock.json", "dist/", "node_modules/", ".min."
  ],
  "theme": "tokyonight",            // card theme
  "top": 5                           // how many top files / words to show
}

Flags override config; --config <file> points at a specific one.

Library API

The core is pure and browser-safe — feed it git log output from anywhere:

import { parseGitLog, analyze, renderCard, toMarkdown } from "coderecap";

const commits = parseGitLog(rawGitLogOutput);
const report = analyze(commits, DEFAULT_CONFIG, {
  now: { y: 2025, m: 12, d: 31 },
  repo: "my-app",
  period: { label: "2025", since: "2025-01-01", until: "2025-12-31" },
  authorKeys: ["me@example.com"],
  authorLabel: "me",
});

console.log(report.persona.title, report.streaks.longest);
const svg = renderCard(report, "tokyonight");

To produce the exact log coderecap expects: git log --no-merges --numstat --date=iso-strict --pretty=format:... — or just import GIT_LOG_ARGS.

How it works (why "local" is honest)

coderecap runs git log with a machine-readable format, parses it into commits (author-local time preserved, binary files and renames handled), and computes every statistic with deterministic, dependency-free functions. The same input always produces the same recap. There is no telemetry and no network code — grep the dist/ if you like.

Roadmap

  • 🖼️ PNG/PDF export of the card (so you can post it without the screenshot step).
  • 🌐 Browser playground — paste your git log output, get the card, still 100% client-side (the core already runs in a browser).
  • 🗂️ Multi-repo aggregate — one recap across all your repos for the year.
  • 🤖 Optional --ai layer (bring-your-own key) to write a paragraph-style "year in review" from the numbers. The core stays 100% offline and deterministic.

💖 Sponsor

coderecap is free and MIT-licensed, built and maintained in spare time. If it made your year look good, please consider supporting it:

  • Star this repo — the simplest free way to help others find it.
  • 🍋 Sponsor via Lemon Squeezy — one-time or recurring.

License

MIT © coderecap contributors

About

Spotify Wrapped for your git history — a local, deterministic year-in-code recap (terminal card + shareable SVG). No upload, no API key. Works on any repo, even private.

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors