Since 2014, I take PHP projects stuck on old versions and frameworks, and bring them to the current stable one. Not a workshop, not a report you file away — the actual upgrade, delivered and merged.
"If you really want to do something, you'll find a way.
If you don't, you'll find an excuse."
Full upgrade service, end to end:
- PHP 5.3 → 8.5 — version by version, your test suite green at every step
- Framework jumps — Symfony 2 → 7, Laravel 5 → 12, CakePHP, Yii, Nette, Zend 1 → Laminas
- Custom frameworks — the homegrown one only your team knows, moved to something maintained
- Legacy → framework — from no-framework spaghetti to a structure you can hire for
- PHPUnit, Doctrine, and the rest of your
composer.json— the dependencies that block everything else - Static analysis from zero — PHPStan running in CI, at a level your team can hold
You keep shipping features while the upgrade runs. Your team learns the tooling, so the next upgrade is yours to do.
👉 Let's talk about your project
Instant upgrades of hundreds of thousands of lines are only possible with automation. So I build it:
- 🚀 Rector — the instant upgrade and refactoring tool for PHP
- 🐹 Recongo (private, in the works) — Rector-like automated refactoring, written in Go
- 📏 lines — measure project size and used PHP features, zero dependencies
- 🔍 type-coverage — PHPStan extension to require minimal type coverage
- 🧹 unused-public and class-leak — find the dead code before you migrate it
- 🩺 phpstan-bodyscan — error count per PHPStan level, so you know where you stand
- 🖌️ I blog weekly about upgrades, static analysis and PHP at tomasvotruba.com
- 📖 I wrote The Power of Automated Refactoring with my childhood hero
- 🐦 I post ideas worth learning at @votrubaT
- ❤️ Do you enjoy the tasty fruits of my work? Support me at GitHub Sponsors
Legacy code isn't a problem — it's the code that made your business money. Let's make it fun to work with again.







