Skip to main content

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

  1. Extract --changelog lines between --capture-start (included) and --capture-end (not included).
  2. Normalize the extracted headings so the topmost heading level conform to --top-heading, e.g., ## Title becomes # Title.

Depending on how it was configured, hed can apply some transformations to the extracted release notes:

  • If --title is provided, update the h1.
  • If --diff-url is provided, adds a link to compare between tags at the end. If --previous-tag is also provided, this tag is used to build the comparison link, otherwise, hed will 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

hed-1.3.0.tar.gz (49.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hed-1.3.0-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

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

Hashes for hed-1.3.0.tar.gz
Algorithm Hash digest
SHA256 2e3ae044239bc4a9930f2feb604115f477658cbba517c3b9e773f12619fa317f
MD5 261b12c33795a6af6869dba19994153f
BLAKE2b-256 9d1c78efde54c5035319af803c3955c3728a525a37e849ec180f63b547afdf22

See more details on using hashes here.

Provenance

The following attestation bundles were made for hed-1.3.0.tar.gz:

Publisher: release.yml on tahv/hed

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for hed-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bf4970ed69c2f929ab55d462bb4656f93298174262d4535946d0651b4c575daa
MD5 311b34df6ddfb5579c09eaa5df236c3f
BLAKE2b-256 4e74187d63da35a3846c5d190ad0c0e7bd0efb48fe9da82e9694a8fdfb596661

See more details on using hashes here.

Provenance

The following attestation bundles were made for hed-1.3.0-py3-none-any.whl:

Publisher: release.yml on tahv/hed

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page