İçeriğe Atla
Mustafa Erbay
Life Written by human · 9 min read · görüntülenme Türkçe oku
100%

Side Project Graveyard: When Should You Pull the Plug?

My guide to pruning dead projects that have been accumulating for years, consuming RAM on servers, and generating domain renewal bills.

Side Project Graveyard: When Should You Pull the Plug? — true story cover image

The /home/mustafa/dev/projects directory on my computer is like a digital cemetery. It contains everything from half-finished PHP scripts from 2012 to Golang backends from 2021 that I thought “would definitely take off” but were only used by 3 people (one of whom was my mom). My 20 years of field experience has taught me this: starting a project is exciting, growing it is hard, but pulling the plug is a true sign of professionalism.

Most of the time, we form emotional bonds. We deceive ourselves with excuses like “I buried 3 weekends into that,” “I stayed up all night designing that PostgreSQL schema,” or “The domain is very generic, it might come in handy one day.” In reality, that project is nothing more than 120 MB of RAM wasted in the docker stats output and a $15 domain fee charged to the credit card every year. Today, I will explain the “kill criteria” I apply to my own projects and my technical cleanup process.

Infrastructure Costs and “Idle” Resources

The cost of a side project isn’t just money; the mental load is much more expensive than the cash. I had a small financial calculator running on my VPS. Only 5-10 people visited it per day, but there was a PostgreSQL instance, a Redis, and an Nginx reverse proxy running in the background. One day, when I checked with the top command, I saw that this project was consuming 15% of system resources even while sitting idle.

We tend to fill everything up, thinking Docker containers are “isolated anyway.” However, every systemd unit or Docker container writes logs, takes up space on journald, and creates context switching overhead at the kernel level. Last year, when I shut down 4 different small projects that were no longer receiving traffic, I saw the Load Average on the server drop from 0.85 to 0.12. This meant a more stable environment for the applications that are my main business and actually make money.

# A simple monitoring method I use to identify idle projects

# I find upstreams that haven't received requests in Nginx logs in the last 30 days
grep "14/Apr/2026" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr

If a project hasn’t shown organic growth in the last 3 months and is technically not even in “maintenance mode” but is essentially “abandoned,” it doesn’t deserve that VPS cost. I now invest in 2 “working” projects instead of keeping 20 “maybe” projects on a $10 server.

Dependency Hell and Bit Rot

Code is fresh the day it’s written; it starts to go stale the next day. I didn’t update one of my side projects (it was an Android spam blocker app) for 6 months. When I opened the project last week for a bug fix, I saw that the Gradle version was no longer supported, 3 different libraries I used were “deprecated,” and the API level had fallen below Play Store standards.

This is the moment when the “pull the plug” decision is most clearly made: When the maintenance cost exceeds the development cost. If you enter a 4-hour dependency hell just to make a simple text change, that project is no longer an asset; it’s a shackle. Those 45 critical vulnerability warnings that appear when you run npm install to get the project running are a message telling you, “bury me already.”

In my own systems, especially in Python-based backend projects, I see how the pip freeze output gets cluttered over time. At some point, the incompatibility between versions in the requirements.txt file makes the project “untouchable.” Code you are afraid to touch is dead code.

The Domain Renewal Trap: “It Might Be Useful One Day”

We all have a “domain graveyard,” I know. I renewed a domain I bought in 2018 thinking I’d do “smart agriculture automation” every year until 2024. I paid a total of $90, but there’s neither a sensor nor a single line of code. When the domain renewal email arrives, we say “I’ll definitely do it this year” with that momentary rush of adrenaline.

I have a rule now: If there isn’t even an index.html running under the domain and I haven’t made a single commit to that domain in the last year, I turn off the “Auto-renew” button the moment I see the renewal email. Letting go of the domain is the most concrete step in ending the project in your mind.

As I mentioned in my optimizing VPS costs post, every unnecessary asset opens an “unfinished business” folder in your mind. The more of these folders you have, the less RAM (brainpower) you can allocate to the tasks you actually need to focus on.

CriterionKill DecisionKeep Decision
TrafficLast 90 days < 100 unique visitorsSteady growth or stable audience
SecurityUnpatched CVEs, old kernel modulesUp-to-date dependencies
CostMonthly > $10 (if no revenue)Revenue > Expense or high learning value
MotivationYou’re afraid to open the codeYou’re eager to add new features

Pulling the Plug Protocol: Safe Destruction

When I decide to close a project, I don’t just hit the “delete” key. It’s a 20-year sysadmin reflex; there must always be an “exit strategy.” One day, an algorithm in that code or those 3-5 lines of data in that database might be needed.

The standard “Kill Protocol” I follow is as follows:

  1. Database Dump: If I’m using PostgreSQL, I take the schema and data with pg_dump. If the data is small, I also export it as JSON so it’s easy to parse if I do something with another language (e.g., Go instead of FastAPI) in the future.
  2. Static Archive: If it’s a website, I take a static copy of the site with wget --mirror. At least to see “what it looked like.”
  3. Code Archive: I tar.gz the project folder and throw it into a very cheap “Glacier” bucket on S3 or a physical external disk. I mark it as “Archived” on GitHub.
  4. Cleanup: I delete the systemd unit on the server, clean up Docker images with docker rmi, and remove the Nginx configuration.
# Example of taking a PostgreSQL backup and compressing it
pg_dump -U mustafa_user -h localhost my_dead_project_db | gzip > my_dead_project_db_$(date +%Y%m%d).sql.gz

