coderecap
v0.1.0
Published
Spotify Wrapped for your git history — a beautiful, shareable year-in-code recap generated locally from any repo (public, private, or work). Nothing uploaded. Prints a terminal card and exports an SVG/JSON/Markdown recap.
Maintainers
Readme
📊 coderecap
Spotify Wrapped for your git history — generated locally, nothing uploaded.
npx coderecap # run it in any git repo — your terminal fills with your yearGitHub'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 charsWhy coderecap?
- 🔒 Local & private by design. It shells out to
git logon 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 reportwrites 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 CINode ≥ 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 [email protected] 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, post2. 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.md3. "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 pathOpen 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": ["[email protected]"], // 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: ["[email protected]"],
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 logoutput, 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
--ailayer (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
