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