We were 48 hours from adopting a logging library. It had the right API, good docs, a healthy star count, and a maintainer who answered issues within a day. Everything looked fine.
Then I ran the 30-second check, and the number that stopped me was the one nobody talks about: 12 active days in the last 90.
Total commits: 312
Contributors: 5
Active days: 12
Files touched: 87
Recent Activity
2026-08-30 ######## 4
2026-08-12 ###### 3
2026-07-22 #### 2
2026-06-15 ##### 3
...
12 days with a commit, spread across the quarter, in clusters of 2-4 commits. The star count was a monument to the past. The activity graph was a heartbeat monitor, and the heartbeat was a resting one.
Why stars lie (politely)
Stars are cumulative. They measure the peak of interest, which for most libraries is a launch blog post, a conference talk, or a "top 10" list — and they decay none of it. A library can have 8,000 stars and not have had a commit in two years. The stars are true; they're just true about 2019.
Active days is the opposite metric. It's a rate, not a sum. It answers the question that actually matters for a dependency: is someone at the keyboard right now? Because a dependency you adopt is a bet that someone will be at the keyboard when the thing breaks — when Node ships a breaking change, when a transitive dep yanks a version, when your team hits the edge case at 5pm on a Friday.
12 active days in 90 isn't "abandoned." It's "maintained in maintenance mode." The distinction matters: an abandoned library has zero days. A 12-days-in-90 library has a maintainer who lands a fix when poked, triages issues on a slow cycle, and will not be refactoring the core for you this year.
The decision we made
We didn't adopt it. Not because the library was bad — the code was clean and the API was genuinely good — but because the maintenance cadence didn't match our risk:
- We would be depending on a slow cycle. Our stack moves weekly. A dependency that moves quarterly means we absorb every ecosystem shift (Node releases, security patches in transitive deps) on our own, with a library that can't keep up.
- The "answers issues within a day" was triage, not velocity. Reading the issue history, the maintainer was responsive but the commits were sparse. Responsiveness to issues and responsiveness to the ecosystem are different things; the activity graph measures the second.
- Five contributors, one with 70%. The contributor graph showed a bus factor of ~1.5. The 12 active days were mostly one person's.
We picked a library with 40 active days in 90, fewer stars, and a commit cadence that matched ours. It was the right call — three months later, the ecosystem moved (a breaking change in a shared dependency) and the active library shipped a compatible release in a week. The 12-day library's issue about it sat open for three weeks.
How I check now
Before any dependency decision, the check is in the pre-flight list:
git clone --depth 200 <repo> /tmp/check && npx @wuchunjie/gitpulse /tmp/check
Three numbers I read, in order:
- Active days in the last 90 — is it alive at a cadence I can depend on?
- Contributor concentration — if the top name disappeared, does the repo stop?
- Recent activity shape — clusters (spurts) or steady (daily)? A steady pattern is a stronger maintenance signal than the same total.
The tool is gitpulse — zero dependencies, runs against the local clone, nothing uploaded. The whole check, clone included, is under two minutes for a small repo.
The meta-lesson
We almost made a dependency decision on a reputation metric (stars, docs, response time) instead of a maintenance metric (active days, contributor spread). Reputation describes the past. Maintenance describes the present, and the present is what you're actually depending on.
Run the pulse before you sign the contract. It costs two minutes, and it told us the truth the star count was too polite to say.
npx @wuchunjie/gitpulse
More Tools
| Tool | What it does | Command |
|---|---|---|
| scaffoldx-cli | Production-ready project templates in seconds | npx scaffoldx-cli |
| dotguard | Scan .env files for exposed secrets | npx @wuchunjie/dotguard |
| gitpulse | Git repo analytics in your terminal | npx @wuchunjie/gitpulse |
| snippetx | Terminal code snippet manager | npx @wuchunjie/snippetx |
If these save you time, consider buying me a coffee. All tools are MIT-licensed, zero-dependency, and run fully offline.
Top comments (0)