Essays
Writing
Topics
43 essays
2026
· 0 min read
Anthropic Academy — Six Certifications Completed
I completed six Anthropic Academy courses covering the Claude API, Model Context Protocol, subagents, agentic workflows, Claude Code, and AI fluency — each with a verified certificate from Anthropic Education.
· 0 min read
Prompt Versioning in Production: Managing LLM Prompts Like Code
How EasyCommerce manages LLM prompts across Claude, OpenAI, and DeepSeek with a versioned registry, structured evals in CI, and a rollback path that does not require a deployment.
· 0 min read
RAG Without a Framework: A Minimal pgvector Pipeline with Claude
How to build a complete RAG pipeline in Python without LangChain or LlamaIndex — chunking, embedding with text-embedding-3-large, pgvector retrieval, and grounded generation with Claude — with the tradeoffs that matter at production scale.
· 0 min read
Building a Claude Code MCP Server in Python: Lessons from codebase-research-agent
How codebase-research-agent exposes a tool-using AI agent as a Claude Code MCP server — JSON-RPC over Streamable HTTP, tool registration, streaming SSE, and the four things that broke in production before it worked reliably.
· 0 min read
How I Cut Edit Distance from 168 to 43 in a Legal Document RAG Pipeline
Three architectural changes that brought average edit distance from 168 to 43 in a legal document RAG pipeline — section-scoped chunking, section-scoped exemplar prompting, and switching from a general embedding model to a legal-domain one — with a CI eval suite that made the improvement trajectory visible and reproducible.
· 0 min read
Designing a ReAct-Style Codebase Research Agent with Tool Use
How codebase-research-agent uses a ReAct loop to orchestrate semantic search, AST navigation, symbol lookup, grep, and git blame as callable tools — the hybrid retrieval substrate it operates on, and why framing RAG as a tool rather than a pipeline changes the architecture fundamentally.
· 0 min read
Building a 12-Source Job Discovery Pipeline with RAG and pgvector
How JobPulse aggregates job listings across 12 sources in three tiers, embeds your resume into pgvector, and generates grounded cover letters via Claude — including the async adapter protocol, composite scoring model, and the three retrieval failure modes that shaped the final architecture.
· 0 min read
Scaling a Laravel MCP Tool Registry to 46 Tools
The May 12 post covered the MCP server architecture. This one goes inside the tool registry: class-per-tool structure, Sanctum ability scoping, JSON Schema validation before dispatch, tag-based auto-discovery, and the three things that broke when the registry hit 46 tools.
· 0 min read
Stop Using Fixed-Size Chunks for Technical Documentation
Why naive fixed-size chunking breaks on code-heavy documentation, and the heading-aware approach with paragraph fallback and overlap that replaced it in this portfolio's RAG pipeline.
· 0 min read
Voyage AI vs OpenAI Embeddings for Technical RAG in PHP
Why I switched from OpenAI text-embedding-3-small to Voyage AI voyage-code-3 for this portfolio's RAG layer — model comparison, the input_type asymmetry Voyage requires, measured retrieval improvement, and the migration path that keeps search live throughout.
· 0 min read
A Claude Tool-Calling Loop in Laravel: From First Request to Final Answer
The exact pattern for registering tools, dispatching multi-turn Claude conversations, and processing tool results in a Laravel service — including the three production failure modes the happy path does not cover.
· 0 min read
Embedding LLMs in a WordPress Plugin: EasyCommerce's Async Architecture
How EasyCommerce wires LLM calls — product description generation, fraud detection, and inventory forecasting — into a WordPress plugin using async dispatch and a provider abstraction that survives outages and scales across catalogues.
· 0 min read
MCP Servers for Laravel: A Production Pattern
How I built the MCP server that powers AI access to this portfolio — JSON-RPC over Streamable HTTP, Sanctum bearer auth, an ability-scoped tool registry, and the gotchas worth knowing before you ship.
· 9 min read
RAG on SQLite: Pure-PHP Cosine Similarity Without pgvector
How I built RAG retrieval against a SQLite database using pure-PHP cosine similarity — when it scales, when it doesn't, and the migration path to pgvector.
· 10 min read
A Multi-Provider AI Driver Pattern for Laravel
A clean driver pattern for switching between Claude, OpenAI, Groq, and Ollama in a Laravel app — with failover, testing, and a single calling interface.
· 8 min read
Cutting Claude API Costs by 89% with Prompt Caching
A practical Laravel integration of Anthropic prompt caching — what to cache, the 1024-token minimum, multi-breakpoint strategies, and real cost numbers.
· 10 min read
Building Production Gutenberg Blocks in 2025
A practical guide to building Gutenberg blocks with the v3 API — block.json, dynamic blocks, deprecations, and the testing strategies that actually work.
2025
· 11 min read
Building Custom Commission Logic in Dokan Multi-Vendor
How Dokan's commission system actually works, the filters you need, per-category and tiered commission patterns, and what to never do.
· 10 min read
WordPress Plugin Security: Lessons from Two Disclosures
The exact security checklist I run every plugin through before release — capability checks, escaping, nonces, and the disclosed bugs that taught me each lesson.
· 8 min read
Tailwind v4 Migration: From v3 Config to CSS-First Tokens
A practical guide to migrating a real Laravel app from Tailwind v3 to v4 — what breaks, the new @theme syntax, plugin migration, and the 5× build speedup.
· 9 min read
React 19 in Production: useTransition, useOptimistic, and the End of forwardRef
How I use the new React 19 hooks in this portfolio's admin — useTransition for non-blocking input, useOptimistic for instant UI, and refs as props.
· 7 min read
Splitting Laravel into Three Vite Bundles for Smaller Pages
How I split this portfolio into three independent Vite bundles (frontend, auth, dashboard) — separate dependencies, separate CSS, working HMR across all three.
· 8 min read
Caddy + Laravel: A 50-Line Production Config
The exact Caddyfile I run in production — automatic HTTPS, HTTP/3, security headers, rate limiting, asset caching, all in ~50 lines.
· 8 min read
Supervisor for Laravel: Queue Workers, Scheduler, Horizon
Production Supervisor configs for Laravel queue workers, schedule:work, and Horizon — with the gotchas around stopwaitsecs, max-time, and zero-downtime restarts.
· 8 min read
Cloudflare in Front of Laravel: Real IPs, Trusted Proxies, Locked-Down Origins
How to make Laravel see real visitor IPs through Cloudflare — TrustProxies config, origin firewall rules, geolocation headers, and the caching gotchas.
· 8 min read
Building a RAG Pipeline in Laravel with pgvector
How I built the AI chat on this site: chunking documents, generating embeddings with Voyage AI, storing them in pgvector, and answering questions with Claude.
· 9 min read
A Code Review Playbook That Catches Real Bugs
The three-pass review structure I've refined over a decade — when to push back, how to write comments, and what makes reviews valuable instead of performative.
· 10 min read
Laravel Queues at Scale: Lessons from 10 Million Jobs
Patterns and pitfalls I've learned running Laravel queues in production — from connection pooling and job chunking to dead-letter handling and zero-downtime deployments.
· 10 min read
How to Actually Work Async in a Distributed Team
Six years of async-first remote work — writing self-contained messages, when to switch to a call, time-zone etiquette, and the trap of over-rotating on async.
· 11 min read
The Honest Economics of Selling WordPress Plugins
Six years of selling on WordPress.org — conversion rates, pricing tiers, what drives installs, the support burden, and when to walk away from a plugin.
· 7 min read
Adding PHPStan to a WordPress Plugin (Without Losing Your Mind)
A practical guide to getting PHPStan running on a production WordPress plugin, including the stubs you need and the rules you'll want to ignore.
· 8 min read
Hunting N+1 Queries in Laravel: Tools, Strict Mode, and Fixes
How to find N+1 queries with Telescope, Debugbar, and preventLazyLoading() — and the eager-loading patterns that fix them, including the polymorphic gotcha.
· 9 min read
10 Eloquent Query Optimizations, in Order of Effectiveness
A systematic optimization checklist for Eloquent — select(), chunk(), chunkById(), withCount(), pluck(), subquery selects, and when to bypass the model layer entirely.
2024
· 12 min read
Building a WooCommerce Payment Gateway from Scratch
Everything you need to know to build a production-ready WooCommerce payment gateway integration — checkout flow, webhooks, refunds, and subscriptions.
· 10 min read
Six Redis Patterns Every Laravel App Eventually Needs
Cache, sessions, queues, rate limiting, locks, pub/sub — the Redis patterns I use in production Laravel apps, with the trade-offs and the failure modes.
· 9 min read
Building a Dark Design System with Tailwind CSS v4
How I designed the D1 "Dark Precision" system for this site — CSS-first @theme config, custom tokens, and a palette that passes WCAG at every level.
· 6 min read
WP-CLI Tips That Actually Save Time
Practical WP-CLI commands and custom commands I use daily to speed up WordPress development, deployments, and debugging.
· 8 min read
Feature Testing Laravel Applications with Pest
A pragmatic guide to writing fast, readable feature tests in Laravel using Pest — from test structure to database setup and API testing.
· 9 min read
Five Years of Open Source on WordPress.org — What I've Learned
Honest lessons from shipping and maintaining five plugins on WordPress.org — support burden, versioning, security reviews, and building an audience.
· 11 min read
Deploying Laravel on a VPS: Caddy, Supervisor, and Zero-Downtime Releases
The exact setup I use to deploy Laravel on a raw Ubuntu VPS — Caddy for automatic TLS, Supervisor for queue workers, and an atomic symlink deploy script.
· 9 min read
Semantic Search with pgvector and Laravel Scout
Add meaning-based search to your Laravel app using a custom Scout driver, pgvector HNSW index, and Voyage AI embeddings — with a hybrid keyword fallback.
2023
· 10 min read
TypeScript for PHP Developers
A practical transition guide for PHP developers picking up TypeScript — mapping familiar PHP concepts to their TypeScript equivalents, from null safety to generics.
· 8 min read
Scaling WordPress: Redis Object Cache, Query Optimization, and Page Caching
A systematic guide to making WordPress fast — from Redis object caching and WP_Query optimization to FastCGI page cache and CDN asset delivery.