Extract release notes from markdown changelog
Project description
Hed
Extract release notes from markdown changelog that follow keep a changelog or common changelog format.
Hed, pronounced "head" (/hɛd/),
is journalistic shorthand referring to the "headline" of a news story.
Installation
pip install hed
With uv:
uv tool install hed
How it works
- Extract
--changeloglines between--capture-start(included) and--capture-end(not included). - Normalize the extracted headings so the topmost heading level
conform to
--top-heading, e.g.,## Titlebecomes# Title.
Depending on how it was configured, hed can apply some transformations
to the extracted release notes:
- If
--titleis provided, update the h1. - If
--diff-urlis provided, adds a link to compare between tags at the end. If--previous-tagis also provided, this tag is used to build the comparison link, otherwise,hedwill try to find the closest reachable tag from--tag.
Configuration
Some command-line options can be configured via hed.toml or pyproject.toml,
under the tool.hed namespace.
See https://toml.io/ for how to write TOML.
[tool.hed]
changelog = "CHANGELOG.md"
capture-start = '^## (\[{tag}\]|{tag})'
capture-end = '^## '
diff-url = "https://github.com/owner/repo/compare/{prev}...{tag}"
softbreak = true
title = "{tag}"
top-heading = 1
Usage
Given a CHANGELOG.md file similar to this:
# Changelog
## [1.0.1](https://github.com/owner/repo/releases/tag/1.0.1) - 2026-01-10
### Bug fixes
- Fixed a thing! (#1235)
## [1.0.0](https://github.com/owner/repo/releases/tag/1.0.0) - 2026-01-9
### Breaking changes
- Removed a deprecated feature. (#1234)
Extract and normalize release notes:
$ hed --tag 1.0.1
# [1.0.1](https://github.com/owner/repo/releases/tag/1.0.1) - 2026-01-10
## Bug fixes
- Fixed a thing! (#1235)
Change the title:
$ hed --tag 1.0.1 --title "{tag} Release Notes"
# 1.0.1 Release Notes
## Bug fixes
- Fixed a thing! (#1235)
Add a link to compare between releases:
$ hed --tag 1.0.1 --previous-tag 1.0.0 --diff-url "https://github.com/owner/repo/compare/{prev}...{tag}"
# [1.0.1](https://github.com/owner/repo/releases/tag/1.0.1) - 2026-01-10
## Bug fixes
- Fixed a thing! (#1235)
**Full Changelog:** [1.0.0...1.0.1](https://github.com/owner/repo/compare/1.0.0...1.0.1)
CI Integration
GitLab
Create a GitLab release using the release keyword.
gitlab-release:
stage: deploy
image: registry.gitlab.com/gitlab-org/cli:latest
rules:
- if: $CI_COMMIT_TAG
script:
- apk update && apk add curl
- curl -LsSf https://astral.sh/uv/install.sh | sh
- source $HOME/.local/bin/env
- uvx hed --tag $CI_COMMIT_TAG > RELEASE_NOTES.md
release:
tag_name: '$CI_COMMIT_TAG'
name: '$CI_COMMIT_TAG'
description: 'RELEASE_NOTES.md'
GitHub
Create a GitHub release using softprops/action-gh-release.
jobs:
draft-release:
name: Create Release
runs-on: ubuntu-latest
if: github.ref_type == 'tag'
permissions:
contents: write
steps:
- uses: astral-sh/setup-uv@v7
- run: uvx hed --tag "${{ github.ref_name }}" > RELEASE_NOTES.md
- uses: softprops/action-gh-release@v2
with:
body_path: 'RELEASE_NOTES.md'
Contributing
For guidance on setting up a development environment and contributing, see CONTRIBUTING.md.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hed-1.3.0.tar.gz.
File metadata
- Download URL: hed-1.3.0.tar.gz
- Upload date:
- Size: 49.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e3ae044239bc4a9930f2feb604115f477658cbba517c3b9e773f12619fa317f
|
|
| MD5 |
261b12c33795a6af6869dba19994153f
|
|
| BLAKE2b-256 |
9d1c78efde54c5035319af803c3955c3728a525a37e849ec180f63b547afdf22
|
Provenance
The following attestation bundles were made for hed-1.3.0.tar.gz:
Publisher:
release.yml on tahv/hed
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hed-1.3.0.tar.gz -
Subject digest:
2e3ae044239bc4a9930f2feb604115f477658cbba517c3b9e773f12619fa317f - Sigstore transparency entry: 1279021583
- Sigstore integration time:
-
Permalink:
tahv/hed@31ceb7a708705c3a5691739a8d49be8adce84ea6 -
Branch / Tag:
refs/tags/1.3.0 - Owner: https://github.com/tahv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@31ceb7a708705c3a5691739a8d49be8adce84ea6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file hed-1.3.0-py3-none-any.whl.
File metadata
- Download URL: hed-1.3.0-py3-none-any.whl
- Upload date:
- Size: 10.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf4970ed69c2f929ab55d462bb4656f93298174262d4535946d0651b4c575daa
|
|
| MD5 |
311b34df6ddfb5579c09eaa5df236c3f
|
|
| BLAKE2b-256 |
4e74187d63da35a3846c5d190ad0c0e7bd0efb48fe9da82e9694a8fdfb596661
|
Provenance
The following attestation bundles were made for hed-1.3.0-py3-none-any.whl:
Publisher:
release.yml on tahv/hed
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
hed-1.3.0-py3-none-any.whl -
Subject digest:
bf4970ed69c2f929ab55d462bb4656f93298174262d4535946d0651b4c575daa - Sigstore transparency entry: 1279021585
- Sigstore integration time:
-
Permalink:
tahv/hed@31ceb7a708705c3a5691739a8d49be8adce84ea6 -
Branch / Tag:
refs/tags/1.3.0 - Owner: https://github.com/tahv
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@31ceb7a708705c3a5691739a8d49be8adce84ea6 -
Trigger Event:
push
-
Statement type: