{"id":39525603,"url":"https://github.com/gardenbed/changelog","last_synced_at":"2026-01-18T06:23:25.107Z","repository":{"id":38356164,"uuid":"406408826","full_name":"gardenbed/changelog","owner":"gardenbed","description":"The Simple Changelog Generator","archived":false,"fork":false,"pushed_at":"2025-11-27T20:37:13.000Z","size":256,"stargazers_count":3,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-30T11:48:45.835Z","etag":null,"topics":["changelog","cli","github","go","golang","library"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gardenbed.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-09-14T14:49:36.000Z","updated_at":"2025-11-27T20:36:14.000Z","dependencies_parsed_at":"2023-09-26T21:56:45.411Z","dependency_job_id":"490da91e-a741-4fda-88ae-3f24364a9975","html_url":"https://github.com/gardenbed/changelog","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/gardenbed/changelog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gardenbed%2Fchangelog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gardenbed%2Fchangelog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gardenbed%2Fchangelog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gardenbed%2Fchangelog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gardenbed","download_url":"https://codeload.github.com/gardenbed/changelog/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gardenbed%2Fchangelog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28531995,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["changelog","cli","github","go","golang","library"],"created_at":"2026-01-18T06:23:25.034Z","updated_at":"2026-01-18T06:23:25.087Z","avatar_url":"https://github.com/gardenbed.png","language":"Go","readme":"[![Go Doc][godoc-image]][godoc-url]\n[![CodeQL][codeql-image]][codeql-url]\n[![Build Status][workflow-image]][workflow-url]\n[![Go Report Card][goreport-image]][goreport-url]\n[![Test Coverage][codecov-image]][codecov-url]\n\n# Changelog\n\nChangelog is a simple changelog generator for GitHub repositories.\nIt is heavily inspired by the famous [github-changelog-generator](https://github.com/github-changelog-generator/github-changelog-generator).\nIt aims to be *simpler*, *more intelligent*, and *dependency-free*.\n\n## Why?\n\n[github-changelog-generator](https://github.com/github-changelog-generator/github-changelog-generator) is great, battle-proven, and just works!\nSo, why did I decide to reinvent the wheel?\n\nIt is not quite a reinvention!\nFor a long time, I was using the aforementioned Ruby Gem to generated changelogs for my repositories.\nFor creating releases on GitHub, I had to use another program to call the *github_changelog_generator* and then extract the newly added lines to changelog.\nHere are some of the challenges I faced with this approach:\n\n  - No control over the installed version of the Gem on developer machines\n  - Installing and configuring a full Ruby environment in CI or containerized environments\n  - Breaking changes surfacing from time to time due to dependency to an external program\n\nI wish there was a version of this awesome piece of software in Go\n(See https://github.com/github-changelog-generator/github-changelog-generator/issues/714).\nSo, I could copy a self-sufficient binary into my containers for generating changelogs.\nMoreover, I could import it as a library with version management and make my tooling dependency-free.\n\nThe luxury of a fresh start allows you to:\n\n  - Simplify and improve the user experience\n  - Improve the performance and efficiency\n  - Clean up workarounds that are no longer needed\n  - Lay out a plan for further development in future\n\n## Quick Start\n\n### Install\n\n```\nbrew install gardenbed/brew/changelog\n```\n\nFor other platforms, you can download the binary from the [latest release](https://github.com/gardenbed/changelog/releases/latest).\n\n### Examples\n\n```bash\n# Simply generate a changelog\nchangelog -access-token=$GITHUB_TOKEN\n\n# Assign unreleased changes (changes without a tag) to a future tag that has not been yet created.\nchangelog -access-token=$GITHUB_TOKEN -future-tag v0.1.0\n```\n\n### Help\n\n\u003cdetails\u003e\n  \u003csummary\u003echangelog -help\u003c/summary\u003e\n\n```\n  changelog is a simple command-line tool for generating changelogs based on issues and pull/merge requests.\n  It assumes the remote repository name is origin.\n\n  Supported Remote Repositories:\n\n    • GitHub (github.com)\n\n  Usage: changelog [flags]\n\n  Flags:\n\n    -help                         Show the help text\n    -version                      Print the version number\n\n    -access-token                 The OAuth access token for making API calls\n                                  The default value is read from the CHANGELOG_ACCESS_TOKEN environment variable\n\n    -file                         The output file for the generated changelog (default: CHANGELOG.md)\n    -base                         An optional file for appending the generated changelog to it\n                                  This option can only be used when generating the changelog for the first time\n    -print                        Print the generated changelong to STDOUT (default: false)\n                                  If this option is enabled, all logs will be disabled\n    -verbose                      Show the vervbosity logs (default: false)\n\n    -from-tag                     Changelog will be generated for all changes after this tag (default: last tag on changelog)\n    -to-tag                       Changelog will be generated for all changes before this tag (default: last git tag)\n    -future-tag                   A future tag for all unreleased changes (changes after the last git tag)\n    -exclude-tags                 These tags will be excluded from changelog\n    -exclude-tags-regex           A POSIX-compliant regex for excluding certain tags from changelog\n\n    -issues-selection             Include closed issues in changelog (values: none|all|labeled) (default: all)\n    -issues-include-labels        Include issues with these labels\n    -issues-exclude-labels        Exclude issues with these labels (default: duplicate,invalid,question,wontfix)\n    -issues-grouping              Grouping style for issues (values: simple|milestone|label) (default: label)\n    -issues-summary-labels        Labels for summary group (default: summary,release-summary)\n    -issues-removed-labels        Labels for removed group (default: removed)\n    -issues-breaking-labels       Labels for breaking group (default: breaking,backward-incompatible)\n    -issues-deprecated-labels     Labels for deprecated group (default: deprecated)\n    -issues-feature-labels        Labels for feature group (default: feature)\n    -issues-enhancement-labels    Labels for enhancement group (default: enhancement)\n    -issues-bug-labels            Labels for bug group (default: bug)\n    -issues-security-labels       Labels for security group (default: security)\n\n    -merges-selection             Include merged pull/merge requests in changelog (values: none|all|labeled) (default: all)\n    -merges-branch                Include pull/merge requests merged into this branch (default: default remote branch)\n    -merges-include-labels        Include merges with these labels\n    -merges-exclude-labels        Exclude merges with these labels\n    -merges-grouping              Grouping style for pull/merge requests (values: simple|milestone|label) (default: simple)\n    -merges-summary-labels        Labels for summary group\n    -merges-removed-labels        Labels for removed group\n    -merges-breaking-labels       Labels for breaking group\n    -merges-deprecated-labels     Labels for deprecated group\n    -merges-feature-labels        Labels for feature group\n    -merges-enhancement-labels    Labels for enhancement group\n    -merges-bug-labels            Labels for bug group\n    -merges-security-labels       Labels for security group\n\n    -release-url                  An external release URL with the '{tag}' placeholder for the release tag\n\n  Examples:\n\n    changelog\n    changelog -access-token=\u003cyour-access-token\u003e\n```\n\u003c/details\u003e\n\n### Spec File\n\nYou can check in a file in your repository for configuring how changelogs are generated.\n\n\u003cdetails\u003e\n  \u003csummary\u003echangelog.yaml\u003c/summary\u003e\n\n```yaml\ngeneral:\n  file: CHANGELOG.md\n  base: HISTORY.md\n  print: true\n  verbose: false\n\ntags:\n  exclude: [ prerelease, candidate ]\n  exclude-regex: (.*)-(alpha|beta)\n\nissues:\n  selection: labeled\n  include-labels: [ breaking, bug, defect, deprecated, enhancement, feature, highlight, improvement, incompatible, privacy, removed, security, summary ]\n  exclude-labels: [ documentation, duplicate, invalid, question, wontfix ]\n  grouping: milestone\n  summary-labels: [ summary, highlight ]\n  removed-labels: [ removed ]\n  breaking-labels: [ breaking, incompatible ]\n  deprecated-labels: [ deprecated ]\n  feature-labels: [ feature ]\n  enhancement-labels: [ enhancement, improvement ]\n  bug-labels: [ bug, defect ]\n  security-labels: [ security, privacy ]\n\nmerges:\n  selection: labeled\n  branch: production\n  include-labels: [ breaking, bug, defect, deprecated, enhancement, feature, highlight, improvement, incompatible, privacy, removed, security, summary ]\n  exclude-labels: [ documentation, duplicate, invalid, question, wontfix ]\n  grouping: label\n  summary-labels: [ summary, highlight ]\n  removed-labels: [ removed ]\n  breaking-labels: [ breaking, incompatible ]\n  deprecated-labels: [ deprecated ]\n  feature-labels: [ feature ]\n  enhancement-labels: [ enhancement, improvement ]\n  bug-labels: [ bug, defect ]\n  security-labels: [ security, privacy ]\n\ncontent:\n  release-url: https://storage.artifactory.com/project/releases/{tag}\n```\n\u003c/details\u003e\n\n## Features\n\n  - Single, dependency-free, and cross-platform binary\n  - Generating changelog for issues and pull/merge requests\n  - Creating changelog for unreleased changes (future or draft releases)\n  - Filtering tags by name or regex\n  - Filtering issues and pull/merge requests by labels\n  - Grouping issues and pull/merge requests by labels\n  - Grouping issues and pull/merge requests by milestone\n\n## Expected Behavior\n\nWhen you run the _changelog_ inside a Git directory, the following steps happen:\n\n  1. Your remote repository is determined by the remote name `origin` (SSH and HTTPS URLs are supported).\n  1. The existing changelog file (if any) will be compared against the list of Git tags and the list of tags without changelog will be resolved.\n  1. The list of candidate tags will be further refined if the `exclude-tags` or/and `exclude-tags-regex` options are specified.\n  1. A chain of API calls will be made to the remote platform (i.e. GitHub) and a list of **closed issues** and **merged pull/merge requests** will be retrieved.\n  1. The list of issues will be filtered according to issues `selection`, `include-labels`, and `exclude-labels` options.\n  1. The list of pull/merge requests will be filtered according to merges `selection`, `branch`, `include-labels`, and `exclude-labels` options.\n  1. The list of issues will be grouped using the issues `grouping` option.\n  1. The list of pull/merge requests will be grouped using the merges `grouping` option.\n  1. Finally, the actual changelog will be generated and written to the changelog file.\n\n## TODO\n\nMy goal with this changelog generator is to keep it simple and relevant.\nIt is only supposed to do one job and it should just work out-of-the-box.\n\n  - Remote repository support:\n    - [x] GitHub\n    - [ ] GitLab\n  - Changelog format:\n    - [x] Markdown\n    - [ ] HTML\n  - Enhancements:\n    - [ ] Switching to GitHub API v4 (GraphQL)\n\n\n[godoc-url]: https://pkg.go.dev/github.com/gardenbed/changelog\n[godoc-image]: https://pkg.go.dev/badge/github.com/gardenbed/changelog\n[codeql-url]: https://github.com/gardenbed/changelog/actions/workflows/github-code-scanning/codeql\n[codeql-image]: https://github.com/gardenbed/changelog/workflows/CodeQL/badge.svg\n[workflow-url]: https://github.com/gardenbed/changelog/actions\n[workflow-image]: https://github.com/gardenbed/changelog/workflows/Go/badge.svg\n[goreport-url]: https://goreportcard.com/report/github.com/gardenbed/changelog\n[goreport-image]: https://goreportcard.com/badge/github.com/gardenbed/changelog\n[codecov-url]: https://codecov.io/gh/gardenbed/changelog\n[codecov-image]: https://codecov.io/gh/gardenbed/changelog/branch/main/graph/badge.svg\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgardenbed%2Fchangelog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgardenbed%2Fchangelog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgardenbed%2Fchangelog/lists"}