Articles

Writing on software engineering and the decisions behind real systems.

Articles

Read Articles

Claude Code vs Cursor for Professional Work: How to Choose

Claude Code vs Cursor for Professional Work: How to Choose

Claude Code vs Cursor for professional work, compared on review control, repo scale, security, cost and team fit, with a pick for each situation.

Zero Downtime Deployment for PHP on Kubernetes: A Full Guide

Zero Downtime Deployment for PHP on Kubernetes: A Full Guide

Remove release downtime for a PHP monolith, a Next.js frontend and search on Kubernetes: probes, preStop drain, safe rollouts and Redis sessions.

How to Use Claude Code in Large Codebases: A Practical Guide

How to Use Claude Code in Large Codebases: A Practical Guide

A step-by-step guide to using Claude Code in large codebases: layered CLAUDE.md files, plan mode, scoped tasks, hooks, and a rollback routine.

How to Write a CLAUDE.md File That Claude Actually Follows

How to Write a CLAUDE.md File That Claude Actually Follows

Write a CLAUDE.md that Claude Code actually follows: what to include, what to cut, how to scope rules, and how to test and roll back changes.

AI Code Review Checklist for Teams: 9 Checks I'd Enforce

AI Code Review Checklist for Teams: 9 Checks I'd Enforce

An AI code review checklist for teams: nine checks for AI-generated diffs, each with its strength and limit, plus a routine to run weekly.

How to Review AI Generated Code: A Practical Guide

How to Review AI Generated Code: A Practical Guide

A practical guide to reviewing AI generated code: check intent, dependencies, tests and security, then turn it into a routine your team repeats.

Keycloak on Kubernetes Setup: A Production-Ready Guide

Keycloak on Kubernetes Setup: A Production-Ready Guide

Set up Keycloak on Kubernetes with PostgreSQL, TLS ingress, HA clustering, a hardened image and realms as code. Step-by-step, production-minded guide.

"SaaS Is Dead": Why You Should Ignore Every "X Is Dead" Headline

"SaaS Is Dead": Why You Should Ignore Every "X Is Dead" Headline

Everyone is repeating that SaaS is dead because AI agents will absorb business applications. I have been hearing this exact song since 2013, when I started with PHP — a language that has been declared dead every year since, and that earned me around $150,000 in the last two years.

This article traces where the "SaaS is dead" claim actually came from, why death headlines are marketing instruments rather than analysis, and how to tell genuine technological decline from a hype cycle — without turning "ignore the noise" into an excuse to stop learning.

How to Structure a Codebase for Scale and Maintainability

How to Structure a Codebase for Scale and Maintainability

Most advice about structuring a codebase assumes you are starting from an empty repository. Real work rarely looks like that. This article argues that structure is a response to a diagnosed problem, not a decision you make up front, and shows how to build the understanding that makes the decision possible.

It covers a verification loop for learning an unfamiliar system, the case for isolating business logic per endpoint (including what that approach costs), how to live with a legacy component that works but resists change, and what undocumented infrastructure does to a migration.

How I Rebuilt My 10-Year-Old Open Source Package with Cursor and Claude

How I Rebuilt My 10-Year-Old Open Source Package with Cursor and Claude

I rebuilt my ten-year-old Laravel package in two phases: a beta built with Cursor using a test-first agent loop, and a stable release built with Claude that split the package into a framework-agnostic core and a thin Laravel wrapper.

This is the workflow in detail — explaining expectations, having the AI write tests, reviewing those tests before letting the agent loop to green — plus the honest boundary of the method: passing tests are a claim about the code, not about the platforms it talks to.

What 10 Years of Maintaining an Open Source Package Actually Taught Me

What 10 Years of Maintaining an Open Source Package Actually Taught Me

I published a small Laravel package about ten years ago so a freelance client could stop copy-pasting blog content into three social networks. Since then it has been renamed twice, survived a long maintenance gap during an international move, led to a stranger thanking me on a street in Mashhad and a job offer from a US startup, and finally became the foundation of a product.

This is what actually happened in between: what renaming a package really costs, what users do when you go quiet, and the unpredictable places a public package can take you.