Skip to content

Changelog conventions

This page defines the contract every public NextPDF repository follows when it records a change and publishes a release. It is a convention reference; it does not define package behavior. Per-package, per-version release notes live in each repository’s own CHANGELOG.md. These shared rules keep the cross-repo changelog summary consistent and leak-free.

Every commit subject uses type(scope): description. The type is one of:

TypeMeaningUser-facingVersion effect
featNew capabilityyesminor bump
fixCorrected behavioryespatch bump
perfPerformance improvement with no behavior changeyespatch bump
refactorInternal restructuring with no observable changenonone
docsDocumentation onlynonone
testTests onlynonone
build / ciBuild or pipeline onlynonone
choreMaintenance, dependencies, or toolingnonone
revertRevert of a prior commitdependsdepends

A breaking change uses a ! after the type or scope (feat(api)!: …) or a BREAKING CHANGE: footer. Either marker raises the major version under Semantic Versioning. Record a security-relevant fix so it can appear in the Security column of the cross-repo summary.

Version bumps are mechanical. A release that contains any breaking change is a major. Otherwise, a release that contains any feat is a minor. Otherwise, a release that contains any fix or perf is a patch. Pre-1.0 packages may bump the minor for a breaking change per SemVer §4. The commit still carries the breaking marker so the summary stays accurate.

Each repository’s CHANGELOG.md follows Keep a Changelog 1.1.0: entries are grouped by released version under Added, Changed, Deprecated, Removed, Fixed, and Security. An [Unreleased] section may hold in-progress notes in the repository, but the cross-repo summary counts only tagged, released versions. Unreleased work never appears in the public index.

How the cross-repo summary is derived (and kept leak-free)

Section titled “How the cross-repo summary is derived (and kept leak-free)”

The summary table on the changelog index is produced by reading each repository’s Conventional Commits history at its latest released tag, read-only, and counting categories. The derivation rules are deliberately narrow so internal detail does not escape:

  1. Counts, not content. Only the number of commits per user-facing type is reported. No commit subject, body, footer, or hash is rendered.
  2. User-facing types only. docs, test, ci, chore, and refactor are excluded because they change nothing a package consumer observes.
  3. Released only. A commit counts only after it becomes part of a tagged release of a public package.
  4. No identifiers. Internal issue, ticket, cycle, wave, or work-item references that may appear in a private commit scope are never surfaced, because the scope text itself is never rendered. Only the type is read.
  5. No automation attribution. Contributor-automation trailers are not read or displayed.

For that reason, the public changelog is a category summary with links to each package’s own CHANGELOG.md, not an aggregated commit feed. The summary is free of internal leakage by construction. Authoritative release prose stays with the package that owns it.