Skip to main content

Generate clean, grouped release notes from your git history. Zero dependencies.

Project description

shipnote

Generate clean, grouped release notes straight from your git history — with zero dependencies.

shipnote reads the commits between two refs, understands Conventional Commits, and renders tidy markdown release notes grouped by Features, Bug Fixes, Performance, Breaking Changes, and more. No config file, no extra packages, no network calls.

It is built for the boring-but-constant chore every maintainer knows: writing the changelog at release time.

Why

Most changelog tools pull in a tree of dependencies, want a config file, or lock you into one commit convention. shipnote is a single small package that uses nothing but the Python standard library and the git you already have. Drop it into any project or CI job and get readable notes in one command.

Install

pip install shipnote
# or, for an isolated CLI:
pipx install shipnote

Requires Python 3.8+ and git on your PATH.

Usage

From inside a git repository:

# Notes from the latest tag up to HEAD
shipnote

# A titled section for a specific version, with commit/PR links
shipnote --title v1.2.0 --repo me/myproject

# An explicit range, written to a file
shipnote --from v1.1.0 --to v1.2.0 --output RELEASE_NOTES.md

If the repo has no tags yet, shipnote walks the whole history.

Options

Flag Description
--from REF Start ref, exclusive. Defaults to the latest tag.
--to REF End ref, inclusive. Defaults to HEAD.
-t, --title TEXT Heading for the notes, e.g. the version.
--repo OWNER/NAME Turn commit hashes and (#123) PR refs into links.
--base-url URL Base URL for links (default https://github.com).
-o, --output FILE Write to a file instead of stdout.
-C DIR Run as if started in DIR.

Example output

## v1.2.0

### Breaking Changes
- drop Python 3.7 support (`a1b2c3d`)

### Features
- **api:** add streaming endpoint ([#42](https://github.com/me/proj/pull/42), [`9f8e7d6`](https://github.com/me/proj/commit/9f8e7d6))

### Bug Fixes
- handle an empty commit range gracefully (`c4d5e6f`)

In CI

Use it in a release workflow to draft notes from the just-tagged range:

- name: Draft release notes
  run: |
    pip install shipnote
    shipnote --title "${GITHUB_REF_NAME}" --repo "${GITHUB_REPOSITORY}" -o notes.md

How it groups commits

Conventional types map to sections: feat → Features, fix → Bug Fixes, perf → Performance, docs → Documentation, refactor → Refactoring, test → Tests, build → Build System, ci → CI, style → Styles, chore → Chores, revert → Reverts. Anything that does not match falls under Other, so no commit is ever silently dropped. Commits marked breaking (a ! after the type, or a BREAKING CHANGE footer) are surfaced under Breaking Changes.

Development

pip install -e .
python -m pytest

License

MIT — see LICENSE.

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

shipnote-0.1.0.tar.gz (7.6 kB view details)

Uploaded Source

Built Distribution

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

shipnote-0.1.0-py3-none-any.whl (8.3 kB view details)

Uploaded Python 3

File details

Details for the file shipnote-0.1.0.tar.gz.

File metadata

  • Download URL: shipnote-0.1.0.tar.gz
  • Upload date:
  • Size: 7.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for shipnote-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9e3c5c0535a56caac42f1a65f0e7c2bdbacca71e074d3a28cd067e7e739b8c2d
MD5 538cb35dfeee017d961d422c6a16c663
BLAKE2b-256 daf5e1147c6a1c633ccecd592bbc8e4063c536e82f9818f2d6c9abbec6bcac13

See more details on using hashes here.

File details

Details for the file shipnote-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: shipnote-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 8.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for shipnote-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 31a84b06849f7d31c7dab07f80f01b20d9edd1302f0f4145b72db4a882df6c7f
MD5 ec79e19c9d14490ec664c7305631b5bc
BLAKE2b-256 2a58978d614f57f5171057349b9ed46d65826c2d8bc1cc57bc6f11dae0725141

See more details on using hashes here.

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