PHPackages                             shopsys/changelog-linker - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. shopsys/changelog-linker

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

shopsys/changelog-linker
========================

\[FORK\] Generates beautiful CHANGELOG.md with links to PRs, versions and users grouped in Added/Changed/Fixed/Removed categories.

v6.0.5(6y ago)011.3kMITPHPPHP ^7.1

Since Dec 17Pushed 6y agoCompare

[ Source](https://github.com/shopsys/ChangelogLinker)[ Packagist](https://packagist.org/packages/shopsys/changelog-linker)[ RSS](/packages/shopsys-changelog-linker/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (7)Versions (135)Used By (0)

Changelog Linker
================

[](#changelog-linker)

[![Build Status](https://camo.githubusercontent.com/34692e8611d2a2a519d66799eb132244ff85fdb81afd9ab155dc846311caf164/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f53796d706c6966792f4368616e67656c6f674c696e6b65722f6d61737465722e7376673f7374796c653d666c61742d737175617265)](https://travis-ci.org/Symplify/ChangelogLinker)[![Downloads](https://camo.githubusercontent.com/2520b8a9a90029215fe537b168e2a6dc40e3432b4ac125f0d04a03ac47f31ca5/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f73796d706c6966792f6368616e67656c6f672d6c696e6b65722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/symplify/changelog-linker/stats)

Turn your `CHANGELOG.md` from a machine readable text to a **rich text that makes every programmer happy**.

Install
-------

[](#install)

```
composer require symplify/changelog-linker --dev
```

Usage
-----

[](#usage)

Create `changelog-linker.yml` with configuration:

```
parameters:
    # this is detected from "git origin", but you can change it
    repository_url: 'https://github.com/symplify/symplify'
```

The config is autodiscovered in the root directory or by `--config` option.

A. Dump Merges
--------------

[](#a-dump-merges)

```
vendor/bin/changelog-linker dump-merges
```

### Write or Dry-run?

[](#write-or-dry-run)

The `--dry-run` option prints the result to the output. Without that, I looks for `\` in the `CHANGELOG.md` to replace with the content.

It finds the last #ID in the `CHANGELOG.md`, than looks on Github via API and dumps all the merged PRs since the last #ID in nice format. In case you want to **specify minimal PR id yourself**, use this:

```
vendor/bin/changelog-linker dump-merges --since-id 125
```

But that is a mash-up of everything. Not very nice:

```
## Unreleased

- [#868] [ChangelogLinker] Add ChangeTree to manage merge messages
- [#867] [ChangelogLinker] Change Worker registration from implicit to explicit
- [#865] Improve Code Complexity
- [#864] [MonorepoBuilder] improve coverage
```

What if we'd have *Added*, *Changed*... all the standard categories?

```
vendor/bin/changelog-linker dump-merges --in-categories

```

↓

```
## Unreleased

### Added

- [#828] [ChangelogLinker] Add Unreleased to last tagged version feature
- [#840] [ChangelogLinker] Add LinkifyWorker
```

Nice, now everything is nicely grouped.

*(Do you want to know how we detect the category? [Follow me](https://github.com/Symplify/Symplify/blob/master/packages/ChangelogLinker/src/ChangeTree/Resolver/CategoryResolver.php))*

What about packages - can we have group them as well? Sure:

```
vendor/bin/changelog-linker dump-merges --in-packages

```

↓

```
## Unreleased

### CodingStandard

- [#851] Add _ support to PropertyNameMatchingTypeFixer
- [#860] Add test case for #855, Thanks to @OndraM
```

*(Technical secret: it reacts to *\[Package\]* in PR title.)*

Let's take it one step further!

```
vendor/bin/changelog-linker dump-merges --in-packages --in-categories

```

↓

```
## Unreleased

### CodingStandard

#### Added

- [#851] Add _ support to PropertyNameMatchingTypeFixer
- [#860] Add test case for #855, Thanks to @OndraM
```

Do you prefer categories first? Just switch the order:

```
vendor/bin/changelog-linker dump-merges --in-categories --in-packages

```

↓

```
## Unreleased

### Added

#### EasyCodingStandard

- [#851] Add _ support to PropertyNameMatchingTypeFixer
- [#860] Add test case for #855, Thanks to @OndraM
```

### Github API Overload?

[](#github-api-overload)

In case you cross the API rate limit and get denied, create [new Github Token](https://github.com/settings/tokens) and run it via `GITHUB_TOKEN` ENV variable.

```
GITHUB_TOKEN super-secret-token vendor/bin/changelog-linker dump-merges

```

B. Decorate `CHANGELOG.md`
--------------------------

[](#b-decorate-changelogmd)

```
vendor/bin/changelog-linker link
```

### 1. Link PR and Issues

[](#1-link-pr-and-issues)

```
 ### Added

-- #123 Cool new without detailed description wanting me to see PR, [closes #234]
+- [#123] Cool new without detailed description wanting me to see PR, [closes [#234]]
+
+[#123]: https://github.com/Symplify/Symplify/pull/123
+[#234]: https://github.com/Symplify/Symplify/pull/234
```

### 2. Link Versions to Diffs

[](#2-link-versions-to-diffs)

```
-## v2.0.0 - 2017-12-31
+## [v2.0.0] - 2017-12-31

 - ...

 ## v1.5.0 - 2017-06-30
+
+[v2.0.0]: https://github.com/Symplify/Symplify/compare/v1.5.0...v2.0.0
```

### 3. Can I Thank My Contributors?

[](#3-can-i-thank-my-contributors)

Of course! Give your contributors credit they deserve:

```
 ### [v2.0.0] - 2017-12-31

-- ... thanks @SpacePossum for help
+- ... thanks [@SpacePossum] for help
+
+[@SpacePossum]: https://github.com/SpacePossum
```

You can exclude core maintainers, to give external contributors more credit:

```
# changelog-linker.yml
parameters:
    authors_to_ignore: ['TomasVotruba']
```

### 4. How to Link Specific Words?

[](#4-how-to-link-specific-words)

In Symplify, I need that every `EasyCodingStandard` word leads to `https://github.com/Symplify/EasyCodingStandard/`.

```
# changelog-linker.yml
parameters:
    names_to_urls:
        EasyCodingStandard: 'https://github.com/Symplify/EasyCodingStandard/'
```

```
 ## Unreleased

 ### Added

-#### EasyCodingStandard
+#### [EasyCodingStandard]
+
+[EasyCodingStandard]: https://github.com/Symplify/EasyCodingStandard/
```

### 5. Can I Write Shorter PR Titles?

[](#5-can-i-write-shorter-pr-titles)

[![ECS-Run](docs/alias.png)](docs/alias.png)

Just add alias to config:

```
# changelog-linker.yml
parameters:
    package_aliases:
        CS: 'CodingStandard'
```

...and it will be resolved to `CodingStandard` package.

###  Health Score

37

—

LowBetter than 81% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity24

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity76

Established project with proven stability

 Bus Factor1

Top contributor holds 97.5% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~4 days

Recently: every ~12 days

Total

133

Last Release

2529d ago

Major Versions

v3.2.30 → v4.0.0alpha12018-03-12

v4.8.0 → v5.0.02018-09-15

v5.4.16 → v6.0.02019-05-28

### Community

Maintainers

![](https://www.gravatar.com/avatar/8aee0045853dd983a2a4f291d2e21e7492e2d8c19d84cdb7a76dd16c3eb499f9?d=identicon)[rostislav.vitek@shopsys.com](/maintainers/rostislav.vitek@shopsys.com)

---

Top Contributors

[![TomasVotruba](https://avatars.githubusercontent.com/u/924196?v=4)](https://github.com/TomasVotruba "TomasVotruba (593 commits)")[![carusogabriel](https://avatars.githubusercontent.com/u/16328050?v=4)](https://github.com/carusogabriel "carusogabriel (5 commits)")[![PetrHeinz](https://avatars.githubusercontent.com/u/10008612?v=4)](https://github.com/PetrHeinz "PetrHeinz (2 commits)")[![enumag](https://avatars.githubusercontent.com/u/539462?v=4)](https://github.com/enumag "enumag (2 commits)")[![natepage](https://avatars.githubusercontent.com/u/11576446?v=4)](https://github.com/natepage "natepage (1 commits)")[![jawira](https://avatars.githubusercontent.com/u/496541?v=4)](https://github.com/jawira "jawira (1 commits)")[![solcik](https://avatars.githubusercontent.com/u/1543737?v=4)](https://github.com/solcik "solcik (1 commits)")[![TomasLudvik](https://avatars.githubusercontent.com/u/5638367?v=4)](https://github.com/TomasLudvik "TomasLudvik (1 commits)")[![JanMikes](https://avatars.githubusercontent.com/u/3995003?v=4)](https://github.com/JanMikes "JanMikes (1 commits)")[![vitek-rostislav](https://avatars.githubusercontent.com/u/10401898?v=4)](https://github.com/vitek-rostislav "vitek-rostislav (1 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/shopsys-changelog-linker/health.svg)

```
[![Health](https://phpackages.com/badges/shopsys-changelog-linker/health.svg)](https://phpackages.com/packages/shopsys-changelog-linker)
```

###  Alternatives

[laravel/framework

The Laravel Framework.

34.8k543.8M20.1k](/packages/laravel-framework)[drupal/core

Drupal is an open source content management platform powering millions of websites and applications.

21866.0M1.7k](/packages/drupal-core)[drupal/core-recommended

Locked core dependencies; require this project INSTEAD OF drupal/core.

6942.5M420](/packages/drupal-core-recommended)[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

585.6M576](/packages/shopware-core)[open-dxp/opendxp

Content &amp; Product Management Framework (CMS/PIM)

9421.6k61](/packages/open-dxp-opendxp)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
