/blog

Notes from the backend: PHP, Go, integrations, and the unglamorous details that keep production systems running.

post-005 2026-07-06 hiring · ai · career

Technical interviews are back — and AI is the reason

I spent years arguing against take-home coding challenges. Not because they don't work — because they cost the candidate a weekend to prove something a conversation could surface in twenty minutes. Then AI collapsed that cost, and the same format I'd written off suddenly makes sense again. Here's why I changed my mind, using a challenge I actually did.

~4 min read · read post →

project-002 2026-06-23 golang · web-apis · pwa · templ

You might not need an app: how far the browser reaches on a phone

A client asked me to build a native app for something the browser already does. So I built the counter-argument instead — a small gallery of live demos (camera, GPS, file capture, audio recording, the native share sheet) each running straight from a web page, no install, no app store. One server-rendered Go binary that also installs as a PWA.

~3 min read · read post →

project-001 2026-06-21 golang · vector-search · ai · simulation

Faking a market to make the intelligence real: inside a Go price-intelligence engine

To build competitive price intelligence I needed a living market to point it at — without scraping anyone. So I orchestrated one: a synthetic generator producing sticky, messy, occasionally-moving competitor data, on a clock I can fast-forward, resolved back to our catalog by an in-process vector search, watched by a deterministic anomaly brain, and streamed live to the browser over one SSE connection per page. The rule I held myself to: fake the acquisition, make the intelligence real. Here's the whole machine — synthetic data, the time trick, the vector DB, the real-time spine, the product surfaces it drives — and the AI layer I'm still building.

~8 min read · read post →

post-004 2026-05-12 golang · php

From PHP to Go: what twelve years of PHP taught me about writing Go

Switching languages after a decade isn't about syntax — that part takes a weekend. It's about unlearning reflexes. In PHP every request starts from zero; in Go the process lives forever and state outlives the request. Here's what carried over, what didn't, and the mistakes I made so you don't have to.

~3 min read · read post →

post-003 2026-03-28 integrations · soap

Talking SOAP to the Spanish Tax Agency — and surviving

Government APIs don't care about your deadlines. Building an automated invoice pipeline against AEAT's SOAP services taught me more about defensive programming, schema validation, and retry strategies than any REST API ever did. A field guide for anyone integrating with a system that was designed before you started programming.

~3 min read · read post →

post-002 2026-02-09 redis · architecture

Redis as a message queue: when it's enough, and when it isn't

You probably don't need Kafka. For years I ran caching and queuing for multiple production client systems on Redis alone. This post draws the honest line: the workloads where Redis lists and streams are exactly right, and the warning signs that you've outgrown them.

~2 min read · read post →

post-001 2026-01-15 golang · concurrency

Goroutines for PHP developers: a mental model that actually sticks

If your whole career has been one-request-one-process, channels feel like magic at first and like footguns shortly after. A practical mental model for concurrency built on the backend concepts PHP developers already know: queues, workers, and locks.

~3 min read · read post →

Disagree with a post? Tell me. POST /contact → best conversations start with a code review

POST /contact →