Death certificates for abandoned GitHub repositories.
commitmentissues.dev Β Β·Β built by Dot Systems
Paste a public GitHub URL β or a username β and get a shareable certificate of death. Algorithmic cause of death, last commit as last words, repo age, exportable graphics. Or run an autopsy across an entire profile and get a graveyard report. No signup, no account, free.
- Certify a repo β paste a GitHub URL, get a printable A4 certificate of death.
- Examine a profile β paste a username, get a graveyard report of every dead, struggling, and alive repo, plus a README badge you can embed.
Copy the generated  markdown from any profile page and paste it in a README:
πͺ¦ GITHUB REPO GRAVEYARD
94 DEAD Β· 35 STRUGGLING Β· 14 ALIVE
The badge is rendered live, refreshes through GitHub's image proxy within minutes, and links back to the full profile graveyard.
- Certificate of death β A4 layout with cause, last words, age, stars, forks, and language.
- Profile graveyard β scan any user's public repos, grouped by Dead / Struggling / Alive, with per-repo descriptions and one-click certificate links.
- README badge β dynamic SVG (
/api/badge?username=β¦) showing live dead / struggling / alive counts. - Algorithmic scoring β the death index in
src/lib/scoring.tsweighs commit recency, archive status, open issues, fork ratio, and commit-message tells. - Export β PNG downloads in A4, Instagram (4:5 and 1:1), X (16:9), Facebook (1.91:1), and Stories (9:16).
- Mobile share β native share sheet on iOS / Android with a story-formatted image; desktop falls back to X intent + clipboard + downloads.
- Hall of Fame ticker β curated marquee of historically abandoned repos with click-to-light candle counts.
- Live counters β buried + profiles scanned, animated on load and persisted in Redis.
- Rate limiting β Redis-backed per-IP throttling with graceful no-op when Redis isn't configured.
- Hardened API calls β
AbortSignal.timeouton every GitHub fetch, segment allowlist on every owner/repo input.
| Certificate of Death | Profile graveyard | Active profile |
|---|---|---|
![]() |
![]() |
![]() |
| Concern | Choice |
|---|---|
| Framework | Next.js 15 (App Router) |
| Language | TypeScript (strict) |
| Styling | Tailwind CSS + inline styles + design tokens in globals.css |
| Fonts | Space Grotesk, Lora, UnifrakturMaguntia (via next/font) |
| Certificate render | Client-side (html-to-image) for PNG; next/og (Satori) for embeddable images |
| Hosting | Vercel |
| Storage | Upstash Redis (rate limiting, recent burials, candles, counters) |
| Data source | GitHub public REST API |
| Analytics | Vercel Analytics + Plausible |
Prerequisites: Node 18+ and npm.
git clone https://github.com/dotsystemsdevs/commitmentissues.git
cd commitmentissues
npm install
npm run devOpen http://localhost:3000.
Every environment variable is optional. Without any of them, the app boots fine β you just get GitHub's anonymous rate limit (60 req/hr) and the live counter / "recently buried" feed are disabled.
Copy .env.example to .env.local and fill in what you want:
# Optional β strongly recommended (5000 req/hr instead of 60)
GITHUB_TOKEN=
# Optional β enables rate limiting, recent burials, candle counts, and the live counter
KV_REST_API_URL=
KV_REST_API_TOKEN=
# Optional β defaults to https://commitmentissues.dev
NEXT_PUBLIC_BASE_URL=A GitHub token can be classic or fine-grained β no scopes are needed for public-repo access. Generate one at Settings β Developer settings β Personal access tokens.
A free Upstash Redis instance works out of the box β create one at console.upstash.com and paste the REST URL + token.
| Script | What it does |
|---|---|
npm run dev |
Start the dev server on :3000. |
npm run build |
Production build. |
npm run start |
Run the production build. |
npm run lint |
Lint with next lint. |
npm run typecheck |
TypeScript check (no emit). |
npm test |
Run the scoring unit tests. |
| Step | What happens |
|---|---|
| Input | User submits a public GitHub URL or username. |
| Fetch | App fetches repo metadata + latest commit via GitHub's public API (8s timeout, AbortController on every call). |
| Score | computeDeathIndex returns a 0β10 index based on recency, archive status, open issues, and stars. |
| Narrative | determineCauseOfDeath picks a cause from a rule table β weighted by language, commit message, archive status, and a curated overrides map for famously dead repos. |
| Output | Certificate rendered client-side and exportable as high-res PNG; Satori variant lives at /api/certificate-image/[owner]/[repo] for README embeds. |
All endpoints are public. None require auth.
| Endpoint | Purpose |
|---|---|
GET /api/repo?url=<github-url> |
Certify a single repo. Returns the full DeathCertificate payload. |
GET /api/user?username=<name> |
Scan a profile. Returns every public repo grouped by Dead / Struggling / Alive. |
GET /api/badge?username=<name> |
Live-updating SVG badge for READMEs. |
GET /api/certificate-image/[owner]/[repo] |
Satori-rendered PNG of the certificate (for OG / README embeds). |
GET /api/recent |
The 10 most recent burials. |
GET /api/random |
A random dead repo URL (powered by GitHub search). |
GET /api/stats |
Buried + profiles counters. |
POST /api/stats |
Increment a counter (buried, shared, downloaded). |
GET /api/candle Β Β·Β POST /api/candle |
Aggregate "wreath" totals per repo, used by the Hall of Fame marquee. |
src/
βββ app/
β βββ page.tsx β homepage (repo + profile scan)
β βββ layout.tsx β root layout, fonts, analytics, JSON-LD
β βββ globals.css β design tokens + shared styles
β βββ opengraph-image.tsx β /opengraph-image (Satori)
β βββ not-found.tsx β 404
β βββ robots.ts Β· sitemap.ts β SEO scaffolding
β βββ about/ β /about β "The Undertaker's Office"
β βββ legal/ β /legal β terms + privacy
β βββ user/[username]/ β permalink to a profile graveyard
β βββ api/ β see API table above
βββ components/
β βββ CertificateCard.tsx β certificate view + share/export logic
β βββ CertificateFixed.tsx β A4 certificate layout (used for export)
β βββ SearchForm.tsx β URL/username input with live intent detection
β βββ UserDashboard.tsx β Dead / Struggling / Alive tabs
β βββ ReadmeBadge.tsx β README badge preview + copy
β βββ RecentlyBuried.tsx β Hall of Fame marquee
β βββ ScannerBanner.tsx β top-bar burial ticker
β βββ StatsCounter.tsx β animated buried + profiles counter
β βββ PageHero.tsx Β· SubpageShell.tsx Β· SiteFooter.tsx
β βββ LoadingState.tsx Β· ErrorDisplay.tsx
β βββ ClickSpark.tsx β canvas click effect on the submit button
β βββ useCandles.ts β shared candle/wreath state
βββ hooks/
β βββ useRepoAnalysis.ts β repo fetch state + URL hydration
βββ lib/
βββ scoring.ts β death index + cause of death
βββ scoring.test.ts β unit tests
βββ rateLimit.ts β Redis-backed per-IP throttle
βββ recentStore.ts β recently-buried Redis store
βββ hallOfShame.ts β curated famous dead repos
βββ types.ts β shared TypeScript types
A small Chrome extension lives in extension/ that injects a πͺ¦ "Declared Dead β View Certificate" badge next to the title on any GitHub repo page where the API reports deathIndex >= 6.
To load it unpacked:
- Open
chrome://extensions/. - Toggle Developer mode (top right).
- Click Load unpacked.
- Select the
extension/directory. - Visit any dead repo, e.g.
https://github.com/atom/atomβ the badge appears next to the repo name and links to its certificate atcommitmentissues.dev/?repo=atom/atom.
Manifest V3, content-script-only. Cleans up on GitHub's SPA navigation, fails silently when the API is unavailable, and never blocks page render (4-second AbortSignal.timeout on the fetch).
npm testTests cover the scoring algorithm in src/lib/scoring.test.ts β death index, cause-of-death rules, last-words generation, and date helpers.
CI (.github/workflows/ci.yml) runs lint, test, and build on every push and PR to main.
PRs welcome. See .github/CONTRIBUTING.md for ground rules and the local dev flow, and .github/CODE_OF_CONDUCT.md. Use the issue templates for bugs and feature requests, and keep PRs focused.
Good first issues live in GitHub Issues tagged good first issue.
Found a security issue? Please don't open a public issue. See .github/SECURITY.md for private disclosure.
MIT β see LICENSE.
Built by Dot Systems. If it made you laugh, keep us alive.



