Skip to content

Writing

Notes from production

Decisions, mistakes and numbers from real systems. No listicles. RSS


  1. 3 min read

    RESO Web API integration in Laravel: a field guide from 100+ brokerages

    How to pull MLS listings through the RESO Web API into a Laravel platform without drowning in dialects: OData queries, incremental sync, media, rate limits and the one normalization decision that keeps you sane.

    • Laravel
    • RESO Web API
    • Real estate
    • Data pipelines

  2. 3 min read

    OAuth 2.0 for MCP servers: the checklist that passes a security review

    What an MCP server needs before security will let an AI assistant touch real systems: discovery metadata, PKCE, dynamic client registration, scopes, consent, token lifetimes, idempotency and audit.

    • MCP
    • OAuth
    • Security
    • AI agents

  3. 2 min read

    Prompt caching in production: why your cache hit rate is zero

    Prompt caching can cut LLM input cost by more than half, but only if the prefix is byte-identical. The silent invalidators I keep finding in production code, and how to structure requests so caching actually hits.

    • AI
    • Claude API
    • Cost
    • LLM

  4. 3 min read

    What it took to get a RAG support agent to resolve 90% of tickets

    The difference between a chatbot demo and a support agent that closes real tickets: retrieval design, typed tools, role-aware behaviour, evals and the metric we actually optimised.

    • AI
    • RAG
    • Agents
    • Laravel

  5. 2 min read

    Measure AI features by cost per resolved task, not tokens

    Token counts are a vanity metric. The one number that aligned engineering, finance and product on our AI features, and the four levers that moved it.

    • AI
    • Cost
    • Evals
    • Product

  6. 2 min read

    Prompt-driven deployments: putting OAuth in front of Coolify for MCP

    How a small Node service turned a static-token deployment API into an OAuth-protected MCP server that Claude can use safely, with consent, scopes, sessions and an audit trail.

    • MCP
    • DevOps
    • OAuth
    • Node.js

  7. 2 min read

    Multi-tenant SaaS on one schema: the rules that kept 50,000 customers separate

    Why we chose a shared database with hard tenant scoping over database-per-tenant for a federal-program CRM, and the five rules that made it safe.

    • Architecture
    • SaaS
    • Laravel
    • MySQL

  8. 1 min read

    Server-render the marketplace, hydrate what users touch

    How Tour27 went from an invisible single-page app to a travel marketplace where every tour page ranks, without giving up an interactive UI.

    • Next.js
    • SEO
    • NestJS
    • Architecture