Writing
Notes from production
Decisions, mistakes and numbers from real systems. No listicles. RSS
3 min readRESO 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
3 min readOAuth 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
2 min readPrompt 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
3 min readWhat 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
2 min readMeasure 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
2 min readPrompt-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
2 min readMulti-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
1 min readServer-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