cmtr writes your git commit messages for you. It prefers Codex CLI (using your ChatGPT account) and also supports the OpenAI API (gpt-5.2). It uses the staged diff and recent commit history to match the repository's style.
- Install uv (if needed), then run:
uvx cmtr@latest
- Optional: add a shell alias:
alias cmtr="uvx cmtr@latest"
- Authenticate (preferred: Codex):
- Codex CLI (preferred): run
npx @openai/codex@latestand sign in (uses your ChatGPT account) - API key (alternative):
export OPENAI_API_KEY=...
- Codex CLI (preferred): run
- Stage changes and run:
git add -Acmtr
Codex mode is preferred because it uses your ChatGPT account usage (not separate
API billing) and requires no API key. If Codex isn't on your PATH, cmtr will run
it via npx @openai/codex@latest as long as you're signed in. If OPENAI_API_KEY
is not set and you are signed into Codex, cmtr will use Codex automatically.
Or install the git hook:
cmtr --hook- Installs a
prepare-commit-msghook that automatically generates a commit message right before the commit editor opens. If there is already a message or you're in a rebase/fixup/squash flow, it skips. - If the repo sets
core.hooksPathin its local git config, cmtr installs the hook in that directory. If only a globalcore.hooksPathis set, re-run with--globalor set a local override withgit config --local core.hooksPath .git/hooks. - If a
.pre-commit-config.yaml/.ymlis present, cmtr will prompt to install a pre-commitprepare-commit-msghook instead (adds an entry that runsuvx cmtr@latest prepare-commit-msg). You may need to runpre-commit install --hook-type prepare-commit-msgafter accepting.
- Installs a
cmtr- Behaves like
git commit -v, but injects a generated commit message.
- Behaves like
cmtr --dry-run- Print the generated message without committing.
cmtr --print-prompt- Print the prompts used to generate the message.
cmtr --no-edit- Skip opening the editor after generating the message.
cmtr --hook- Install the
prepare-commit-msghook to auto-generate messages on every commit.
- Install the
cmtr --global --hook- Install the hook in the globally configured hooks path.
cmtr --uninstall-hook- Remove the hook.
Extra git commit flags can be passed directly (for example, --no-verify). Avoid -m/-F/-C/-c because cmtr supplies the message.
- Uses staged files (
git diff --cached) for the actual changes. - Finds shared paths and samples recent
git logmessages on those paths to learn the repo's style.
Configuration is loaded in this order (later overrides earlier):
- XDG config file (
~/.config/cmtr/config.tomlor$XDG_CONFIG_HOME/cmtr/config.toml) cmtr.tomlin the repo root (optional repo-specific overrides)- Environment variables
- CLI flags
Manage global config with:
cmtr config pathcmtr config listcmtr config get modelcmtr config set model gpt-5.2cmtr config unset model
Example config file:
model = "gpt-5.2"
max_diff_bytes = 12000
max_patch_lines = 400
max_log_entries = 20
max_log_paths = 4
max_log_body_lines = 6
timeout_seconds = 60
reasoning_effort = "none"
text_verbosity = "low"
prefer_codex = false
base_url = "https://api.openai.com/v1"
organization = "org_..."
Set prefer_codex = true to force Codex CLI (even if OPENAI_API_KEY is set).
Use cmtr auth status to see which mode will be selected and why.
Environment variables:
OPENAI_API_KEYOPENAI_BASE_URLOPENAI_ORGCMTR_MODELCMTR_MAX_DIFF_BYTESCMTR_MAX_PATCH_LINESCMTR_MAX_LOG_ENTRIESCMTR_MAX_LOG_PATHSCMTR_MAX_LOG_BODY_LINESCMTR_TIMEOUT_SECONDSCMTR_REASONING_EFFORTCMTR_TEXT_VERBOSITYCMTR_PREFER_CODEX
Local development:
mise installmise run installmise run run
Type checking:
mise run typecheckuv run ty check
If you are installing manually, run uv sync --group dev first to install the ty tool.
- No staged changes: run
git addbefore cmtr. - Missing API key: set
OPENAI_API_KEYor install/login to Codex CLI. - Unsure which auth mode is active: run
cmtr auth status. - Hook failures: a
# cmtr failed: ...comment is appended to the commit message template.