A new Composer Plugin helps us update our TYPO3 projects - read more on how we do it!
Upgrading TYPO3 to a new major version is one of those tasks that every agency knows well. It's not a single step — it's a process. Check extension compatibility, find newer versions, update constraints, resolve conflicts, run the Upgrade Wizard, adapt code with Rector, run your test suite, and verify everything works. Most of these steps are well-documented and well-understood.
But there's one part in that process that has always been surprisingly manual: figuring out which Composer packages need to change, and to what version. We built a small tool to fix that.
If you're still running TYPO3 in classic (non-Composer) mode, upgrading is a different kind of pain. You download ZIP files, drag folders into typo3conf/ext/, and hope that the versions you picked are compatible with each other. There's no dependency resolution, no lock file, no reproducible state.
Composer mode changes that fundamentally. Every package — TYPO3 core, every extension, every PHP library — is declared with a version constraint, resolved against a dependency tree, and locked to exact versions in composer.lock. This gives you:
composer update is a well-defined operation with a well-defined outcome. It either works or it tells you why it doesn't.For agencies managing multiple TYPO3 projects, Composer mode isn't optional — it's the foundation that makes professional workflows with Continuous Integration + Deployment possible. However, when talking to fellow developers, we all have a hard time to understand what composers' output means and to simply answer: Why can't we “just” update TYPO3?
The smooth experience ends if people start to remove the vendor/ folder, the lock file, or manually change contents in the composer.json file.
When upgrading from e.g. TYPO3 12 to 13, the Composer part of the process looks something like this:
composer require statement for your CLIcomposer updatecomposer update againIf you're unlucky, you've now modified the “composer.json” file in a state that doesn't resolve, and you need to carefully revert. If an extension only has a pre-release version for TYPO3 13, you need to find that too. If some extensions are in `require` and others in `require-dev`, you need to handle them separately.
None of this is difficult. But it's tedious, error-prone, and it's the same set of steps for every single project. That's exactly the kind of work that should be automated. And I like automation :).
We built b13/typo3-updater — a Composer plugin that automates the dependency side of TYPO3 major upgrades. It provides two commands and a clear three-step workflow.
> composer typo3:extensions:update ^13.4
While still running on TYPO3 12, this command checks every installed extension against the target version. It queries Packagist for compatible versions, shows you a compatibility table, and interactively offers to update extensions. This is the safest first move — your core stays untouched, but your extensions are already prepared for what's coming.
> composer typo3:core:update ^13.4
This updates all "typo3/cms-*" constraints and also detects any extensions that still aren't compatible. It finds their latest compatible versions — stable first, falling back to pre-releases if necessary — and resolves everything in a single “composer update -W” call.
If the update fails, the composer.json file is automatically reverted to its original state. No manual cleanup needed.
> composer typo3:extensions:update ^13.4
After the core upgrade, running the same command again finds the latest available version of each extension for the now-running TYPO3 version. This ensures you're not stuck on the minimum compatible version that was needed to make the upgrade work, but running the newest release available.
Each step shows you exactly what it will do before making any changes. Add --dry-run to any command to only see the output without modifying anything.
To be clear: Updating Composer dependencies is necessary, but it's not sufficient. A TYPO3 major upgrade involves more than changing version numbers.
Before you start, make sure your project is in version control. Use Git. Commit your current state. Create a branch for the upgrade. This way you can always go back, compare changes, and repeat the process if needed.
After the Composer update, you'll typically need to:
The Composer step is the foundation — it gets you to a state where TYPO3 13 is actually installed and running. Everything else builds on top of that.
If your TYPO3 project is still running in classic mode and you want to migrate to Composer, or if you're planning a major version upgrade and want experienced hands on the wheel — get in touch. We've done this for projects of all sizes, and we know where the edge cases hide.