Article

Abandoned Composer Packages in Legacy Apps

Detect abandoned dependencies, evaluate forks and replacements, and schedule removals so CVEs and PHP upgrades stop stalling on dead packages.

Composer marks packages abandoned when maintainers redirect or stop supporting them. In legacy apps those packages often sit on critical paths—HTTP clients, old ORMs, payment SDKs—and block PHP 8 upgrades or leave known advisories unpatched. Treating abandonment as a backlog item with an owner is modernization work, not optional cleanup.

LEGACY — freeze forever
# Lockfile from 2018; ignored advisories; no owner
composer install --ignore-platform-reqs
MODERN — inventory and replace
composer outdated
composer audit
composer why vendor/old-package
# Replace on a branch, run tests, then deploy
composer require vendor/maintained-replacement:^2.0
composer remove vendor/old-package

Decision order

  1. Confirm the package is actually abandoned or unmaintained (Packagist warning, empty repo, last release age).
  2. Prefer an official successor namespace (for example Laminas packages replacing Zend Framework components).
  3. Evaluate a maintained fork with a clear license and release process.
  4. Wrap a minimal subset behind your interface and delete the rest.
  5. Vendor a snapshot only as a last resort with an explicit removal ticket.

Security audits

Run composer audit in CI. An abandoned package without a CVE today can still block the upgrade that would remove other vulnerable transitive dependencies. Track exceptions with expiry dates.

Tools: Composer.json Validator, Constraint Explainer, Platform Checker. Related: Managing legacy Composer dependencies, Composer center.

Related tools

Related reading