Skip to content

dotsystemsdevs/commitmentissues

Commitment Issues

Your abandoned repos deserve a proper funeral.

Live: commitmentissues.dev  ·  Built by Dot Systems

MIT License Deployed on Vercel Next.js


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.

Embed your dead repo

Got a dead repo? Add the badge to your README:

🪦 declared dead

[![🪦 declared dead](https://img.shields.io/badge/%F0%9F%AA%A6%20declared%20dead-view%20certificate-555?style=for-the-badge&labelColor=cc0000)](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.

Screenshots

Homepage

Certificate of Death

The Mortician — About page

Features

  • Certificate of Death — A4 layout with cause of death, last words, repo age, stars, forks, and language
  • Algorithmic scoringsrc/lib/scoring.ts computes 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 CERTIFICATE shields.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

Tech stack

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

Getting started

Prerequisites: Node 18+

git clone https://github.com/dotsystemsdevs/commitmentissues.git
cd commitmentissues
npm install
npm run dev

Open http://localhost:3000.

Environment variables

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_token

Without 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.

How we pronounce repos dead

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.

Project structure

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

Running tests

npm test

Tests cover the scoring algorithm in src/lib/scoring.test.ts.

Contributing

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

Roadmap

Items are loosely prioritized. Community PRs welcome on anything marked good first issue.

Near-term

  • Upgrade to Next.js 16 (planned within one month of launch)
  • Dark mode
  • /api/certificate-image caching layer (currently no Redis cache)
  • Repo comparison — bury two repos side by side

Longer-term

  • 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

Won't do (by design)

  • Private repo support — we don't break into houses
  • Accounts / login — the funeral is free and anonymous
  • Monetization — coffee button stays, paywalls don't

License

MIT — see LICENSE.


Built with too much free time by Dot Systems. If it made you laugh, keep us alive.

About

Official death certificates for abandoned GitHub repos.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors