Conventional Commits
Convention for commit messages: type(scope): description — e.g. feat(auth): add OAuth2 support.
Types: feat, fix, chore, docs, refactor, test, perf, build, ci. A ! after the type or BREAKING CHANGE: in the body signals a breaking change. Tools like semantic-release, release-please and changesets read the history and bump SemVer + generate the changelog automatically.
Not universally loved — critics say the types are often arbitrary and the history becomes noisy. But unbeatable if you want to automate releases or filter git log --grep="^feat".