Your abandoned repos deserve a proper funeral.
Live: commitmentissues.dev · Built by Dot Systems
Paste a public GitHub URL. Get a shareable Certificate of Death — algorithmic cause of death, last commit as last words, repo age, and exportable graphics. No signup. No account. Completely free.
Got a dead repo? Add the badge to your README:
[](https://commitmentissues.dev/?repo=YOUR_OWNER/YOUR_REPO)The badge and full certificate embed markdown are generated automatically on the certificate page — just hit Copy after analyzing your repo.
- Certificate of Death — A4 layout with cause of death, last words, repo age, stars, forks, and language
- Algorithmic scoring —
src/lib/scoring.tscomputes a death index from commit activity, archive status, issue count, and time since last push - Export — PNG downloads in multiple aspect ratios: A4, Instagram (4:5 and 1:1), X/Twitter (16:9), Facebook feed, and Stories (9:16)
- Mobile share — Native share sheet on iOS/Android with a story-formatted image
- README badge — Embed a
🪦 DECLARED DEAD | VIEW CERTIFICATEshields.io badge linking back to the certificate - Certificate embed — Full certificate image via
/api/certificate-image/[owner]/[repo]for GitHub READMEs - Recently Buried — Live scrolling feed of the latest public burials
- Famous Casualties — Curated graveyard of famously abandoned repos
- Rate limiting — Redis-backed per-IP limiting with graceful fallback
- Timeout + race condition handling — AbortController on every GitHub API call
| Framework | Next.js 14 (App Router) |
| Styling | Tailwind CSS + inline styles |
| Fonts | UnifrakturMaguntia, Courier Prime, Inter |
| Export | html-to-image, Canvas API |
| Certificate image | next/og (Satori, Node.js runtime) |
| Hosting | Vercel |
| Storage | Upstash Redis (rate limiting + recent burials + stats) |
| Data | GitHub public API |
| Analytics | Vercel Analytics + Plausible |
Prerequisites: Node 18+
git clone https://github.com/dotsystemsdevs/commitmentissues.git
cd commitmentissues
npm install
npm run devOpen http://localhost:3000.
Create a .env.local in the project root:
# GitHub — optional but strongly recommended (raises API rate limits from 60 to 5000 req/hr)
GITHUB_TOKEN=ghp_yourtoken
# Upstash Redis — optional (enables Recently Buried feed, rate limiting, and buried counter)
KV_REST_API_URL=https://your-instance.upstash.io
KV_REST_API_TOKEN=your_tokenWithout any env vars the app still works fully — you just get GitHub's unauthenticated rate limits (60 req/hr) and the Recently Buried feed is hidden.
Generate a GitHub token at Settings → Developer settings → Personal access tokens. Fine-grained or classic both work; no special scopes needed for public repo access.
| Step | What happens |
|---|---|
| Input | User submits a public GitHub URL |
| Fetch | App fetches repo metadata + latest commit via GitHub API |
| Score | computeDeathIndex() in src/lib/scoring.ts produces a 0–10 death index |
| Narrative | determineCauseOfDeath() picks a cause based on the index and repo signals |
| Output | Certificate rendered client-side, exportable as high-res PNG |
The scoring algorithm weighs: time since last commit, archive status, open issues, fork ratio, star count, and whether the last commit message reads like a final sigh.
src/
├── app/
│ ├── page.tsx ← homepage
│ ├── about/page.tsx ← /about
│ ├── layout.tsx ← root layout, fonts, analytics, JSON-LD
│ └── api/
│ ├── repo/route.ts ← main analysis endpoint
│ ├── recent/route.ts ← recently buried feed
│ ├── random/route.ts ← random dead repo picker
│ ├── stats/route.ts ← buried counter
│ ├── badge/[owner]/[repo]/ ← shields.io-compatible badge SVG
│ └── certificate-image/[owner]/[repo]/ ← OG image for README embeds
├── components/
│ ├── CertificateCard.tsx ← certificate view + all export/share logic
│ ├── CertificateFixed.tsx ← the actual certificate layout (A4)
│ ├── SearchForm.tsx ← URL input + random button
│ ├── RecentlyBuried.tsx ← scrolling marquee feed
│ ├── Leaderboard.tsx ← Famous Casualties graveyard
│ ├── LoadingState.tsx ← loading skeleton
│ ├── ErrorDisplay.tsx ← error + retry UI
│ ├── PageHero.tsx ← shared hero (emoji, title, subtitle)
│ ├── SubpageShell.tsx ← shell for /about and future subpages
│ └── SiteFooter.tsx ← footer
└── lib/
├── scoring.ts ← death index + cause of death logic
├── scoring.test.ts ← scoring unit tests
├── rateLimit.ts ← Redis-backed rate limiting
├── recentStore.ts ← recently buried Redis store
└── types.ts ← shared TypeScript types
npm testTests cover the scoring algorithm in src/lib/scoring.test.ts.
Contributions are welcome. Please read .github/CONTRIBUTING.md before opening a PR.
- Use the issue templates for bugs and feature requests
- CI runs lint, tests, and build on every pull request to
master - Keep PRs focused — one thing at a time
Items are loosely prioritized. Community PRs welcome on anything marked good first issue.
- Upgrade to Next.js 16 (planned within one month of launch)
- Dark mode
-
/api/certificate-imagecaching layer (currently no Redis cache) - Repo comparison — bury two repos side by side
- Chrome extension — tombstone badge injected on GitHub repo pages
- Language-specific causes of death ("Died of PHP fatigue", "Last seen in CoffeeScript")
- Death anniversary emails — opt-in reminders on the date of last commit
- API for third-party integrations
- Private repo support — we don't break into houses
- Accounts / login — the funeral is free and anonymous
- Monetization — coffee button stays, paywalls don't
MIT — see LICENSE.
Built with too much free time by Dot Systems. If it made you laugh, keep us alive.


