3 min read Emadideen Ghannam

The senior engineer's side-project trap

After 14 years I keep starting side projects. 80 percent never ship. Here is why I keep doing it and what I have learned to make peace with.

If you list the folders in my side-project directory you find about a dozen repos. Some are real products. Most are graveyards.

I am the trap I am writing about.

What I tell myself

Every side project starts with the same story. This is the one. The market is real. The stack is right. I have enough hours on a Saturday. I am 14 years into the career. I know which patterns work, which APIs to call, which databases to pick. I have all the parts.

For about three weeks the story is even true. The schema lands. The API ships. The SPA authenticates. The Postgres has row-level security and the BullMQ jobs run on a Redis I configured properly. It looks like progress.

Then I never write a marketing page. I never talk to a customer. I never decide who would actually buy this. The repo dies between branches.

Why it dies

The 14-year senior is rich in components and poor in product validation. The thing that’s hard about shipping a SaaS is not building Auth, Billing, multi-tenant data, queues, and observability. I can do those in my sleep and most of the time I do, in side projects, in my sleep, on Saturdays.

The thing that’s hard is finding a customer who will pay you and then doing the unfun work of keeping them happy. That work is invisible from inside the IDE. It does not look like a commit.

So I confuse “I have all the parts” with “I should ship it.” I do not. I have a really nice playground.

Reframing helped

The breakthrough for me was naming what side projects actually are. They are architecture playgrounds.

I learned NestJS in a side project. I learned Prisma migrations in another. I learned BullMQ vs RabbitMQ vs Postgres LISTEN/NOTIFY by running all three in different repos until I had opinions. I learned multi-tenant Postgres patterns by getting them wrong on a personal Saturday before getting them right at work on a Monday.

That work paid for itself. Not because the side project became a SaaS. Because the next Tech Lead conversation I had at $work was sharper. Because when a junior asked me about queues, I had a concrete answer, not a Wikipedia page. Because the architecture I shipped at $work used patterns I had practiced on my own time.

That payoff is real. It is not the founder fantasy. It is engineering compound interest.

What changed in my behaviour

Once I named it, two things changed.

I stopped pretending the playground was a product. No more landing pages on a domain I will never market. No more pricing pages on apps with zero users. The playground does not need a Stripe integration to teach me Stripe. I can read the Stripe docs. The signal that a side project should become a product is a user asking to pay me, not the SaaS template having a /pricing route.

I stopped feeling guilty for not shipping. A guitar player practising scales does not feel guilty for not headlining. They are practising. I am practising. The output of practice is not a record. It is the ability to play.

When a side project SHOULD become a product

There is a path to product, but it starts somewhere else. It starts with a problem you are personally annoyed by, in a market you understand, with one specific person who would write you a check. Not “B2B SaaS for HR.” A specific HR director at a specific company who told you the thing they hate.

I have only had one of those moments. The rest were architecture practice.

Take

Side projects compound your engineering. They rarely compound your career. Both can be true.


Edit on GitHub (opens in new tab)