Conventional Commit Linter
Paste a commit message, see if it passes the spec.
- $15 Free
- 20 sec
- No signup
Paste your commit message
See what passes and what fails
Copy the corrected message
You get: A pass/fail verdict plus a corrected, spec-compliant message.
Your commit message
3/8 rules pass
Suggested fix
chore: add new login page
Rule check
FAIL - Header follows type(scope): subject
Header must be type: subject, optionally with a (scope) and a ! for breaking changes.
FAIL - Type is present
No type found before the colon.
FAIL - Type is a valid Conventional Commits type
Use one of: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert.
FAIL - Colon and space after the type/scope
The spec requires a colon after the type (and optional scope), followed by a space before the subject.
FAIL - Subject is not empty
Add a short description after the colon.
PASS - Header is 72 characters or fewer
Header is 21 characters. Keep the first line at or under 72 so it renders cleanly everywhere.
PASS - Subject does not end with a period
No trailing period - good.
PASS - Blank line before the body (if any)
Body is separated correctly (or there is no body).
What Conventional Commits actually requires
Conventional Commits is a lightweight convention for commit messages that makes history machine-readable. The core rule is simple: every commit header is type(scope): subject, where the scope is optional. From that one pattern, tools can auto-generate changelogs, decide semantic version bumps, and group changes by area. This linter parses your message in your browser, checks it against the spec rule by rule, and hands you a corrected version you can copy straight back into git.
Nothing you paste leaves your machine. The parsing and validation are pure client-side JavaScript, so it works offline and never logs your commits.
The valid types
- feat - a new feature (triggers a minor version bump under SemVer).
- fix - a bug fix (triggers a patch version bump).
- docs - documentation-only changes.
- style - formatting, whitespace, semicolons; no code-behavior change.
- refactor - a code change that neither fixes a bug nor adds a feature.
- perf - a change that improves performance.
- test - adding or correcting tests.
- build, ci, chore, revert - build system, CI config, maintenance, and reverts respectively.
Breaking changes
Signal a breaking change with a ! after the type or scope (feat!: or feat(api)!:), or with a BREAKING CHANGE: footer in the body. Either one tells release tooling to bump the major version.
The rules this linter enforces
- A type is present before the colon, and it is one of the recognized types.
- The header matches type(scope): subject, with a colon and a space before the subject.
- The subject is not empty and does not end with a period.
- The header line is 72 characters or fewer so it renders cleanly in git log, GitHub, and email.
- If there is a body, a blank line separates it from the header.
Why the imperative mood
The widely-followed convention is to write subjects in the imperative mood: 'add login page', not 'added login page' or 'adds login page'. The reasoning is that a commit message completes the sentence 'If applied, this commit will...'. 'If applied, this commit will add login page' reads correctly; 'will added login page' does not. The linter flags past-tense starters as a style note and rewrites them in the suggested fix. This is a strong convention rather than a hard spec requirement, so it appears as a warning, not a failure.
Why teams bother with this
Consistent commit messages are not busywork - they unlock automation. Tools like semantic-release read your types and decide whether the next version is a patch, minor, or major bump, with zero human judgment. Changelog generators group feat and fix commits into readable release notes automatically. Even without automation, a history where every line starts with a clear type is dramatically faster to scan when you are hunting for when a bug was introduced.
Getting Claude Code to write compliant commits
Claude Code writes commit messages for you, and it follows Conventional Commits well when you ask it to. Put a line in your CLAUDE.md like 'always write commit messages in Conventional Commits format (type(scope): subject), imperative mood, 72-char header'. Then let it draft the message and paste the result here to double-check before you commit. Over time you will barely need the linter - but it is the fast way to verify a message and to teach yourself the pattern until it is automatic.
Frequently asked questions
What is the basic format?
type(scope): subject, where scope is optional. For example feat(auth): add login page or fix: correct null check. Add a ! before the colon to mark a breaking change.
Which types are allowed?
The common set is feat, fix, docs, style, refactor, perf, test, build, ci, chore, and revert. feat and fix are the ones that drive semantic version bumps.
Why should the subject be imperative?
Because a commit completes the sentence 'If applied, this commit will ...'. 'add login' fits; 'added login' does not. It is a strong convention, so this tool flags past tense as a warning and rewrites it.
How long can the header be?
Keep the first line to 72 characters or fewer. Git tools, GitHub, and email clients truncate or wrap longer headers, which hurts readability.
How do I mark a breaking change?
Put a ! after the type or scope (feat!: or feat(api)!:), or add a BREAKING CHANGE: footer in the commit body. Both signal a major version bump to release tooling.
Is my commit message sent anywhere?
No. All parsing and validation happen in your browser with no network calls, so you can lint messages offline and privately.
Liked this tool? The club is the next step.
Join Claude Code Club for $9/month. 650+ lessons, weekly updates, and the workflows behind every tool on this site.
- No experience needed
- Cancel anytime
- Updated weekly