# Docker system cleanup (use with caution)
docker system prune -a --volumes

The feeling of lightness that follows this process is priceless. Freeing up an extra 400 MB of RAM on the server and seeing the disk usage drop from 85% to 60% opens up space for new and more sensible projects.

Corporate Software Perspective and “Opportunity Cost”

The biggest mistake I saw while developing a production ERP was the obsession that “every module must always work.” There were some reports that a manager had requested 5 years ago; the manager had left the company, but that report continued to run every night at 03:00, straining the SQL server. We make the same mistake with side projects.

You need to understand the concept of “Opportunity Cost” well. Every hour you spend keeping a dead project alive is actually time stolen from a new idea with potential. If I’m working on a production planning algorithm and an alarm goes off because an old “weather bot” failed, repairing that bot is a waste of time for me.

Once, a memory leak occurred in the backend of my own side project. Every 12 hours, the OOM-killer would kick in and kill the process. Since I was lazy, I wrote a cron job that restarted it every 6 hours. This is technical proof that you should pull the plug on a project. If you’ve started working around the problem instead of solving it, that project has become a burden for you.

Lessons from the Graveyard

Every closed project is not a failure but a data point. When I closed that spam blocker I developed for Android, I learned: “Building a native bridge on the mobile side is very costly; next time I should choose a simpler architecture.” Or when I closed a financial calculator: “People want to see results with one click instead of complex forms.”

Don’t be afraid to clean up your side project graveyard. That graveyard is actually your library of experience. You just need to clear the dusty shelves to make room for new books. I perform a “Project Audit” every 6 months. If a project is stealing from my sleep, my pocket, or my main job, I say goodbye to it.

After all, I’ve been in this industry for 20 years, and the most successful people I’ve seen were those who knew what to stop doing, rather than just those who knew what to do. Take a look at that idle docker-compose.yml file on your server; maybe today is its last day.

In the next post, I’ll talk about how we build more effective “production-ready” systems with the resources we gained from this cleanup.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

Frequently Asked Questions

Common questions readers have about this article.

How should I identify if a side project is dead and decide to shut it down?
I first collect usage statistics; I measure the number of daily active users and CPU/RAM consumption using `docker stats`, `top`, and access logs. If I see an average of fewer than 5 active users and less than 5% resource consumption within a month, there is no concrete evidence that the project is still functional. Then I move on to cost analysis: I total up fixed expenses like domain, VPS, and database backups. Combining these two data sets, I set a threshold where both the financial and mental burden outweigh the benefit. If the threshold is exceeded, I post a one-week closing notice, back up the data, and pull the plug.
What tools can I use to detect idle resources and hidden costs?
I usually monitor container-based RAM and CPU usage with `docker stats`, the overall system with `htop`, and log accumulation with `journalctl --disk-usage`. I also check the number of database sessions via `psql` using `SELECT count(*) FROM pg_stat_activity;` and measure Redis memory consumption with the `redis-cli info memory` command. I automatically pull domain and server fees using the VPS provider's billing API and dump them into a Google Sheet. This combination shows me resources spent 'idly' from both an instantaneous and historical perspective, allowing me to base the decision-making process on concrete data.
What are the advantages and disadvantages of keeping a project? What factors should I weight when deciding to close it?
In my experience, the only advantage of keeping it is the potential to respond to a sudden future need and reuse the existing codebase. However, the disadvantages are much heavier: constant domain renewals, current security patches, log accumulation, and most importantly, mental energy consumption. When deciding, I first combine the financial cost (monthly/yearly) and the usage rate (active users/requests); then I evaluate maintenance time and technical debt levels (old PHP, deprecated libraries). If the cost/benefit ratio is below 1:5, closure is inevitable; otherwise, it makes more sense to restructure part of the project.
Is keeping a domain name always a smart move? Is there a common myth about this?
For many years, I lived with the myth of 'I'll keep the domain just in case I need it one day' and lost $15-20 every year. In reality, the value of a domain depends only on its brand or SEO potential; without an active project, it's just a name right. When deciding whether to keep a domain, I ask two questions: 1) Does this name still serve my business model? 2) Can I perform the same function with an alternative name? If both are no, it makes more sense to sell or drop the domain. This way, I get rid of both the financial and mental burden.
ME

Mustafa Erbay

Sistem Mimarisi · Network Uzmanı · Altyapı, Güvenlik ve Yazılım

2006'dan bu yana sistem mimarisi, network, sunucu altyapıları, büyük yapıların kurulumu, yazılım ve sistem güvenliği ekseninde çalışıyorum. Bu blogda sahada karşılığı olan teknik deneyimlerimi paylaşıyorum.

Kişisel Notlar

Bu notlar sadece sizde saklanır. Tarayıcınızda yerel olarak tutulur.

Hazır 0 karakter

Comments

Server-side AI Moderation

Comments are AI-moderated server-side and stored permanently.

?
0/2000

Server-side AI moderation

✉️ Free · No spam · Unsubscribe anytime

Curated digest, hand-picked by me — not the AI

Once a week: the most important post of the week, behind-the-scenes notes, and a "what I actually used this week" section. Less noise, more signal.

  • 📌
    Best of the week Single most-worth-reading post
  • 🔧
    Toolbox notes Real tools I used this week
  • 🧠
    Behind-the-scenes Notes that don't make it to blog

We don't spam. Unsubscribe anytime. · Tracked only by Umami (self-hosted, no Google).

Your Reading Stats

0

Posts Read

0m

Reading Time

0

Day Streak

-

Favorite Category

Related Posts