Conventional Commit Generator
Build a Conventional Commits message from a type, scope, description and body.
- Runs locally in your browser
- No upload required
Try it
Supported formats
Privacy
Runs entirely in your browser. Your input is never uploaded, stored, or sent to a third party.
Header: "fix(api): handle an empty request body".
How it works
- Joined the type, the optional `(scope)` and the `!` breaking marker into the header.
- Added the description after `: `.
- Appended the body and a `BREAKING CHANGE:` footer as separate blank-line-separated paragraphs when present.
- Conventional Commits 1.0.0: the type and description are mandatory; the scope and a `!` are optional; a breaking change is signalled by `!` and/or a `BREAKING CHANGE:` footer.
- The description should be imperative and lower-case, without a trailing period, so generators and changelogs parse it correctly.
Methodology
- Validate the type against the Conventional Commits type set and the description against the no-trailing-period rule.
- Assemble the header as `type(scope)!: description`.
- Join the optional body and the `BREAKING CHANGE:` footer with blank lines.
Usage
- Pick a commit type and optionally enter a scope.
- Enter a short, imperative description.
- Optionally add a body and, for a breaking change, tick the marker and describe it.
- Copy the generated message.
Examples
These are examples, not current values: they use fixed inputs, while the interactive tool computes live results in your browser.
Fix with a scope
{
"type": "fix",
"scope": "api",
"description": "handle an empty request body",
"body": "Return 400 instead of throwing when the body is absent.",
"breaking": false,
"breakingNote": ""
}Feature with a breaking change
{
"type": "feat",
"scope": "",
"description": "drop support for Node 16",
"body": "",
"breaking": true,
"breakingNote": "Node 18 is now the minimum supported version."
}Docs with no scope
{
"type": "docs",
"scope": "",
"description": "document the retry policy",
"body": "",
"breaking": false,
"breakingNote": ""
}Limitations
Why the format matters
Conventional Commits gives each message a machine-readable header: `type(scope): description`. Tools such as semantic-release, changelog generators and commit linters read that header to decide the next version and to group entries.
The `!` and the `BREAKING CHANGE:` footer are the two conventions that signal an incompatible change; use them together so both humans and tools see the break.
Frequently asked questions
- What does the `!` mean?
- It marks a breaking change. Conventional Commits also expects a `BREAKING CHANGE:` footer explaining the break, which this tool adds when you tick the marker.
- Should the description end with a period?
- No. The convention is a short imperative phrase in lower case with no trailing period, so tooling can treat the subject as a list entry.
Sources
- Conventional Commits 1.0.0 — Conventional Commits
- Git: Commit Messages — Git
Send feedback
Tell us if this tool helped, report a problem, or suggest a tool. Only the message you type is sent — never the input you used in the tool.
Was this tool useful?
Prefer to write to us directly? See the contact page.