This is a submission for Weekend Challenge: Passion Edition
What I Built
Every abandoned repo was once someone's 2 AM obsession.
That's the most honest artifact of passion a developer owns β not the polished portfolio piece, but the thing you started at midnight because you couldn't not, pushed to for eleven straight days, and then... life happened.
Side-Project Cemetery turns any GitHub profile into a moonlit graveyard. Type a username and every public repo that hasn't seen a push in 180+ days rises from the ground as a headstone β birth year, death year, how long it was loved fiercely, candles for its stars, and an affectionate epitaph:
"Its last commit was hope. Its next was never."
"Written in JavaScript. Died of callback exhaustion."
"Not dead β just aggressively on hold since 2025."
But here's the part the challenge theme is really about. Passion doesn't die β it naps. So every grave has a π₯ Rekindle button. Click it, and the app reads the repo's README and writes a pitch designed to re-seduce you with your own idea β closing with "Your first step tonight:", one small, concrete action derived from the actual repo. Then it prints you a Resurrection Certificate.
The tone rule for the whole app: loving humor, never mockery. These are graves, but we come with flowers.
Demo
πͺ¦ Live: https://pyaroslav.github.io/side-project-cemetery/ β bring your own username. I'll wait.
This is my own graveyard β I'm not exempt. Two graves, and both epitaphs read "loved fiercely for one wild night," because both were single-evening obsessions I never came back to. The app roasted me with:
OracleDatabaseTuningrests here, onegit pushshort of glory.
Then I hit Rekindle on it. This is the built-in offline engine β no API key involved:
OracleDatabaseTuningisn't a corpse. It's a nap that got out of hand. You started it because the idea wouldn't leave you alone at night. You built the whole first spark of it in a single sitting, which means the hard part β starting β is a thing you've already done here. [...] The distance between a dead repo and a living one is a single commit β and you've written harder code half-asleep. Tonight it doesn't need a rewrite. It needs five minutes and the version of you that started it.Your first step tonight: Open the README, find the "Oracle Database Tuning Tool" section, and write one true sentence under it about where this actually stands today.
Point it at your favorite prolific maintainer and you get a proper necropolis β headstones sorted most-loved first, and truly dedicated abandoners get a "πΆ Walk deeper β N more souls rest here" gate after the first 24 graves. Drop your best epitaph in the comments.
Code
pyaroslav
/
side-project-cemetery
πͺ¦ A moonlit graveyard for your abandoned repos β with loving epitaphs and a π₯ Rekindle button. Built for the DEV Weekend Challenge: Passion Edition.
πͺ¦ Side-Project Cemetery
Every abandoned repo was once someone's 2 AM obsession.
Enter any GitHub username and wander a moonlit cemetery of that person's abandoned side projects β public, original repositories that haven't been pushed to in over six months. Each one gets a headstone and a loving slightly funny epitaph.
Then comes the turn: pick any grave and hit π₯ Rekindle. The app reads the repo, writes a passionate one-paragraph revival pitch aimed straight at its creator, and hands you one concrete first step for tonight β because passion doesn't die, it just naps.
Built for the DEV Weekend Challenge: Passion Edition.
Run it
It's a pure static site β three files, no build step, no dependencies.
cd side-project-cemetery
python3 -m http.server 8000
# open http://localhost:8000
Any static file server works. You can also deep-link straight to a cemetery:
http://localhost:8000/?u=sindresorhus
What it does
- Hero β type aβ¦
How I Built It
Three static files. No build step, no framework, no server. The night scene β moon, twinkling stars, drifting fog, fireflies β is pure CSS: radial gradients, blurred shapes on slow keyframe loops, six 4px dots with per-instance custom properties. No image assets at all, and it all switches off under prefers-reduced-motion.
The graveyard is the GitHub REST API, unauthenticated. A repo becomes a headstone when it's public, not a fork (a fork is someone else's passion), and pushed_at is over 180 days old. "Loved fiercely for N days" is pushed_at β created_at β the window it actually received work. Under a day renders as "one wild night."
Epitaphs are deterministic. Reloading a graveyard shouldn't reshuffle the dead, so each repo's epitaph is seeded from a hash of its name across 20 templates, with a languageβcause-of-death map (~25 languages). A de-clustering pass keeps one page of graves from repeating itself. Everything works with zero API keys.
The AI is an upgrade, never a requirement β my favorite design constraint of the weekend. Save a Gemini key in β¨ AI settings and the whole cemetery gets AI-written epitaphs in one batched call (gemini-flash-latest, responseSchema-constrained JSON, silent fallback to the local engine on any failure). It read my dead Oracle-tuning experiment and wrote:
"You dreamed of optimization for zero days, proving the fastest database code is the code never written."
Rekindle sends the README β base64-decoded client-side β and gets back {paragraph, step}. For that same repo, Gemini pitched me "an automated performance detective that rescues database administrator sanity" and assigned tonight's step: create tune.py and write one mock Oracle wait event. That's uncomfortably actionable β same grave, two engines, and you can compare them yourself in the screenshots.
Fun war story: my first test key failed with the original model list β new Google AI keys get a 404 on gemini-2.5-flash and a quota error on gemini-2.0-flash, and my retry chain only advanced on 404s. If you ship a BYO-key app, lead with the -latest rolling alias and retry on any model error, or every fresh-key user sees your fallback path and nothing else.
Save an ElevenLabs key and a π Hear the eulogy button appears: your epitaph and revival pitch, read aloud over the fog (eleven_multilingual_v2, trimmed at sentence boundaries so the voice never dies mid-thought β a bug I actually shipped and fixed). Keys live in localStorage, go only to their own services, and the app is never broken, never blank, never waiting.
The first step is derived, not canned. If the README mentions a TODO, the step targets it. Otherwise it uses the README's first heading, or a real command for the repo's language, or folds the repo's description into a task. The goal: make the next commit feel five minutes away. Because it is.
Why this one
I picked this idea because my own graveyard called me out. Both of my dead repos β an Oracle database tuning experiment and a CS50 AI course project β were one wild night each: started in a burst of 2 AM conviction, abandoned by breakfast. Building this app meant staring at that pattern for a whole weekend. It worked: cs50ai is getting its "first step tonight" β tonight.
I built a cemetery, but I really built the opposite: a machine for noticing that every grave in it is one commit away from being a garden again.
Go visit yours. Bring flowers. Leave with a first step. π₯
Built solo within the challenge window. Stack: vanilla HTML/CSS/JS, GitHub REST API, Google Gemini (Flash) + ElevenLabs (both BYO-key, both optional), zero servers.





Top comments (1)
The fact that this runs entirely on the unauthenticated GitHub API with zero backend, and the AI is optional instead of required, is such a clean design call. Also whoever wrote "Its last commit was hope. Its next was never." owes me an apology. Great entry π₯