PR dashboard that shows open pull requests across monitored GitHub repositories so team members can see at a glance which PRs need attention.
Live example: conforma.dev/review-rot
A Go CLI queries the GitHub GraphQL API for open PRs across configured repos,
enriches each with review/CI/conversation metadata, and outputs data.json. It
also aggregates recent review activity into a reviewer leaderboard. A static
frontend (vanilla JS + CSS) renders the data with client-side filtering and
sorting, split across a Pull Requests tab and a Leaderboard tab.
A GitHub Actions workflow (.github/workflows/publish.yaml) runs every
30 minutes on weekdays:
- Builds the Go CLI
- Runs it with the
config/directory to produceweb/data.json - Copies the static frontend files into
web/ - Pushes
web/to thegh-pagesbranch
GitHub Pages is configured to serve from the gh-pages branch.
The CLI authenticates as a GitHub App using a private key passed via the
GITHUB_PRIVATE_KEY environment variable. In this repository the workflow
reads it from the EC_AUTOMATION_KEY secret.
The config/ directory contains two files:
sources.yaml— GitHub App credentials, monitored orgs/repos, team members, and the reviewer-leaderboard data horizon (leaderboard.window_days, default 90). See the comments in that file for details.ui.yaml— Dashboard appearance: title, logo, and accent colors.
The Leaderboard tab ranks the team members listed under authors by the
number of distinct PRs they reviewed or commented on across the monitored repos.
It counts activity on PRs of any state (open, merged, or closed) and excludes
bots and self-reviews. If authors is empty, every reviewer is ranked.
leaderboard.window_days is the data horizon — the widest range the backend
aggregates. The tab has an interval slider (1 to the horizon, with preset
shortcuts like 7d / 30d / 90d) that narrows the window client-side, re-counting
and re-ranking without a rebuild. Each row is an accordion: clicking it opens a
table of the PRs behind that person's count — PR title, repo, author, and review
date — sorted most recent first.
The CLI uses a GitHub App for authentication. GitHub's GraphQL API requires authentication even for public repositories, and a GitHub App provides its own rate limit (5,000+ requests/hour) without being tied to any individual's account.
The app only needs read-only access to pull requests and repository metadata — no write permissions are required. See the GitHub docs for instructions on creating and installing a GitHub App.
To use review-rot for your own team:
- Fork the repository
- Create a GitHub App (see above) and install it on your org
- Edit
config/sources.yamlwith your App ID, Installation ID, orgs, repos, and team members - Edit
config/ui.yamlto set your team name, logo, and brand colors - Add the App's private key as a repository secret and update the
GITHUB_PRIVATE_KEYenv var in.github/workflows/publish.yamlto reference it (this repo usesEC_AUTOMATION_KEY) - Configure GitHub Pages to serve from the
gh-pagesbranch
If ui.yaml is omitted, the dashboard uses the default title ("Review Rot"),
no logo, and a neutral blue-grey color scheme.