npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

git-recap

v0.1.1

Published

Spotify Wrapped for your git history — a local, zero-dependency, animated story of your code. Terminal card + shareable SVG, no upload, no API key.

Readme

🎁 git-recap

Spotify Wrapped, but for your git history.

An animated, shareable story of your code — generated 100% locally in one command. No account. No API key. No upload. Zero dependencies.

npm zero deps license node

npx git-recap · run it in any repo · scroll through it


git-recap demo

| The story (up to 11 slides) | Every day you showed up | | --- | --- | | story | heatmap | | Who did the work | The verdict 👏 | | crew | verdict |

And the share card — generated as recap.svg, made to be embedded in your README:

share card


Why this spreads

Wrapped-style recaps are the most shared format on the internet (Spotify proved it). Every card someone posts — in a README, a tweet, a standup slide — is an ad for the tool. git-recap is built around that loop:

  1. The story — recap.html, a full-screen animated recap of any repo: your heatmap, power hours, language donut, ride-or-die files, commit lingo ("fix" ×321), 3AM commits, and a personality verdict with confetti.
  2. The card — recap.svg, a 1200×630 digest. Perfect size for a README and for the repo's social preview image. This is the piece that self-propagates: every README it lands in markets the tool to everyone who visits.
  3. The end card — the story ends with npx git-recap, so every share teaches the next person how to make their own.

Quick start

cd your-project
npx git-recap

That's it. It writes to ./git-recap/:

| File | What it is | | --- | --- | | recap.html | The animated story. Opens in your browser and scrolls like a page. | | recap.svg | Share card for your README / social preview. | | recap.json | The raw stats — do whatever you want with them. |

Options

npx git-recap [repo-path] [options]

--year 2025        # wrap a single year
--since / --until  # any git date range
--author "name"    # wrap one person's year
--theme synth      # night (default) · synth · forest
--out <dir>        # output elsewhere
--no-open          # don't launch the browser
--json             # stats to stdout, for scripts

Put your year in your profile README (the viral bit)

npx git-recap ~/$YOUR_REPO --year 2025 --no-open
cp $YOUR_REPO/git-recap/recap.svg .
![My year in code](./recap.svg)

Auto-refresh it with GitHub Actions

name: recap
on:
  schedule: [{ cron: "0 9 1 1 *" }]   # every Jan 1
  workflow_dispatch:
permissions: { contents: write }
jobs:
  wrap:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }        # full history
      - uses: actions/setup-node@v4
      - run: npx -y git-recap . --year $(date -d "last year" +%Y) --no-open --out .
      - run: |
          git config user.name "recap-bot" && git config user.email "[email protected]"
          git add recap.svg && git commit -m "wrap: $(date -d 'last year' +%Y)" || exit 0
          git push

What it computes

Everything from one git log --numstat pass over your history:

  • Commit volume, active days, averages, +/− line counts
  • 52-week heatmap, longest streak, current streak, busiest day/month
  • Power-hour clock (24-hour radial chart) and weekday rhythm
  • Language ranking by lines written (60+ extensions recognized)
  • Ride-or-die files by churn
  • Commit lingo — top verbs, "wip" count, emoji commits, your longest message
  • Ghost hours — commits between midnight and 5am
  • Your verdict — one of 9 deterministic coding personalities

Privacy

Everything runs on your machine with the git binary you already have. There is no server, no telemetry, no network call. It reads, it computes, it writes three files. Read the whole source — it's ~1,400 lines with zero dependencies.

Contributing

PRs welcome — verdicts, themes, and languages are all data-driven tables, so adding one is a great first issue.

License

MIT © 2026 sutharsan