Journal

Thinking, in public

Field notes on design, engineering and growth — written by the people who ship the work. No thought leadership, just lessons with receipts.

Engineering · 5 Mar 2026 · 10 min

Choosing a framework without the fashion show

How to choose a web framework honestly in 2026: content site vs app, team skills, hiring, SSR needs, ecosystem gravity, exit costs — plus our decision memo.

architecturereactdecision making
Engineering · 5 Mar 2026 · 12 min

CSP without the tears: a security baseline for content sites

A copy-paste security headers baseline for content sites: Content-Security-Policy with nonces, report-only rollout, and the headers nobody checks until audit.

securityhttpfrontend-infrastructure
Growth · 5 Mar 2026 · 12 min

Funnel metrics: measure the movement, not the moment

Snapshots lie; cohorts and velocity tell the truth. How to define funnel stages across teams, pick the metrics that find the constraint, and run the weekly review.

analyticsfunnelmetrics
Playbooks · 5 Mar 2026 · 10 min

Switching agencies mid-flight: a transition playbook

How to leave an agency — or inherit a fired one's work — without losing the project: asset inventories, handover audits, the two-sprint overlap rule.

agency relationshipshandovertransitions
Growth · 4 Mar 2026 · 10 min

International SEO without tears: hreflang, ccTLDs and content reuse

Going international without tanking search: ccTLD vs subfolder trade-offs, hreflang that doesn't break, translations that respect local intent, staged validation.

international SEOhreflanglocalisation
Product · 4 Mar 2026 · 9 min

Invite flows: the social onboarding of team products

The invite flow is where one user bets their reputation on your product. Role choice at invite time, shareable links vs email, and viral-loop honesty.

invite flowteam onboardingcollaboration
Brand · 3 Mar 2026 · 10 min

Brand voice in the bad moments: errors, churn and apologies

Brands break character exactly when character matters. Voice principles for error states, downtime, price rises, cancellations and apologies that aren't theatre.

brand voiceUX writingerror messages
Playbooks · 3 Mar 2026 · 9 min

Setting goals for a redesign that aren't vibes

How to turn 'make it feel modern' into measurable redesign goals: primary metrics, kill criteria, baseline capture, and reporting that survives launch fog.

redesignmeasurementproject goals
Playbooks · 3 Mar 2026 · 9 min

How to read an agency SOW before you sign it

Most SOW disputes were visible in the document. How to read scope boundaries, assumptions, change control, acceptance criteria and warranties before signing.

agency selectioncontractsproject management
Brand · 2 Mar 2026 · 11 min

Co-branding without the mush

Partnership branding without the logo soup: hierarchy rules, lockup maths, shared-palette strategy, and the pre-nup questions that prevent ugly co-brands.

co-brandingpartnershipslogo lockups
Product · 2 Mar 2026 · 9 min

Product search UX: from query box to answers

In-app search is a product decision wearing an engineering costume: scoping, suggestions, typo tolerance, filters vs facets, and no-results states that navigate.

searchinteraction designinformation retrieval
Engineering · 26 Feb 2026 · 11 min

Zero-downtime Postgres migrations, without heroics

Zero-downtime Postgres migrations with expand-migrate-contract: safe backfills, the locking hazards that catch everyone once, and our pre-flight checklist.

postgresmigrationsdatabases