Toolvore

AI Commit Message Writer

Generate a clean commit message from a git diff.

This tool sends the text you enter to an AI provider to generate a response. Don't paste secrets or personal data. No files are uploaded.

Summarise a diff or a description of what you changed into a commit message that follows the conventional-commits format.

How to use it

  1. 1Put the output of git diff into the box, or, for a sprawling change, a few lines describing it instead.
  2. 2Press Write Commit Message; the result arrives in a code block with nothing wrapped around it, ready to paste.
  3. 3Copy it, then edit in the reasoning — a diff shows what moved, never why you moved it.

Example

Input
A diff adding a null check before reading user.email in the signup handler
Output
A single fix: line naming the handler and the guard, on the pattern of fix(signup): guard against missing email on user object — with no body, since a one-line change does not warrant one.

The output budget is deliberately small, so a long diff comes back as a summary rather than a change log. The prefix is inferred from the diff's shape: a refactor that happens to fix a bug can be labelled refactor:, and a rename touching forty files can read as feat:, so check the type before you commit.

What happens to your data

A diff is not a small thing to hand over — it carries the unchanged context lines around every hunk, each file path it touched, and whatever happened to sit beside your edit — and all of it is posted to our /api/ai route and on to Anthropic's Claude API, which is what writes the message. Check what you are pasting for .env changes, tokens and internal URLs first. There is a hard ceiling of 40,000 characters across the request: go over it and the route replies 'Input is too long (max 40,000 characters).' before anything reaches the model, which on a big change means narrowing the diff to one path rather than trimming it at random.

Last updated August 2026

The change is staged, the editor has opened on an empty commit template, and you have been looking at it for two minutes. Knowing what you did is not the problem — compressing forty minutes of work into one line, in a format the team agreed on last spring, is a separate skill from doing the work.

Decide what you are going to paste before you paste it, because the two options are not interchangeable. A diff is complete and precise — exactly which lines moved in which files — so a message written from it will be accurate about the mechanics and blank about the purpose. A description in your own words is the opposite trade: it carries the intent, which no diff contains, but there is nothing to check it against, so a vague account produces a confident message about a change nobody has seen. Paste the diff when the work is small and self-explanatory, and write prose when it is large, or when the point of it is nowhere in the code.

One practical thing before you copy anything: git diff on its own shows unstaged work, so once you have run git add it prints nothing at all. The staged version is git diff --staged, or --cached, the same flag under an older name.

The format has a limit worth knowing too. Conventional Commits encodes a category and an optional scope and says nothing about motivation, so the reasoning stays yours to add afterwards. And if a commit does five unrelated things, no message can rescue it — that is a sign to split the commit rather than to write a longer subject line.

How it works

Toolvore wraps whatever is in the single box in one line of instruction and posts it to the site's AI route, where a system prompt the browser never sees asks for Conventional Commits style, a subject of seventy-two characters or fewer, and a body only where one is warranted. The answer streams back a few words at a time and is rendered as Markdown, with a Copy button appearing once it settles and a Stop button that abandons a run you can already see is going wrong. Each press sends only what is in the box — there is no memory of the diff you pasted a minute ago, so a follow-up along the lines of shorter, no body has nothing to attach itself to; edit the input and run it again. The weakness is everything outside the box: it cannot see your branch name, your issue tracker or the last fifty commits in the repository, so it cannot match a house style or cite a ticket number unless you paste those in yourself.

Common use cases

  • Naming a refactor that touched thirty files and has no obvious headline
  • Drafting a subject line for a repository whose CI rejects anything outside Conventional Commits
  • Writing in English when the review happens in English and it is not your first language
  • Turning a day of small fixes into one message before opening a pull request
  • Producing a message for a change whose diff is mostly generated files and lock-file noise
  • Getting past an empty commit template when you already know exactly what you did

Frequently asked questions

What is the Conventional Commits format?

