Notes on AI coding agents, back-end work and the occasional Formula 1 season.
PHP2Shell: What to Do About CVE-2026-109618 and CVE-2026-109619
PHP2Shell is fixed in PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35. What the two flaws are, who's at risk, what to do, and how 21 October 2026 unfolded.
Agent Office: I Built a 3D Office for My AI Coding Agents
Agent Office turns Claude Code, Cursor and Antigravity agents into engineers in a 3D office, with task boards, worktrees, shared memory and cost tracking.
CLAUDE.md vs AGENTS.md: One Memory for Every Coding Agent
CLAUDE.md, AGENTS.md or .cursor/rules? Which file each coding agent reads, what research says to put in it, and how to share memory across engines.
How I Run Parallel Claude Code Agents with Git Worktrees
Run several Claude Code agents on one repo without collisions: git worktrees, the --worktree flag, .worktreeinclude, ports, merging and my automated setup.
How I Took a GSAP-Heavy Site from 48 to 85 in Lighthouse
How my GSAP and Next.js site went from 48 to 85 in Lighthouse with 100 accessibility, and two LCP and layout shift traps that animated sites walk into.
I Haven't Written "Boilerplate" in 12 Months (And I Don't Miss It)
Is coding dead in 2026? No, but it has changed. How Cursor and Claude Code shifted my role from "writer" to "architect", and what that feels like.
My 2025 F1 Season Recap: The Year McLaren Won Despite McLaren
2025 F1 recap: Norris beat Verstappen by 2 points. Red Bull's setup struggles, McLaren's pit stop blunders and my top 10 driver ranking.
Creating a custom sitemap with dynamic content in Next.js
How to build a dynamic sitemap in Next.js with the App Router, so blog posts and other dynamic pages are added to sitemap.xml automatically.
Symfony 6.4.7 Release
Symfony 6.4.7 is out. A rundown of the most important bug fixes and changes since 6.4.6, with links to every pull request.