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.


