Episode 12

TYPO3 Major Updates with Composer

Jochen Roth
Jochen Roth more

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.

Why Composer Mode Matters

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:

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:

  1. Open “composer.json" in your favorite editor
  2. Change every “typo3/cms-*” constraint from ^12.4 to ^13.4 ­ either manually (don't do this), or build a complex composer require statement for your CLI
  3. Run composer update
  4. Watch it fail because three extensions aren't compatible yet
  5. Go to TER or Packagist, search each extension, find which version supports TYPO3 13
  6. Update those constraints too
  7. Run composer update again
  8. Maybe it works. Maybe another extension blocks. Repeat.

If 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 :).

Introducing b13/typo3-updater

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.

Step 1: Prepare extensions

> 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.

Step 2: Upgrade core and remaining extensions

> 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.

Step 3: Bring extensions to their latest versions

> 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.

This Is Just the Composer Part

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.

We Can Help

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.

More Articles by Jochen Roth