Skip to content

Thinking

Technical articles on AI, development tools, cloud architecture, and software engineering.

How we rescue and refactor: a platform migrated off a low-code tool, one year later
Development

How we rescue and refactor: a platform migrated off a low-code tool, one year later

In 2025 a US client handed us a business platform that runs their partner programme: onboarding, product listings, monthly earnings, payouts in several…

How we build web applications: the first three weeks, and the year after
Development

How we build web applications: the first three weeks, and the year after

This year we shipped two very different web platforms with the same method.

DynamoDB single-table or Postgres? How we chose, per workload, and where we got it wrong
Development

DynamoDB single-table or Postgres? How we chose, per workload, and where we got it wrong

The DynamoDB versus Postgres debate is usually argued as a religion. One side says relational data belongs in a relational database and single-table design is…

Docker images for Node in 2026: multi-stage, distroless, and the 1.1 GB image that became 140 MB
Development

Docker images for Node in 2026: multi-stage, distroless, and the 1.1 GB image that became 140 MB

How a multi-stage, distroless Dockerfile took our Node/Next.js image from 1.1 GB to 140 MB: the full Dockerfile, what broke, and the before/after numbers.

A monorepo with three apps: how we build only what changed, and got the pipeline from eight minutes to three
Development

A monorepo with three apps: how we build only what changed, and got the pipeline from eight minutes to three

Three Next.js applications, four shared packages, one repository. That's the shape of the platform we run for a US client, and it's the right shape: shared…

Build-time vs runtime config in Next.js on containers: the bug that took two deploys
Development

Build-time vs runtime config in Next.js on containers: the bug that took two deploys

We flipped a feature flag. The flag was an environment variable on the App Runner service, NEXT_PUBLIC_NEW_CHECKOUT=true, changed through CDK, deployed…