Notes from the studio.
Short pieces on web development, pricing, and the business of a small studio.
Where AI actually helps — and where it's a liability
We added AI consulting, so here's where we actually think AI belongs: the tasks it earns its keep on, the ones where it's a liability, and the four questions we run every feature through before we build it — or tell you not to.
Why we don't do retainers
Retainers smooth agency revenue at clients' expense. Here's how we structure ongoing work without them — quarterly scoped engagements and pay-only-for-hours-used hourly support.
Fixed-price quotes are a conviction, not a marketing tactic
Hourly billing and fixed-price billing pull the studio and the client in different directions. Why we put the constraint on ourselves and what we lose by doing so.
When not to hire us
Most agency sites are written like every prospect is a fit. They aren't. Seven categories of project where we'd tell you on the kickoff call to hire someone else.
Day-one ownership: why your accounts shouldn't live in our agency dashboard
On every project, the client owns the domain, hosting, database, and third-party accounts on day one. Why this matters more than it sounds, and what it costs us operationally.
Headless Shopify on Next.js: when it's worth it
Three signals that point at headless, four signals that point at staying on a Liquid theme, and an honest accounting of what the build actually costs.
The cart-in-a-cookie pattern: less state, fewer bugs
Most headless Shopify storefronts reach for Zustand or Redux on day one. We don't — the cart is a single ID in an HTTP-only cookie, set by middleware, with the server as source of truth.
MDX is a better CMS than your CMS (for sites that change quarterly)
The default of "reach for the headless CMS first" is wrong for most small-business marketing sites. When MDX in the repo wins, when it doesn't, and the TypeScript-objects variant.
Stripe Connect for multi-tenant SaaS: why we picked Standard
Three flavors of Connect, three different regulatory profiles. Why CombatScore runs on Standard, what it costs us in onboarding polish, and the application-fee detail nobody documents clearly.
Multi-tenant subdomains on Vercel without losing your weekend
Hundreds of branded tenant subdomains from a single Next.js deployment. The four pieces that make it work, and the two mistakes we made the first time.
What "Coram Deo" looks like inside a Stripe invoice
The number on the quote is the number on the invoice — even when scope creep would let us bill more invisibly. The mechanism that makes the rule livable, and why it's a conviction rather than a policy.
Working with a Reformed Christian studio: the FAQ
Do you only work with Christians? Will you turn down work? What does "Reformed" actually mean in practical terms? Honest answers to the questions we get asked privately.