Why My GitHub Graveyard Holds 27 Dead Projects – Avoid the Same Fate
Discover the habits that kill side‑projects and learn actionable tactics agencies can use to keep work alive and ship faster.

Why My GitHub Graveyard Holds 27 Dead Projects – And How Your Agency Can Avoid the Same Fate
I recently opened my GitHub profile, filtered for private repos, and counted 27 abandoned side‑projects created over the last three years. Each one started with a spark of excitement—a habit‑tracker powered by machine learning, a “Twitter for dogs” prototype, a four‑week SaaS boilerplate that never left the config stage. Hours turned into days, days into weeks, and finally the code gathered dust.
The culprit wasn’t a shortage of time or talent. It was a set of habits that turn promising ideas into digital tombstones. Below I break down the exact patterns that killed my projects, share the rule that finally forced me to ship, and give agencies concrete tactics to keep side‑projects—and client work—alive.
1. The “Perfect Stack” Trap
“Pick boring technology you already know, even if it feels outdated.” – the author’s hard‑earned mantra
When a new project is born, the instinct is to stack the latest shiny tools:
- Next.js (often the newest version, e.g., v13+ with the App Router)
- tRPC for type‑safe APIs without writing schemas
- Prisma as the ORM of choice
- A custom Tailwind CSS design system, painstakingly tuned
I once spent an entire weekend wiring a Next.js app with tRPC, Prisma, and a bespoke Tailwind config. By Sunday night the infrastructure looked perfect: a fully typed API, a pristine component library, and a CI pipeline that passed on every commit. Yet the core business logic—what the app actually did—was still zero lines of code. The next day the excitement evaporated.
Why it kills momentum
- Decision fatigue – Every new library brings its own config, docs, and quirks.
- Scope creep – The more tools you adopt, the more you feel compelled to use their advanced features.
- False confidence – A polished stack can mask the fact that you haven’t solved the real problem yet.
Agency‑level antidote
- Standardize a “core stack” for internal prototypes (e.g., Next.js 12 + React 18 + plain CSS modules).
- Document a “starter kit” that includes only the essentials: routing, state management, and a minimal UI library.
- Reserve experimental tech for later phases—after the MVP is live and validated.

2. Optimizing for Phantom Users
“Your biggest threat isn’t a server crash; it’s nobody visiting your site.”
For the dog‑Twitter clone, I spent three days building a Redis caching layer to survive a sudden influx of a million canine users on day one. I also designed a micro‑service architecture that split authentication, feed generation, and image handling into separate containers.
The hidden cost
- Over‑engineering – Complex infrastructure adds deployment friction and maintenance overhead.
- Misaligned priorities – Time spent on scalability that will never be needed delays the core user experience.
- Psychological barrier – The more elaborate the setup, the harder it feels to push “go live”.
Practical steps for agencies
- Start with a single relational DB (PostgreSQL or MySQL) and simple CRUD endpoints.
- Add a cache only after you observe real latency issues in production.
- Use feature flags to toggle optional services, keeping the initial release lean.

3. Feature Creep Is a Disease
It begins innocently: a to‑do list app that suddenly needs profile picture uploads. Before you know it, you’re deep in AWS S3 documentation, wrestling with signed URLs, bucket policies, and multipart uploads—while the original task list sits unfinished.
Symptoms
- Scope ballooning – Every “nice‑to‑have” becomes a “must‑have”.
- Time sink – Hours lost reading third‑party docs instead of coding core features.
- Launch paralysis – The product never reaches a “good enough” state.
How to prune aggressively
- Define a Minimum Viable Product (MVP) checklist with no more than three core user flows.
- Apply the “one‑feature‑per‑sprint” rule: if a feature isn’t essential for the MVP, postpone it.
- Use a “kill switch”—if a feature adds more than 5% to the total development time, drop it.
4. The Fear of Shipping
Writing code feels safe; hitting Deploy feels exposing. Many projects stall at the 90 % mark because the developer worries about bugs, bad UI, or outright neglect.
Reality check
- A buggy, live app provides real user feedback you can iterate on.
- Stagnant code never gets tested in the wild, so you can’t measure impact.
Agency culture shift
- Adopt a “ship‑early, ship‑often” cadence—weekly or bi‑weekly releases for internal tools.
- Celebrate launches, not just clean code. Publicly share the URL, even if it’s a rough demo.
- Implement automated smoke tests that run on every push, reducing the anxiety of manual QA.
5. The 48‑Hour Rule – My Personal Breakthrough
“If it takes longer than a single weekend to get the core feature live, the scope is too big.”
I imposed a strict rule: build an ugly, functional prototype within 48 hours. The moment the clock hits the two‑day mark, I either:
- Cut the scope—strip away non‑essential UI, replace a custom design system with plain HTML/CSS, or mock external APIs.
- Abort—if the core problem can’t be demonstrated quickly, it’s probably not worth pursuing.
The rule forced me to focus on value over perfection and turned several dead projects into shipped demos that attracted real users.
How agencies can institutionalize it
- Kick‑off sprints: allocate a 48‑hour “prototype sprint” before any detailed planning.
- Set a “launch‑by‑deadline” for internal tools; treat it like a client deadline.
- Reward rapid delivery—recognize the team that ships the most functional prototype in the shortest time.

Turning the Lessons Into Agency‑Level Best Practices
| Problem | Root Cause | Actionable Fix |
|---|---|---|
| Perfect‑stack paralysis | Chasing the newest tech | Freeze a core stack for prototypes; isolate experimental upgrades to later phases. |
| Phantom‑user over‑engineering | Fear of scale before traffic | Start with a single DB, simple API; add caches only after real load appears. |
| Feature creep | “It would be cool if…” | Define a strict MVP, limit features to three core flows, enforce a kill‑switch. |
| Shipping anxiety | Fear of public scrutiny | Deploy early, use smoke tests, celebrate live demos regardless of polish. |
| Endless planning | No hard deadline | Adopt the 48‑Hour Rule; treat the prototype sprint as a non‑negotiable deadline. |
Implementing these habits across an agency not only reduces internal graveyards but also speeds up client deliveries. When you ship faster, you gather feedback sooner, iterate smarter, and ultimately build products that actually solve problems—not just showcase tech stacks.
Takeaway for Your Team
Your next side‑project—or a client MVP—doesn’t need the latest version of Next.js, a custom Tailwind theme, or a Redis cluster from day one. Focus on the core problem, get a working prototype out within 48 hours, and iterate based on real usage. By resisting the allure of perfection and embracing rapid, imperfect shipping, you’ll turn graveyard repositories into living, breathing products.
What’s the weirdest abandoned project you’ve ever started, and what habit finally broke the cycle for you? Share your story in the comments—let’s build a healthier development culture together.
Share this insight
Join the conversation and spark new ideas.