The Boring Stack That Lets Us Ship

S
Stu
July 12, 2026 · 2 min read
engineering

Every few months someone asks what our "stack" is, expecting a list of trendy tools. The honest answer is boring on purpose: .NET 10, Blazor, PostgreSQL, and Cloudflare. That's most of it. The boring part is the point.

Boring means we spend our time on the product

Exciting stacks come with a tax: the framework churns, the ecosystem argues, and you spend your week keeping up instead of shipping. We'd rather spend that week building the thing a customer actually asked for.

Our whole product shelf — the marketing site, the SaaS apps, the admin tools — runs on the same handful of pieces:

  • Blazor Server for the UI, so one language (C#) spans front and back and we're not maintaining two mental models.
  • EF Core + PostgreSQL for data, boring and bulletproof.
  • One shared server running everything in Docker Compose behind a Cloudflare Tunnel — no load balancers to babysit, no per-app infrastructure to reinvent.

None of that will win a "hot new tech" award. All of it lets a small team run a dozen apps without drowning.

The multiplier: a template, not twelve snowflakes

The real trick isn't the stack, it's that every app starts from the same stack. We keep a starter template with auth, billing, admin, and analytics already wired up. A new product doesn't begin at zero — it begins at "the boring 80% is done." When we improve the template, we ship the improvement out to the other apps as a patch.

That's how one weekend can turn into a live product instead of a login screen.

Boring where it counts, sharp where it matters

Being boring about infrastructure buys us the freedom to be interesting about the actual product — the feature that solves your specific annoyance. The customer never sees our database or our container setup, and that's exactly how it should be. They see a tool that works.

So no, we're not going to rewrite everything in the framework that trended last month. We're going to keep shipping.


This is a draft — edit the voice, trim it, or expand any section before publishing.

An unhandled error has occurred. Reload 🗙

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please reload the page.