Make failure a standard part of a developer's portfolio.
MyDeadProjects is a platform where developers create personal graveyards for their abandoned side projects. Write epitaphs, share "death certificates," and turn your pile of unfinished repos into a portfolio of experience.
GitHub shows what you built. LinkedIn shows your career. MDP shows the journey — with all the dead ends, pivots, and burials.
The average developer has 5-15 dead repos on GitHub. Yet there's no standardized way to document and share this experience. The industry declares "fail fast, learn faster" but has no infrastructure for it.
MyDeadProjects flips the attitude toward failure from shame to experience, humor, and community.
- Project Obituaries — Write epitaphs for each dead project. What it was, why it died, and what you learned.
- Personal Graveyard — A public page (
/username) showcasing all your abandoned projects as tombstones. - Death Certificates — Auto-generated OG images for sharing on Twitter/LinkedIn/Telegram.
- Resurrection — Community members can pledge to resurrect dead projects.
- Pay Respects — Leave flowers and condolences on other developers' projects.
- Telegram Notifications — Daily automated posts to a Telegram channel.
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router, Server Actions) |
| Language | TypeScript |
| Database | PostgreSQL via Supabase |
| ORM | Drizzle ORM |
| Auth | Supabase Auth (GitHub OAuth) |
| CSS | Tailwind CSS 4 |
| Cache | Redis (Valkey) |
| Storage | Cloudflare R2 |
| Workers | Cloudflare Workers (R2 proxy, Telegram cron) |
| Hosting | Self-hosted on Hetzner VPS via Docker |
- Node.js 22+
- Docker (for Redis)
- Supabase project (free tier works)
- Cloudflare account (for R2 storage)
-
Clone the repository:
git clone https://github.com/snowtema/mydeadprojects.git cd mydeadprojects -
Install dependencies:
npm install
-
Copy the environment file and fill in your values:
cp .env.local.example .env.local
See .env.local.example for all required variables.
-
Start Redis:
docker compose up -d
-
Push the database schema:
npm run db:push
-
Start the dev server:
npm run dev
Open http://localhost:3000.
The project uses two Cloudflare Workers:
- R2 proxy (
worker/) — Handles image uploads to R2 with CORS - Telegram cron (
workers/telegram-cron/) — Posts daily updates to Telegram
Deploy them with Wrangler:
cd worker && npx wrangler deploy
cd workers/telegram-cron && npx wrangler deploysrc/
├── app/ # Next.js App Router pages & API routes
│ ├── (app)/ # Authenticated routes (dashboard, settings)
│ ├── (auth)/ # Auth routes (login, callback)
│ ├── api/ # API endpoints (health, cron, OG images)
│ ├── [username]/ # Public user profiles
│ └── explore/ # Public project exploration
├── components/ # React components
├── actions/ # Server actions
├── hooks/ # Custom React hooks
└── lib/ # Database, auth, storage, utilities
├── db/ # Drizzle schema & queries
└── supabase/ # Supabase client helpers
The project deploys via GitHub Actions (.github/workflows/deploy.yml):
- Builds a Docker image
- Pushes to GitHub Container Registry
- Deploys to VPS via SSH
For manual deployment, see deploy.sh (requires DEPLOY_HOST env var).
Contributions are welcome! Here's how to get started:
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Make your changes
- Run lint:
npm run lint - Commit:
git commit -m "Add my feature" - Push:
git push origin feature/my-feature - Open a Pull Request
Please check TODO-FEATURES.md and GitHub Issues for ideas on what to work on.
Detailed design and architecture docs are in the docs/ directory:
This project is licensed under the GNU General Public License v3.0.