
commitclerk
One command between your staged diff and a commit. It reads the diff, asks an LLM for a Conventional Commits message, shows it to you, and commits once you agree. About 230 lines in a single file, so you can read the whole thing before trusting it with your history.

Public numbers
- GitHub stars
- 1
- Release downloads
- 0
Public numbers from GitHub and PyPI, as of 2026-10-20. The site is rebuilt daily.
Install
pipx install commitclerk
pip install commitclerk
What comes next
From the product's own docs/ROADMAP.md at 276ad36.
Trust & safety
- IdeaThe no-egress claim is documented and never tested
- IdeaA repository whose tests carry credential fixtures must pass --redact on every commit
Configuration & conventions
- IdeaEncoding a team's convention means forking
_RULES - IdeaThe message is English whatever language the team works in
- IdeaAn existing message cannot be checked without generating a new one
- IdeaThe model's type and scope are trusted without being checked
Interaction & UX
- IdeaA wrong message is only fixable after it is already committed
- IdeaEditing the message means rewriting it after the commit
- IdeaA slow or local model shows a frozen terminal for thirty seconds
- IdeaWhat a run costs is invisible
- IdeaAn amended commit is described by its fixup alone
- IdeaAn API failure and a git failure are indistinguishable to a script
- IdeaNothing budgets the reply, so a verbose model fails with "returned no message text"
- DesignedThere is no way to see what was actually sent
- IdeaNothing bounds the size of the whole request
Git-native integration
- IdeaThe tool runs only when the author remembers to run it
- IdeaThe framework the Python world already runs cannot install this tool
Beyond a single commit
- IdeaA mixed working tree becomes one commit nothing can describe
- IdeaChangelog entries are written by hand from commits that already say it
- IdeaA release body needs a different register and there is only the changelog
- IdeaThe version bump is a judgement made without reading the commits
- IdeaA PR title and description are retyped from commits that already exist
Distribution & reach
- IdeaNobody meets the tool where they already work
- IdeaThe curl install advertised in the README is unsigned
- IdeaThe README is the only documentation and it is outgrowing itself
- IdeaEvery team writes its rule pack from nothing
- IdeaA CLI nobody can watch is a CLI nobody tries
Quality engineering
- IdeaThe deterministic half of the pipeline is asserted against nothing
- IdeaA prompt change cannot be shown to be an improvement
- IdeaA quality result cannot be attributed to a prompt
- IdeaEvery end-to-end path needs an API key to test
- IdeaA CLI surface change reaches users without anyone reviewing it
- IdeaNon-ASCII output renders as
?on a cp1252 console - IdeaSix documentation surfaces are updated by hand per shipped flag
- DesignedInstruction examples leak into the output
- IdeaLine endings differ between contributors and the build compares artifact text
- IdeaEvery end-to-end check hand-builds a git repository in a shell script
- Idea
maingains a branch per feature and nothing ever splits it - IdeaEach new module costs a hand-written re-export block and a dozen lint findings
The landing page on the design system
- IdeaThe landing page carries its own inline CSS for the nav, hero, cards and footer, outside the design system
Recently shipped
All 13 entries →- T66 · f36ef9fA file named only in the diff's prose is described as a file this commit changed
A note read after the diff names the files the commit changes and those its prose only mentions; on the observed commit, claims of an unstaged file fell from 3 in 100 to 0.
- T65 · 71fb437A line the diff deletes is described as work that was done
A documentation file whose whole change is deletions is named after the diff, and the rules state that a removed line contributes its removal and never its content.
- T71 · a0c3dd9The page ends without a pointer to any other tool the same author publishes
The page carries one house ad slot above the footer, drawn by japode-ads with storage off, a fixed dark theme and commitclerk kept off its own slot.
- T61 · baa80bfOne switch hides two very different data flows
--no-examplesrefuses past commit message text on its own, so a team can keep the counts-and-shapes fingerprint while--no-house-stylestill refuses both. - T25 · 39fef7cA team convention is retyped as flags on every commit
a
.clerk.jsonat the repository root and a~/.config/clerk/config.jsonare read through one precedence ladder, CLI > env > project > user > default, written in a single function. - T24 · bc09fd5
SECURITY.mddoes not say what leaves the machineThe diff and the replayed commit messages are fenced in sentinels named after their own sha256, and SECURITY.md states the threat, the boundary and what fencing does not do.
- T23 · 5a99346History cannot say which commits were AI-assisted
An opt-in
assisted_bywritesAssisted-by: commitclerk <version> (<model>)after the model has answered, and says(offline, no model)on the path that called none. - T21 · c8f047eA hook that calls an API hard-blocks the commit when the network is down
--offlinewrites the whole message locally with no key, no network and no provider resolved, taking the type from the file classes and never guessing feat: or fix:.