Writing

Notes from the field.

Long-form writing on Go, web architecture, open source maintenance and what it's like to run a small software studio in 2026.

RSS feed
31 posts
May 10, 2026
OpenTelemetry in Go without the ceremony

OpenTelemetry is the observability standard. How to instrument a Go backend with traces, metrics, and logs — without wrapping the whole codebase.

Go13 min read
May 08, 2026
SQLite in production: when it beats Postgres

SQLite stopped being a prototype DB in 2025. Between Litestream, Turso, and WAL mode, there's a real production case. Here's when to reach for it.

Architecture9 min read
May 06, 2026
NATS vs Kafka for Go: an honest comparison

Kafka is the default choice for event streaming. NATS is the thing you pick when you've run Kafka once. Here's when each is actually right.

Go11 min read
May 04, 2026
What platform engineering means at five

Platform engineering is the hot infra job title. Most writing about it assumes 50 engineers. Here's what it actually looks like at five.

Infra9 min read
May 02, 2026
Building AI features in a Go backend

Adding AI to a backend isn't about a new framework. It's structured prompts, tool use, streaming responses, and failure modes you haven't seen.

Go12 min read
Apr 25, 2026
JWT auth in Go and Postgres, from scratch

A complete walkthrough: user registration, password hashing, JWT signing, protected routes, and refresh tokens — no auth library required.

Go16 min read
Apr 24, 2026
How to choose a software development partner

Most teams pick a software development partner the wrong way. Here's the short list of signals that actually predict a good engagement.

Studio10 min read
Apr 23, 2026
Session vs token auth in Go: a comparison

Sessions and tokens are both valid. They have different trade-offs and different failure modes. Here's how to pick the right one for your Go backend.

Go11 min read
Apr 18, 2026
Building resilient CLIs in Go

Why every serious CLI tool needs a retry budget, a structured error surface, and a story for SIGTERM — and how we codified that in resilient-cli.

Go12 min read
Apr 15, 2026
Custom software vs SaaS: build or buy?

The build-vs-buy decision isn't really about cost. It's about which parts of your business you're willing to outsource to someone else's roadmap.

Studio9 min read
Apr 14, 2026
Clean architecture in Go: keep what matters

Clean architecture has good ideas and some dead weight. Here's how we adapt it for Go backends — keeping the domain isolation, dropping the ceremony.

Go13 min read
Apr 10, 2026
MVP scoping that survives contact with reality

Most MVPs ship late because they were scoped on a whiteboard, not against a calendar. Here's the scoping pass we run before we quote a number.

Process8 min read
Apr 08, 2026
Go + Postgres without an ORM: sqlc and pgx

ORMs hide Postgres from you. sqlc and pgx expose it — with type safety, generated queries, and connection pooling that actually works under load.

Go14 min read
Apr 06, 2026
Dependency injection in Go without a framework

Go doesn't need a DI container. It needs constructor functions and a main.go that wires everything together. Here's the pattern we use on every project.

Go10 min read
Apr 03, 2026
Go migrations with gomigrate: a production guide

gomigrate is our open-source migration tool for Go and Postgres. Plain SQL, embedded files, atomic transactions, CI-friendly CLI — here's everything it does.

Go12 min read
Apr 02, 2026
The case for vertical slices in small teams

Layered architectures feel tidy on paper. In a four-person team shipping weekly, they mostly generate meetings. Here's what we do instead.

Architecture9 min read
Apr 01, 2026
Zero-downtime Go migrations with gomigrate

Most migration guides change a schema. This one changes it while the app is running, using the expand/contract pattern with gomigrate.

Go11 min read
Mar 28, 2026
Postgres row-level security, without the footguns

RLS is a genuinely good feature stapled on top of genuinely scary defaults. A field guide from three production rollouts.

Postgres15 min read
Mar 21, 2026
What actually drives mobile app development cost

The honest answer to "how much does an app cost?" is a list of decisions you haven't made yet. Here's the list.

Mobile8 min read
Mar 15, 2026
HTTP servers in Go: stdlib vs chi vs Gin

Three solid options, different trade-offs. Here's the comparison we run in our head when starting a new Go backend — and the one we usually land on.

Go12 min read
Mar 10, 2026
Validation and error handling in Go APIs

Inconsistent errors are a support ticket waiting to happen. Here's the validation and error-handling shape we standardise across every Go API we ship.

Go11 min read
Mar 05, 2026
Why we bill for discovery

Free discovery calls feel generous. They mostly select for clients who don't value the work. Here's the framing we use instead.

Studio6 min read
Feb 24, 2026
Middleware in Go: auth, logging, rate limits

Go middleware is just a function that wraps a handler. That simplicity is a feature — here are the three patterns every Go backend needs, implemented cleanly.

Go12 min read
Feb 20, 2026
Web app or mobile app: which to ship first

The first platform you ship on shapes the next year of your product. Pick it for the right reasons, not because of a stock photo of a phone.

Mobile7 min read
Feb 15, 2026
A small, boring deploy pipeline

GitHub Actions, a single shell script, and a Caddy server. What our deploys actually look like after the shiny wears off.

Infra11 min read
Feb 09, 2026
When to outsource software development

Outsourcing isn't a strategy. It's a tool with a narrow set of correct uses. Here are the four we've seen work and the three that always burn.

Studio9 min read
Feb 05, 2026
API design that ages well

Every API ages. The question is whether it ages like wine or like milk. Six rules we apply on every public surface we ship.

Architecture11 min read
Jan 28, 2026
SaaS architecture for early-stage products

Early-stage SaaS doesn't need microservices, Kubernetes, or a service mesh. It needs a boring monolith and a database you understand.

Architecture10 min read
Jan 20, 2026
Interviewing for taste

Technical screens filter for craft. But the thing that actually separates senior engineers is taste — and you can, carefully, interview for it.

Team8 min read
Jan 15, 2026
In-house vs studio: a frank comparison

Hiring an in-house team is the right answer eventually. It's almost never the right answer first. Here's the cost model we walk clients through.

Studio9 min read
Jan 08, 2026
Technical debt worth keeping

Not all technical debt is bad. Some of it is the only reason you shipped at all. A working taxonomy after a decade of cleanup projects.

Architecture8 min read
Monthly, ship-quality

Get our longest writing, once a month.

One email, first of the month. New posts, package releases, and whatever we've been nerding out over. No sales, no tracking pixels.

One email a month. Deep-dives, new releases, no fluff.