# Legacy Laravel Upgrade — Laravel 5/6/7 → 12, zero downtime

**Eduardo Cruz** · Senior Laravel engineer · Recife, Brazil (UTC−3, US overlap)
Canonical page: https://eduardocruz.com/laravel-upgrade
Contact: https://eduardocruz.com/hire-me

I upgrade legacy Laravel applications — versions 5, 6, 7, 8 and 9 — to a current release
without a maintenance window and without a big-bang rewrite. The application keeps serving
traffic throughout while it is migrated one deprecated pattern at a time, with the missing
tests written along the way.

**Rate:** $60/hr USD, hourly, with a maximum number of hours agreed before each week starts.

---

## The four reasons upgrades stall (and how each is handled)

1. **"We can't afford the downtime."** There is no cutover night. The upgraded app runs beside
   the old one and routes move across in batches. At no point are both versions down, so there
   is no maintenance page.
2. **"We have no tests, so we can't touch it."** Characterisation tests are written immediately
   before each area is touched — they pin down what the code does today so the upgrade can prove
   it still does it tomorrow. The project ends with the test suite that never got written.
3. **"Half our packages are abandoned."** Every dead dependency gets an explicit decision:
   replace, vendor and maintain, or delete because the feature is gone. This audit runs first,
   because it is usually the real reason the previous attempt died.
4. **"Nobody left here knows why that code exists."** Odd code is usually scar tissue from a real
   incident. It gets read, tested and kept until something proves otherwise — never deleted
   because it looked strange.

## The three routes, and how to choose

| Route | What it is | When it's right |
|---|---|---|
| **Upgrade in place** | Walk the app up one major version at a time in the same repo | 1–2 versions behind, some test coverage, dependencies still maintained |
| **Strangle** | A current-version app boots alongside the legacy one and takes over routes in batches; the legacy app shrinks to a read-only archive | 3+ versions behind, or the business cannot freeze features. **The default for genuinely old apps.** |
| **Rewrite** | Start over from the requirements | Rarely. Only when the business rules themselves are being replaced, or Laravel is no longer the right tool at all |

A rewrite discards every edge case the old code silently handles and buys a long feature freeze
to return to where you already were. Picking the wrong route costs more than any of the three.

## What "AI-assisted" means, precisely

**Genuinely accelerated by AI:** exhaustively finding every occurrence of a deprecated pattern
across a large codebase; drafting characterisation tests for untested code; translating old syntax
to current syntax (helpers, facades, config shapes, Blade and frontend build changes); reading an
unfamiliar large codebase fast enough to be productive in week one.

**Stays human:** deciding what gets deleted; choosing the route; judging which abandoned dependency
to replace versus absorb; reviewing every generated change. A migration that ships unreviewed AI
output turns an upgrade into an incident. Anyone selling a fully automated framework upgrade is
selling a diff that nobody understands.

## When you should NOT hire me for this

If you are one version behind with a healthy test suite, you do not need help. Run the official
upgrade guide, or buy Laravel Shift for a fraction of an hour of my time.

## About

12+ years of production Laravel, since the 4.x era. Building for the web since ~1994. Also works on AI agents,
MCP servers and the Laravel AI SDK — see https://eduardocruz.com/writing for technical articles.

Full offer and FAQ: https://eduardocruz.com/laravel-upgrade
Start a project: https://eduardocruz.com/hire-me