It is a convention for the first line of a commit: a type, an optional scope in brackets, a colon and a space, then a short description — fix(auth): reject tokens with no expiry claim. The usual types are feat and fix, which map onto minor and patch releases, alongside docs, refactor, perf, test, build, ci and chore. A blank line then an optional body carries the reasoning, and footers at the end hold references. The point is not tidiness for its own sake: tooling can read the type and work out what has changed since the last release without a person reading every message.

Why does git diff show nothing when I have changes to commit?

Because git diff compares your working tree against the staging area, and once you have run git add there is nothing between them left to show. The staged change — the one you are about to commit, and the one worth summarising — is git diff --staged, or --cached under its older name. For everything at once, staged and unstaged together, use git diff HEAD. When the change spans a branch rather than a single commit, git diff main...HEAD gives you the whole of it, which is usually far more than you want to paste anywhere.

How long should a commit message be?

The usual guidance is around fifty characters for the subject and a hard wrap at seventy-two in the body, and both numbers come from tooling rather than taste — git indents messages in some outputs, and eighty-column terminals were the assumption when the convention formed. Fifty is less a rule than a pressure: a subject that will not fit is usually describing more than one change. Write it in the imperative, completing the sentence if applied, this commit will — which is why the convention is add validation rather than added validation, and why a message that drifts into the past tense reads wrong in a log.

Should a commit message say what changed or why?

Why, almost always. The what is already in the repository and always will be: anyone can run git show and read the exact lines. The why lives in your head, and in a fortnight it will not live anywhere. The message that earns its keep answers the question somebody asks eighteen months later while running git blame on a line that looks pointless — what went wrong that made this necessary. Name the bug report, the incident, the limit you hit, the approach you tried first and abandoned. A summary of the mechanics is no substitute, because the reasoning was never in the input.

Is it safe to paste a git diff into an AI tool?

Treat it as sending the code somewhere, because that is what it is: the text in the box is posted to this site's AI route and on to the model that writes the message. What happens on the page itself is the reassuring part and the smaller part — there is no account and no saved history, the result lives in the tab until you close it, and starting a new run clears the previous one before the first word arrives. The sending is the bit to think about. If a credential is in your diff at all then it is already in your repository, so the answer is to rotate it rather than to trim the paste. Where the code genuinely cannot leave the machine, describe the change in prose instead — the same box takes either.

What does BREAKING CHANGE mean in a commit message?

It is the part of the convention that drives version numbers. A commit that breaks what other people depend on takes either an exclamation mark after the type — feat(api)!: drop v1 endpoints — or a footer beginning BREAKING CHANGE: followed by what broke and what to do instead. Release tooling reads that marker and raises the major version; without it, a change that breaks every consumer ships as a minor release and nobody is warned. The marker describes the effect on people using your code, not the size of the diff: a one-character change to a default value can be breaking.

My commit is rejected with an error about the message format — what is checking it?

A hook, almost certainly commitlint running from commit-msg via husky or lefthook. It parses your subject against a ruleset — usually config-conventional — and refuses the commit when the type is not on the allowed list, the header is over its length limit, or the description begins with a capital or ends with a full stop. The error names the rule that failed, which is the quickest way to see what it wants. Nothing is lost when it fires: git keeps your text in .git/COMMIT_EDITMSG, so you can reopen that rather than retyping. A rule that is genuinely wrong for your project lives in commitlint.config.js and is meant to be changed.

How do I fix a commit message after I have already committed?

For the most recent commit, git commit --amend rewrites the message. Further back, git rebase -i HEAD~5 and mark the commit as reword, which stops and opens an editor for that message alone. Both produce new commits with new hashes, and that is the whole difficulty — once a commit has been pushed and pulled by somebody else, rewriting it hands them a divergent history to reconcile. On a branch only you are using, push again with --force-with-lease, which refuses if the remote has moved since you last looked. On a shared branch, leave the wording wrong and be more careful with the next one.