Hien Phan Logo
Published on

The Hidden Costs of My Simple Tech Stack

4 min read
Authors

Table of Contents

The Unseen Costs of a 'Simple' Tech Stack: My Lessons in Technical Debt (Even with Supabase)

There was this moment, about six months into building my second product, where everything just… felt heavy. I’d intentionally chosen a "simple" tech stack: Next.js for the frontend and Supabase for the backend. It was supposed to be the perfect combination for rapid development, and for a while, it really was.

But then, the complexity started creeping in. Features I'd built quickly, without much thought beyond making them work, began to feel brittle.

Small changes would ripple into unexpected bugs elsewhere. The database schema, which I’d initially treated like a playground, was becoming a tangled mess.

It hit me: even with tools designed for simplicity, technical debt is a real thing, and it was starting to bite.

A developer looking frustrated at a messy code editor

I realized I needed a system to manage this before it completely derailed my progress. So, I developed my own little approach: "Technical Debt Triage." It’s not rocket science, but it’s been a game-changer for keeping my sanity and my codebase manageable.

Here’s how it works:

  1. Identify: This is the constant awareness phase.

When I’m building a new feature, or fixing a bug, I actively look for those "quick and dirty" solutions. Did I duplicate code?

Is this database query inefficient? Is this naming convention confusing?

I don’t fix it right then, but I make a mental note, or better yet, a quick entry in a dedicated "debt log."

  1. Document: My debt log is just a simple table in Notion. For each item, I record:
  • What is the debt? (e.g., "Duplicate auth logic in two components")
  • Where is it located? (e.g., /components/AuthForm.js and /pages/login.js)
  • Why is it a problem? (e.g., "Makes updating auth flow error-prone")
  • What’s the estimated effort to fix? (e.g., "1 hour")
  • What’s the priority? (e.g., "High (affects user experience")
  1. Resolve (Strategically): This is the crucial part.

I don't try to fix everything at once. That's a recipe for burnout.

Instead, I dedicate a small chunk of time each week) maybe 2-3 hours - to tackle the highest-priority items from my debt log. Sometimes this means refactoring a piece of code, sometimes it’s cleaning up a database function, or even just adding better documentation.

A diagram illustrating the Technical Debt Triage process

This triage approach has been incredibly effective. For instance, I had a recurring issue with how user profiles were fetched.

It involved multiple Supabase queries and some complex frontend logic. It wasn't broken, but it was slow and I dreaded touching it.

By logging it, I was able to break down the fix into smaller tasks: optimize the Supabase query, then refactor the frontend data fetching. When I finally tackled it during my "debt time," it only took an afternoon, and the performance boost was noticeable.

It’s easy to get caught up in the excitement of building new features, especially when you’re a solo founder. But ignoring the underlying structure is like building a house on sand. Even with a lean stack like Next.js and Supabase, which are fantastic for speed, you still need to be mindful of the long-term health of your project.

Here are a few practical tips to keep your tech stack lean and manageable:

  • Embrace Incremental Refactoring: Don't wait for a "big refactor" project. Fix small things as you go, or schedule regular, short sessions to chip away at your debt log.
  • Write Tests (Even Simple Ones): For critical pieces of logic, even basic unit tests can prevent regressions and give you confidence when refactoring.
  • Consistent Naming and Structure: This sounds basic, but consistent naming conventions for your database tables, columns, and code functions make a huge difference in readability and maintainability down the line.
  • Review Your Database Schema Regularly: Supabase makes schema changes easy, but that also means they can get messy quickly if you’re not careful. Periodically review your tables and relationships.
  • Don't Over-Engineer: Resist the urge to build for every possible future scenario. Build what you need now, but do it in a way that's reasonably easy to change later.
A graphic with bullet points listing tips for maintaining a lean tech stack

Ultimately, managing technical debt isn't about achieving perfection; it's about maintaining momentum and avoiding those moments where your "simple" stack feels like a burden. By being proactive and having a system, you can keep building fast without sacrificing the long-term health of your product.

What are your strategies for managing technical debt in your projects? I'd love to hear them in the comments!

Hien Phan

Struggling to turn ideas into profitable products? Building 52 products in 365 days, sharing the real journey from concept to revenue. Weekly insights on product development and solo founder lessons.

📚 Join readers reading 87+ articles on building profitable products

The Hidden Costs of My Simple Tech Stack | Hien Phan - Solo Developer Building 52 Products in 365 Days