Skip to content
Git · CLI

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
Latest release
v0.2.1
released 2026-07-28
Release downloads
0
v0.2.1

Public numbers from GitHub and PyPI, as of 2026-10-20. The site is rebuilt daily.

Install

pipx
pipx install commitclerk
pip
pip install commitclerk

What comes next

From the product's own docs/ROADMAP.md at 276ad36.

Block D

Trust & safety

  • IdeaThe no-egress claim is documented and never tested
  • IdeaA repository whose tests carry credential fixtures must pass --redact on every commit
Block E

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
Block F

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
Block G

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
Block H

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
Block I

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
Block J

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
  • Ideamain gains a branch per feature and nothing ever splits it
  • IdeaEach new module costs a hand-written re-export block and a dozen lint findings
Block K

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 →
  1. A 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.

    T66 · f36ef9f
  2. A 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.

    T65 · 71fb437
  3. The 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.

    T71 · a0c3dd9
  4. One switch hides two very different data flows

    --no-examples refuses past commit message text on its own, so a team can keep the counts-and-shapes fingerprint while --no-house-style still refuses both.

    T61 · baa80bf
  5. A team convention is retyped as flags on every commit

    a .clerk.json at the repository root and a ~/.config/clerk/config.json are read through one precedence ladder, CLI > env > project > user > default, written in a single function.

    T25 · 39fef7c
  6. SECURITY.md does not say what leaves the machine

    The 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.

    T24 · bc09fd5
  7. History cannot say which commits were AI-assisted

    An opt-in assisted_by writes Assisted-by: commitclerk <version> (<model>) after the model has answered, and says (offline, no model) on the path that called none.

    T23 · 5a99346
  8. A hook that calls an API hard-blocks the commit when the network is down

    --offline writes 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:.

    T21 · c8f047e