Welcome into my head

03 Feb 2026

My SaaS Tech Stack: Chosen by an Engineer Who Likes Simplicity

Building a SaaS is full of important decisions.

Tabs or spaces.
Dark mode or forced dark mode.
And of course: Which tech stack will ruin my weekends the least?

After experimenting with shiny frameworks, clever abstractions, and architectures that looked amazing in diagrams, I landed on a simple rule:

If a system is easy to understand, it’s hard to kill.

This is the stack I use today—and why every tool is here to reduce complexity, not manufacture it.


Simplicity Is Not a Lack of Ambition

“Simple stack” often gets translated as:

  • Small product
  • Low scale
  • Temporary solution

In practice, the opposite is usually true.

The first thing that breaks in a growing SaaS is not the database.
It’s not performance.
It’s developer velocity and confidence.

Complex systems slow you down long before traffic ever does.

So I default to simple—and let reality force complexity later.


Go: Because I Prefer Code Over Sorcery

Go is the foundation of everything.

What I like about Go:

  • One static binary
  • Explicit behavior
  • Predictable performance
  • No hidden runtime theatrics

Go code reads like instructions, not riddles.

When something breaks, I don’t need a debugger, a blog post, and a priest—I need grep and a cup of coffee.

That clarity compounds over time.


Echo v5: A Web Framework That Knows When to Shut Up

For HTTP routing and middleware, I use Golang Echo v5.

Echo hits a sweet spot:

  • Fast
  • Minimal
  • Well-structured
  • Doesn’t fight Go’s standard library

It gives me:

  • Clean routing
  • Sensible middleware
  • Context handling without drama

Most importantly, Echo doesn’t try to become the architecture.
It stays in its lane and lets the application logic stay obvious.

That’s exactly what I want from a web framework.


Golang Templ: HTML That Refuses to Lie

I render HTML using Golang Templ.

Why?

  • Type-safe templates
  • Compile-time errors
  • No string-based HTML chaos

If I rename a field and forget to update the template, the app simply won’t compile.

This is the kind of tough love I respect.

Templates live close to the logic, refactors are safe, and runtime surprises are rare—which is the dream.


HTMX: Interactivity Without a Frontend Midlife Crisis

Most SaaS products don’t need:

  • Client-side routers
  • State management libraries
  • JavaScript build systems that rival the backend

They need:

  • Forms
  • Buttons
  • Tables
  • Partial updates

HTMX gives me interactivity while keeping:

  • The server in control
  • HTML as the contract
  • The browser doing what it already does well

No SPA.
No hydration bugs.
No “why is this state different over here?” moments.

Just HTML behaving responsibly.


PostgreSQL: Shockingly Good at Being a Database

PostgreSQL handles:

  • Transactions
  • Constraints
  • Concurrency
  • Reporting

Which is incredible, considering that’s literally its job.

Instead of inventing clever data storage schemes, I let Postgres do what it has been doing reliably for decades—and doing extremely well.

Simple schema. Clear queries. Long runway.


RiverQueue: Background Jobs Without Summoning Another System

Every SaaS eventually needs background jobs:

  • Emails
  • Webhooks
  • Async processing
  • Long-running tasks

Instead of introducing Kafka, RabbitMQ, or a new operational headache, I use RiverQueue, which runs directly on PostgreSQL.

That means:

  • One datastore
  • One backup strategy
  • One mental model

Background jobs should be boring.
RiverQueue makes them boring in the best way.


Redis: Powerful, Dangerous, Used With Adult Supervision

Redis is fantastic.

Redis is also how many architectures quietly become complicated.

In this stack, Redis is:

  • A cache
  • Short-lived state
  • Performance optimization

It is not a source of truth.
It is not the backbone of the system.

Used intentionally, Redis speeds things up without turning the app into a distributed puzzle.


CSS: I Refuse to Argue With My Stylesheet

For styling, I optimize for:

  • Semantic HTML
  • Accessibility
  • Low maintenance

That’s why I use:

The goal isn’t flashy UI—it’s shipping changes without emotional damage.


The Unexpected Benefit: Operational Peace

This stack has a feature I value more than benchmarks:

It’s calm to operate.

Deployments are simple.
Failures are understandable.
Fixes don’t require a Slack war room.

No frontend-backend negotiations.
No distributed-system cosplay.
Just a small set of tools working together quietly.


Final Thought

This stack won’t win “Most Exciting Architecture” awards.

But it will:

  • Scale with the product
  • Stay maintainable
  • Let me focus on users instead of frameworks

And honestly?

That’s how you build something that lasts.