Homebrew
brew tap georgemandis/tap
brew install eng-leader-tools
DORA metrics, PR health, code churn, and contributor analysis. Bash scripts, the GitHub CLI, and jq. No SaaS, no data leaving your machine.
$ brew tap georgemandis/tap
$ brew install eng-leader-tools
$ eng lead-time my-org/my-repo
$ eng review-time my-org/my-repo 50
$ eng change-failure-rate my-org/my-repo
$ eng code-churn my-org/my-repo 30 3
All output goes to stdout.
Pipe, redirect, or just read it.
Measurements,
not grades.
Everything worth measuring is already in the GitHub API. These scripts just ask for it. No vendor, no dashboard, no $30k platform — just your terminal.
brew tap georgemandis/tap
brew install eng-leader-tools
scoop bucket add georgemandis https://github.com/georgemandis/scoop-bucket
scoop install eng-leader-tools
git clone https://github.com/georgemandis/eng-leader-tools
cd eng-leader-tools
# Add to PATH, or run scripts directly.
# Pick and choose the ones you need.
Each script also stands on its own. The eng wrapper is a convenience, not a requirement.
Research-backed baselines for delivery health. Learn more at dora.dev
$ eng lead-time acme-corp/api
PR# Author Lead Time Created Merged
────────────────────────────────────────────────────────────────────
#812 alice 4h 2026-04-28T09:12Z 2026-04-28T13:45Z
#809 bob 1d 6h 2026-04-26T14:00Z 2026-04-27T20:30Z
#807 charlie 2d 2026-04-24T11:00Z 2026-04-26T11:15Z
#804 diana 8h 2026-04-23T08:30Z 2026-04-23T16:45Z
#801 alice 3h 2026-04-22T10:00Z 2026-04-22T13:10Z
Analyzed 5 PR(s) • Average lead time: 18 hours
$ eng lead-time-user acme-corp/api alice 60
PR# Lead Time Created Merged
──────────────────────────────────────────────────────────
#812 4h 2026-04-28T09:12Z 2026-04-28T13:45Z
#801 3h 2026-04-22T10:00Z 2026-04-22T13:10Z
#788 6h 2026-04-15T09:00Z 2026-04-15T15:20Z
alice: 3 PR(s) • Average lead time: 4 hours
$ eng change-failure-rate acme-corp/api 30
→ Total merged PRs in last 30 days: 47
→ PRs flagged as failures: 2
→ Change Failure Rate: 4.26%
Failed PRs:
• #798 rollback: revert auth token migration
• #803 hotfix: patch rate limiter crash
$ eng deploy-frequency acme-corp/api 90
Deployment Activity:
• Releases in last 90 days: 11
• Using releases for analysis
Average deployment frequency: Every 8.2 days
Recent Deployments:
Date Version Time Since Previous
────────────────────────────────────────────────
2026-04-29 v2.14.0 6 days
2026-04-23 v2.13.1 4 days
2026-04-19 v2.13.0 12 days
2026-04-07 v2.12.0 9 days
DORA Assessment:
• 🟢 High: Between once per day and once per week
$ eng review-time acme-corp/api 20
PR# 1st Rev Merge Reviews Author
────────────────────────────────────────────
#812 1h 4h 2 alice
#809 3h 1d 6h 3 bob
#807 N/A 2d 0 charlie
#804 45m 8h 1 diana
Summary:
• Total PRs analyzed: 4
• Average time to merge: 20h
• Average time to first review: 1h 35m
• PRs with reviews: 3/4 (75%)
Process Health:
• 🟢 Review responsiveness: Good (1h 35m avg)
• 🟡 Review coverage: 75% — 1 PR merged without review
$ eng pr-size acme-corp/api
Size Distribution:
Size Count % Avg Review Time
────────────────────────────────────
XS 6 12% 45m
S 14 28% 2h
M 18 36% 4h
L 9 18% 9h
XL 3 6% 1d 4h
Summary:
• Total PRs analyzed: 50
• Average lines per PR: 182 (+112 -70)
🟢 40% small PRs (XS/S) — healthy distribution
🟡 Large PRs take 6x longer to review than small ones
$ eng files-per-pr acme-corp/api
PR# Files Author Title
──────────────────────────────────────────────────────
#812 3 alice Fix auth token refresh
#809 8 bob Add rate limiting middleware
#807 2 charlie Update API docs
#804 14 diana Refactor database layer
Analyzed 4 PRs • Total files changed: 27 • Average: 6.8 files/PR
$ eng files-per-pr-live acme-corp/api
PR# Files Author Title
──────────────────────────────────────────────────────
#815 4 eve Add webhook support
#814 18 frank Migration to new ORM
#813 2 alice Fix typo in error message
Analyzed 3 open PRs • Average: 8.0 files/PR
Large PRs (>10 files) that may need extra review attention:
• #814 (18 files): Migration to new ORM
$ eng stale-prs acme-corp/api
Open PRs for acme-corp/api: 9 total
< 1 day (2)
────────────────────────────────────────────────────
#815 eve 0d old Add webhook support
#813 alice 0d old Fix typo in error message
1-3 days (3)
────────────────────────────────────────────────────
#814 frank 2d old Migration to new ORM [draft]
3-7 days (1)
────────────────────────────────────────────────────
#810 bob 5d old Refactor auth middleware
30+ days (1)
────────────────────────────────────────────────────
#762 charlie 42d old Experimental caching layer
1 of 9 PRs (11%) are older than 2 weeks.
Consider reviewing for closure or re-prioritization.
$ eng quick-reviews -o acme-corp -r api
2026-04-30 • Fix typo in error message • github.com/acme-corp/api/pull/813
2026-04-28 • Update CI badge in README • github.com/acme-corp/api/pull/811
$ eng review-load acme-corp/api
Review Load Distribution:
Reviewer Total Approved Changes Comments
────────────────────────────────────────────────────
alice 18 14 2 2
bob 12 8 3 1
charlie 4 3 0 1
diana 2 2 0 0
Summary:
PRs analyzed: 50
Total reviews: 36
Unique reviewers: 4
Avg reviews/PR: 0.72
Load Balance:
alice is handling 50% of all reviews — consider redistributing.
2 contributor(s) authored PRs but gave no reviews.
$ eng code-churn acme-corp/api 30 3
File Hotspots (changed ≥3 times in 30 days):
Times File Path
──────────────────────────────────────────────
7 src/auth/tokens.ts
5 src/middleware/rate-limit.ts
4 tests/auth.test.ts
3 src/db/migrations/latest.ts
Top Churn Directories:
3 changes in src/auth
2 changes in src/middleware
Risk Assessment:
• 🔴 High: 1 file changed ≥5 times
• 🟡 Medium: 2 files changed 3-4 times
Most Churned: src/auth/tokens.ts (7 changes, 28% of PRs)
$ eng contributor-patterns acme-corp/api
Contributor File Change Patterns:
Author PRs Total Avg Max
──────────────────────────────────────────
diana 8 96 12.0 28
bob 7 63 9.0 18
alice 12 30 2.5 5
charlie 5 12 2.4 4
Pattern Analysis:
• Focused contributors (avg <3 files/PR):
- alice (2.5)
- charlie (2.4)
• Broad-scope contributors (avg >10 files/PR):
- diana (12.0)
$ eng lottery-factor acme-corp/api
Single-Contributor Files (highest risk):
Chgs Only Author File
────────────────────────────────────────────────────
8 alice src/auth/tokens.ts
6 bob src/db/migrations/latest.ts
5 charlie tools/deploy.sh
Directory-Level Risk:
Files Risk Directory
────────────────────────────────────────
3 HIGH src/auth
2 MED src/db
1 LOW tools
Overall:
26% of active files have a single contributor
Consider pairing or rotating reviewers.
$ eng dependency-changes acme-corp/api 90
#791 2026-04-18 dependabot 🔒 🤖
Bump express from 4.18.2 to 4.19.0
#785 2026-04-11 renovate 🤖
Update typescript to 5.5
#770 2026-03-28 dependabot 🔒 🤖
Bump lodash from 4.17.20 to 4.17.21
Summary:
• Dependency PRs: 14 of 100 (14%)
• Security updates: 3
• Avg frequency: Every 6.4 days
• 🤖 Automation rate: 90%
• 🟢 Active dependency management
$ eng contributions alice acme-corp 30
Date Repo PR# Author Comments Status
──────────────────────────────────────────────────────────────────────
2026-04-29 acme-corp/api #812 bob 2 ✓ Approved
2026-04-27 acme-corp/api #809 charlie 1 ✓ Approved
2026-04-25 acme-corp/web #344 diana 3 ⚠ Changes Req
2026-04-22 acme-corp/api #801 eve 1 ✓ Approved
Summary:
• PRs reviewed/commented: 4
• Total comments: 7
• Approvals: 3 • Change requests: 1
• Avg comments/PR: 1.8
$ eng pull-discussion acme-corp/api 812
PR Details:
Title: Fix auth token refresh
Author: alice
State: merged
+45 -12
Changed Files:
• src/auth/tokens.ts (+30 -8)
• src/auth/session.ts (+15 -4)
Discussion:
───
bob (COLLABORATOR) • 2026-04-28T10:15Z
src/auth/tokens.ts:42
Should we add a retry here for transient failures?
Reactions: +1: 2
───
alice (AUTHOR) • 2026-04-28T11:00Z
Good call. Added exponential backoff in latest push.
$ eng pull-discussion acme-corp/api 812 | eng analyze-discussion
This PR fixes a bug where auth tokens were not being refreshed
correctly after expiry. Bob raised a concern about transient
network failures during refresh, which Alice addressed by adding
exponential backoff. Both reviewers approved after the update.
No unresolved disagreements.
Many commands support --csv for machine-readable output. All commands support --help.
These tools grew out of years of managing and directing engineering teams. I wanted a way to check the barometer — not to grade anyone, but to calibrate my understanding of how things were going.
Mostly they confirmed what I already suspected, which is actually the point. I could see who our busiest reviewers were, where PR sizes were creeping up, who the "glue" people were connecting different parts of the org. Having it in front of me made it concrete. It gave me better questions to ask.
This kind of analysis already exists in enterprise platforms, but those cost real money and come with more dashboard than most teams need. If you use GitHub, everything worth measuring is already in the API.
20+ years building software, 5 years leading the people who build it. Previously director of engineering at Axios HQ. Currently doing a batch at the Recurse Center and building tools under Less Software.
I keep building small tools like this one. Minimal dependencies, clear output, no more moving parts than necessary. Less Software is the practice.