2026-09-24

A GEO audit is a checklist, not a ranking model

What an audit of a young marketing site found, and why fixing every point on the checklist still wouldn't have moved it off page six.
SEOGEOAEOSearch Console
2026-09-24

A shop on a key-value store: index arrays, immutable Stripe prices and what you give up

Modelling products and collections in Workers KV, syncing them to Stripe without breaking history, and the reliability limits of a store with no queries.
Cloudflare WorkersKVStripeData modelling
2026-09-24

Demo mode as signed config, not a fork

Ephemeral public demo stores that can't send email, take payments or be crawled, driven by one flag in the same signed document as everything else.
ArchitectureSaaSTestingCloudflare Workers
2026-09-24

Direct-to-R2 uploads with presigned PUTs: presign, PUT, confirm

Files go from the browser straight to object storage. The server issues a URL, then trusts nothing until the client confirms.
Cloudflare R2S3UploadsCloudflare Workers
2026-09-24

Dropping the agent framework

Rebuilding a multi-tenant WhatsApp chatbot with a cheap classifier, a plain router and raw API calls instead of an agent framework.
AI agentsPythonLLMsArchitecture
2026-09-24

iCal is not a channel manager: what ARI restrictions are and why a booking engine needs them

An audit of a stays marketplace against what a real online travel agency needs, and the availability, rates and inventory model behind it.
MarketplacesData modellingBooking systemsAudits
2026-09-24

Modelling quizzes: question types, manual grading and the attempt state you didn't know you needed

What I learned by reading the source of a mature open-source LMS plugin before designing a quiz schema.
Data modellingLMSDatabasesRequirements
2026-09-24

Observability that lives outside the app stack

Grafana, Loki, Promtail, Prometheus, cAdvisor and node_exporter as their own compose stack, joined to the app only by a shared network.
ObservabilityDockerGrafanaPrometheusLoki
2026-09-24

One state machine for work orders: deleting the workflow

A print shop's order system with a single three-state task machine, an atomic pickup, a delivery gate and a signed customer ledger.
Data modellingPostgreSQLArchitectureRBAC
2026-09-24

OTP login, refresh-token families and three layers of access for multi-tenant portals

One identity system for patients, clinic staff, distributors and admins: challenge-based OTP in Redis, rotating refresh tokens, and access that is checked in three separate layers.
AuthFastAPIRedisSecurityRBAC
2026-09-24

Plans that never block checkout

Designing subscription tiers for a multi-tenant commerce platform so that billing state can never take a store's checkout offline.
ArchitectureSaaSBillingCloudflare
2026-09-24

Provisioning a WhatsApp number in six steps

Twilio subaccounts, a Chatwoot account, an agent bot, an inbox and a Meta embedded signup, wired into one onboarding flow.
TwilioChatwootWhatsAppIntegrationsAutomation
2026-09-24

Rebuilt this site with Astro

Why the site moved from hand-written HTML to Astro, and how it deploys from a docs folder.
AstroMeta
2026-09-24

Signed entitlements over KV: Ed25519, a five-step fallback chain, and a document that can only narrow

How a store Worker learns what it may do without ever learning what a plan is called, and why every failure path resolves to the shop still selling.
Cloudflare WorkersCryptographyMulti-tenantArchitecture
2026-09-24

Streaming microphone audio from a browser, in three attempts

WebM chunks, WAV, decoded PCM and finally an AudioWorklet. What broke, why, and what the two failed write-ups got wrong.
AudioWebAudioSocket.IODebugging
2026-09-24

The control-plane seam: idempotent usage snapshots, an event outbox and HMAC commands

How a per-tenant Worker and a central control plane talk to each other safely over unreliable networks, with no queue infrastructure.
ArchitectureCloudflare WorkersIdempotencySecurity
2026-09-24

The repo is the system of record

Setting up a small codebase so that both people and coding agents can work in it reliably, without a 500-line instruction file.
Coding agentsEngineeringDocumentation
2026-09-24

The webhook returns 200 first: a WhatsApp agent's message pipeline, tool loop and human handoff

What happens between a customer's message and the reply: filtering, acknowledging early, classifying, routing, a tool loop, a silent fallback and a four-call escalation.
AI agentsWebhooksPythonChatwootLLMs
2026-09-24

Two currencies, one invoice: keeping subscription billing and shopper commerce apart

A multi-tenant platform that bills merchants in one currency while their shoppers pay in another, and the bugs that appear when the two share a field.
BillingArchitecturePaymentsSaaS
2026-09-24

Why my WebSocket kept disconnecting

Ping timeouts, restarting sessions and rapid reconnect loops. The fix wasn't a timeout setting; it was a blocking call.
PythonSocket.IOasyncioDebugging