Commit Message Generator

Build properly formatted Conventional Commits messages from a type, scope, description, body, and breaking-change footer. Runs entirely in your browser.

runs locally on your browser. Your data never leaves your device.

Type

Body (optional)

Footer (optional)

6 / 50 recommended chars

Common Use Cases

Write a properly formatted commit message before running 'git commit -F' or pasting into your editor's commit dialog
Standardize commit messages across a team so changelog and semantic-versioning tools like semantic-release can parse them automatically
Document a breaking API change with a clear migration note in the BREAKING CHANGE footer
Draft a Conventional-Commits-style PR title and description before opening a pull request

About Commit Message Generator

Conventional Commits is a lightweight convention for structuring commit messages so they're both human-readable and machine-parseable: a short "type" (feat, fix, docs, and so on), an optional scope, and a one-line description, followed by an optional longer body and footer. Tools like semantic-release, standard-version, and most changelog generators parse exactly this format to automatically figure out whether a change is a patch, minor, or major version bump, which is only reliable if every commit in the repository actually follows the format consistently.

This generator walks through the pieces of a Conventional Commit one at a time: pick a type from the dropdown (each with a one-line explanation of when to use it), optionally add a scope like "api" or "auth" to say which part of the codebase changed, write a description, and optionally add a longer body explaining what changed and why. A "Breaking change" toggle appends the "!" marker after the type/scope and lets you add a BREAKING CHANGE footer describing what breaks and how to migrate; the two together are what tools like semantic-release look for to trigger a major version bump. A free-form footer field covers everything else a commit trailer might carry, like "Closes #123" or "Reviewed-by: ...".

The header line updates live as you type, along with a character count against the widely-used 50-character recommended limit (and 72 as a hard wrap point), conventionally kept short so it reads cleanly in 'git log --oneline' and in most Git hosting UIs, with the "why" pushed down into the body instead of crammed into the subject line.

Everything you type is assembled into the final commit message using plain JavaScript running in your browser tab. Nothing is uploaded to a server, logged, or stored; copy the finished message straight into your 'git commit -m' command, or download it as a .txt file to paste in later.

Frequently Asked Questions

What is Conventional Commits?
It's a specification for writing commit messages in a consistent, structured format: 'type(scope): description', optionally followed by a body and footer(s). It's widely used because tools can parse it automatically to generate changelogs and determine semantic version bumps (patch/minor/major) from commit history alone.
Which commit type should I use?
feat for a new feature, fix for a bug fix, docs for documentation-only changes, style for formatting with no code meaning change, refactor for a code change that's neither a fix nor a feature, perf for a performance improvement, test for adding or correcting tests, build/ci for build system or pipeline changes, chore for anything else, and revert for reverting a previous commit. Each option in the dropdown shows a short description if you're unsure.
How does a breaking change get marked?
Toggling "Breaking change" appends a '!' right after the type/scope in the header (e.g. 'feat(api)!: ...') and, if you fill in a description, adds a 'BREAKING CHANGE: ...' footer. Either the '!' or the footer alone is enough to signal a breaking change to tools like semantic-release, but including both makes the reason clear to a human reader too.
Why does the header have a character limit?
It's a convention, not a hard rule this tool enforces, but keeping the subject line under ~50 characters (with 72 as a common hard wrap point) is standard practice so the header displays cleanly in 'git log --oneline', GitHub's commit list, and most terminal-based Git tools without getting truncated or wrapping awkwardly.
Is my commit message sent anywhere?
No. The message is assembled entirely in your browser using plain JavaScript, so nothing you type is ever uploaded to a server, logged, or stored anywhere outside your current browser tab.
Can I use this for a squash-merge or PR title too?
Yes. Many teams also require PR titles to follow Conventional Commits so a squash-merge produces a well-formatted commit automatically. Just use the generated header line (the first line) as the PR title, and paste the full message into the PR description if you need the body/footer preserved.