DataToolsLab
Git & Dev Utility Tools

Commit Message Linter

Check a commit message against the Conventional Commits spec and see exactly what to fix.

Loading tool…

What is Commit Linter?

A Conventional Commits linter. It splits the message into header, body and footers, then reports every violation with a severity and a score, so you can see at a glance whether a commit will survive release automation and code review.

How it works

The header is matched against `type(scope)!: description` and the type is checked against the list you configure. The description is tested for capitalisation, past tense, a trailing period and length; the body is checked for the blank separator line and long lines; footers are parsed for BREAKING CHANGE and reference tokens. Errors cost 25 points and warnings 8, which turns a long list into a single number for a CI gate.

  1. Paste or fill in the input. Drop in a commit message, a diff, a package.json, a path list or a set of options. The tool reads it locally — nothing is uploaded and no repository is contacted.
  2. Adjust the rules to match your project. Every linter here takes its convention from a setting you can change: allowed commit types, header length, target branch length, known branch names. Set them once to what your team actually uses.
  3. Copy the result. Generated files copy straight to the clipboard or download as a real file with the right name (.gitignore, CODEOWNERS, LICENSE, COMMIT_EDITMSG), and Reset returns every field to its default.

Examples

A commit message that fails CI

"Updated(auth): Fixed the expired-token redirect." is rejected by release automation and reported here with the exact reasons: unknown type, capitalised description, past tense and a trailing period.

A .gitignore that only half works

The Checker shows which rule decides a path — and why `!keep.txt` inside an ignored directory never fires, the mistake that sends people to Stack Overflow.

A dependency bump nobody reviewed

The package.json Diff separates added, removed and changed entries per section, so a caret bump of a runtime dependency does not hide inside a lockfile-sized pull request.

A diff pasted from a code review comment

The Diff Viewer understands several `diff --git` blocks, mode-only changes, renames and binary stubs, and calls out a pasted `--stat` summary instead of rendering an empty box.

Common mistakes

Committing a .gitignore without checking it

Rules look right and behave differently: a pattern containing a slash is anchored to the root, a trailing slash means directories only, and a file inside an ignored directory cannot be re-included. Check the paths that matter before you commit the file.

Rewriting published history

A clean commit history is worth having, but amend, rebase and filter-repo change commit hashes. Only rewrite commits that nobody has pulled; after a rewrite, push with --force-with-lease rather than --force.

Treating a generated file as if it were reviewed

These tools produce a starting point, not a decision. Check the licence text against the canonical source, read the security policy before publishing it, and make sure a CODEOWNERS team actually exists — GitHub silently ignores rules whose owner has no write access.

Putting slow checks in a pre-commit hook

A hook that takes 30 seconds gets bypassed with --no-verify within a week, and then it protects nothing. Keep pre-commit to formatting and linting, move type checks and tests to pre-push or CI.

Frequently asked questions

Why does the description have to be lowercase and imperative?

Because it is read as the sentence "this commit will …". "add cursor pagination" completes it; "Added cursor pagination." does not, and it is also what turns a generated changelog into a list of past-tense noise.

Is `!` or a BREAKING CHANGE footer the right way to mark a breaking change?

Use both. The `!` is visible in a log line and the footer carries the explanation that release tooling copies into the changelog — the linter warns when the marker has no explanation to go with it.

Can I enforce this in CI?

Yes: the commit-msg hook generator writes the same pattern as a hook, and the same rules can run in CI over the commit range of a pull request (for example with commitlint) so a rewritten message is caught before merge.

Online