NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #538 most downloaded on Packagist
Provides a composer plugin for normalizing composer.json.
Last release 7 days ago
24 Sep 2026
Ships fairly regularly
a new release about every 4 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
9 years old
109 releases · first in 2018
For a full diff see [2.11.0...2.12.0][2.11.0...2.12.0].
For a full diff see [2.11.0...2.12.0][2.11.0...2.12.0].
composer normalize ([#641]), by [@localheinz]ergebnis/json-normalizer:^1.0.0 which allows recursively sorting config hashes ([#634]), by [@dependabot]composer/composer:2.0.8 for composer-normalize.phar ([#640]), by [@localheinz]For a full diff see [2.10.0...2.11.0][2.10.0...2.11.0].
For a full diff see [2.10.0...2.11.0][2.10.0...2.11.0].
schema.json ([#615]), by [@ergebnis-bot]One column per quarter.
For a full diff see [2.9.1...2.10.0][2.9.1...2.10.0].
For a full diff see [2.9.1...2.10.0][2.9.1...2.10.0].
For a full diff see [2.9.0...2.9.1][2.9.0...2.9.1].
For a full diff see [2.9.0...2.9.1][2.9.0...2.9.1].
composer/composer:^1.10.17 and used composer/composer:1.10.17 for composer-normalize.phar ([#596]), by [@localheinz]composer/composer:^1.0.0 ([#597]), by [@localheinz]For a full diff see [2.8.2...2.9.0][2.8.2...2.9.0].
For a full diff see [2.8.2...2.9.0][2.8.2...2.9.0].
schema.json ([#572]), by [@ergebnis-bot]composer/composer:^1.10.15 and used composer/composer:1.10.15 for composer-normalize.phar ([#582]), by [@localheinz]For a full diff see [2.8.1...2.8.2][2.8.1...2.8.2].
For a full diff see [2.8.1...2.8.2][2.8.1...2.8.2].
composer/composer:^1.10.13 ([#554]), by [@localheinz]For a full diff see [2.8.0...2.8.1][2.8.0...2.8.1].
For a full diff see [2.8.0...2.8.1][2.8.0...2.8.1].
For a full diff see [2.7.0...2.8.0][2.7.0...2.8.0].
For a full diff see [2.7.0...2.8.0][2.7.0...2.8.0].
schema.json ([#526]), by [@ergebnis-bot]Nothing published for this version
For a full diff see [2.6.1...2.7.0][2.6.1...2.7.0].
For a full diff see [2.6.1...2.7.0][2.6.1...2.7.0].
--no-check-lock option which allows skipping validation of composer.lock ([#515]), by [@localheinz]schema.json ([#512]), by [@ergebnis-bot]For a full diff see [2.6.0...2.6.1][2.6.0...2.6.1].
For a full diff see [2.6.0...2.6.1][2.6.0...2.6.1].
For a full diff see [2.5.2...2.6.0][2.5.2...2.6.0].
For a full diff see [2.5.2...2.6.0][2.5.2...2.6.0].
For a full diff see [2.5.1...2.5.2][2.5.1...2.5.2].
For a full diff see [2.5.1...2.5.2][2.5.1...2.5.2].
Stopped using the deprecated --no-suggest option when updating the lock file ([#422]), by [@localheinz]
For a full diff see [2.5.0...2.5.1][2.5.0...2.5.1].
Composer\Console\Application instead of reusing the current instance ([#420]), by [@localheinz]--no-suggest option when updating the lock file ([#422]), by [@localheinz]For a full diff see [2.4.0...2.5.0][2.4.0...2.5.0].
For a full diff see [2.4.0...2.5.0][2.4.0...2.5.0].
composer.json ([#416]), by [@localheinz]For a full diff see [2.3.2...2.4.0][2.3.2...2.4.0].
For a full diff see [2.3.2...2.4.0][2.3.2...2.4.0].
composer/composer:^2.0.0 ([#412]), by [@localheinz]For a full diff see [2.3.1...2.3.2][2.3.1...2.3.2].
For a full diff see [2.3.1...2.3.2][2.3.1...2.3.2].
For a full diff see [2.3.0...2.3.1][2.3.0...2.3.1].
For a full diff see [2.3.0...2.3.1][2.3.0...2.3.1].
composer/composer ([#379]), by [@localheinz]For a full diff see [2.2.4...2.3.0][2.2.4...2.3.0].
For a full diff see [2.2.4...2.3.0][2.2.4...2.3.0].
schema.json ([#374]), by [@ergebnis-bot]For a full diff see [2.2.3...2.2.4][2.2.3...2.2.4].
For a full diff see [2.2.3...2.2.4][2.2.3...2.2.4].
schema.json ([#364]), by [@localheinz]For a full diff see [2.2.2...2.2.3][2.2.2...2.2.3].
For a full diff see [2.2.2...2.2.3][2.2.2...2.2.3].
schema.json ([#354]), by [@ergebnis-bot]For a full diff see [2.2.1...2.2.2][2.2.1...2.2.2].
For a full diff see [2.2.1...2.2.2][2.2.1...2.2.2].
schema.json ([#322]), by [@localheinz]For a full diff see [2.2.0...2.2.1][2.2.0...2.2.1].
For a full diff see [2.2.0...2.2.1][2.2.0...2.2.1].
ergebnis/composer-json-normalizer ([#316]), by [@localheinz]For a full diff see [2.1.2...2.2.0][2.1.2...2.2.0].
For a full diff see [2.1.2...2.2.0][2.1.2...2.2.0].
--diff option ([#303]), by [@localheinz]For a full diff see [2.1.1...2.1.2][2.1.1...2.1.2].
For a full diff see [2.1.1...2.1.2][2.1.1...2.1.2].
For a full diff see [2.1.0...2.1.1][2.1.0...2.1.1].
For a full diff see [2.1.0...2.1.1][2.1.0...2.1.1].
composer validate to show validation errors when composer.json is not valid according to its schema ([#297]), by [@localheinz]For a full diff see [2.0.2...2.1.0][2.0.2...2.1.0].
For a full diff see [2.0.2...2.1.0][2.0.2...2.1.0].
composer-normalize.phar and composer-normalize.phar.asc to release assets when a tag is pushed ([#292]), by [@localheinz]For a full diff see [2.0.1...2.0.2][2.0.1...2.0.2].
For a full diff see [2.0.1...2.0.2][2.0.1...2.0.2].
For a full diff see [2.0.0...2.0.1][2.0.0...2.0.1]
For a full diff see [2.0.0...2.0.1][2.0.0...2.0.1]
For a full diff see [1.3.1...2.0.0][1.3.1...2.0.0].
For a full diff see [1.3.1...2.0.0][1.3.1...2.0.0].
For a full diff see [1.3.0...1.3.1][1.3.0...1.3.1].
For a full diff see [1.3.0...1.3.1][1.3.0...1.3.1].
localheinz/diff to avoid issues using sebastian/diff ([#207]), by [@localheinz]For a full diff see [1.2.0...1.3.0][1.2.0...1.3.0].
For a full diff see [1.2.0...1.3.0][1.2.0...1.3.0].
For a full diff see [1.1.4...1.2.0][1.1.4...1.2.0].
For a full diff see [1.1.4...1.2.0][1.1.4...1.2.0].
StrictUnifiedDiffOutputBuilder when available to create more condensed diffs when using the --dry-run option ([#80]), by [@localheinz]For a full diff see [1.1.3...1.1.4][1.1.3...1.1.4].
For a full diff see [1.1.3...1.1.4][1.1.3...1.1.4].
composer.json to be writable when using the --dry-run option ([#177]), by [@localheinz]For a full diff see [1.1.2...1.1.3][1.1.2...1.1.3].
For a full diff see [1.1.2...1.1.3][1.1.2...1.1.3].
--dry-run option ([#173]), by [@TravisCarden]Reverted deprecation of the file argument of the NormalizeCommand as it turns out that the same functionality can _not_ be achieved using the --workin…
For a full diff see [1.1.1...1.1.2][1.1.1...1.1.2].
file argument of the NormalizeCommand as it turns out that the same functionality can not be achieved using the --working-dir option ([#166]), by [@localheinz]For a full diff see [1.1.0...1.1.1][1.1.0...1.1.1].
For a full diff see [1.1.0...1.1.1][1.1.0...1.1.1].
localheinz/composer-json-normalizer, which effectively removed a dependency on composer/composer ([#157]), by [@localheinz]Deprecated the file argument of the NormalizeCommand as the same functionality can be achieved using the --working-dir option ([#145]), by [@localhein…
For a full diff see [1.0.0...1.1.0][1.0.0...1.1.0].
file argument of the NormalizeCommand as the same functionality can be achieved using the --working-dir option ([#145]), by [@localheinz]composer.json and composer.lock after normalization to ensure composer.lock is updated when not fresh after normalization ([#139]), by [@localheinz]For a full diff see [0.9.0...1.0.0][0.9.0...1.0.0].
For a full diff see [0.9.0...1.0.0][0.9.0...1.0.0].
localheinz/composer-json-normalizer ([#106]), by [@localheinz]For a full diff see [0.8.0...0.9.0][0.8.0...0.9.0].
For a full diff see [0.8.0...0.9.0][0.8.0...0.9.0].
ConfigHashNormalizer now also sorts the scripts-descriptions section ([#89]), by [@localheinz]composer.lock fails prior to normalization, it is now recommended to update the lock file only ([#86]), by [@svenluijten]For a full diff see [0.7.0...0.8.0][0.7.0...0.8.0].
For a full diff see [0.7.0...0.8.0][0.7.0...0.8.0].
ConfigHashNormalizer now also sorts the extra section ([#60]), by [@localheinz]For a full diff see [0.6.0...0.7.0][0.6.0...0.7.0].
For a full diff see [0.6.0...0.7.0][0.6.0...0.7.0].
localheinz/json-normalizer, which now sniffs the new-line character and uses it for printing instead of using PHP_EOL ([#62]), by [@localheinz]For a full diff see [0.5.0...0.6.0][0.5.0...0.6.0].
For a full diff see [0.5.0...0.6.0][0.5.0...0.6.0].
file argument to the NormalizeCommand, so the path to composer.json can be specified now, ([#51]), by [@localheinz]For a full diff see [0.4.0...0.5.0][0.4.0...0.5.0].
For a full diff see [0.4.0...0.5.0][0.4.0...0.5.0].
localheinz/json-normalizer, which significantly improves the SchemaNormalizer employed to do the major normalization of composer.json ([#42]), by [@localheinz]Nothing published for this version
For a full diff see [0.3.0...0.4.0][0.3.0...0.4.0].
For a full diff see [0.3.0...0.4.0][0.3.0...0.4.0].
--dry-run option, which allows usage in Continuous Integration systems, as it renders a diff and exits with a non-zero exit code ([#38]), by [@localheinz]For a full diff see [0.2.0...0.3.0][0.2.0...0.3.0].
For a full diff see [0.2.0...0.3.0][0.2.0...0.3.0].
For a full diff see [0.1.0...0.2.0][0.1.0...0.2.0].
For a full diff see [0.1.0...0.2.0][0.1.0...0.2.0].
--no-update-lock option, which allows skipping the update of composer.lock after normalization ([#28]), by [@localheinz]VersionConstraintNormalizer, which normalizes version constraints ([#18]), by [@localheinz]--no-scripts option when invoking the UpdateCommand to update composer.lock ([#19]), by [@localheinz]For a full diff see [81bc3a8...0.1.0][81bc3a8...0.1.0].
For a full diff see 81bc3a8...0.1.0.
NormalizeCommand (#1), by @localheinzConfigHashNormalizer, which sorts entries in the config section by key (#2), by @localheinzNormalizePlugin, which provides the NormalizeCommand (#3), by @localheinzPackageHashNormalizer which sorts packages in the conflict, provide, replaces, require, require-dev, and suggest sections using the same algorithm that is used by the sort-packages option of composer itself (#6), by @localheinzBinNormalizer, which sorts entries in the bin section by name (#9), by @localheinzComposerJsonNormalizer, which composes all of the above normalizers along with the SchemaNormalizer, to normalize composer.json according to its underlying JSON schema (#8, #10), by @localheinzYour coding agent can read these notes before it upgrades. Set up the MCP server →