Privacy-first CLI for AI-generated commit messages & release notes.
Turn your git history into clean, Conventional-Commits-friendly narratives β with any OpenAI-compatible model, including fully local ones via Ollama.
Writing good commit messages is a chore. Writing good release notes is a
chore and a meeting. gitquill does both for you, without shipping your
code to a third party if you don't want to.
- π Privacy-first by default β points at a local Ollama model out of the box. Nothing leaves your machine unless you reconfigure it.
- π§© Provider-agnostic β works with OpenAI, Groq, OpenRouter, LM Studio, Together, Mistral, DeepSeek, vLLM, llama.cpp, Jan, or any OpenAI-compatible endpoint.
- π Conventional Commits aware β parses, formats and groups commits by type. Your changelog writes itself.
- π Two commands, that's it β
gitquill commitandgitquill release. - πͺΆ Tiny & dependency-light β no heavy TUI, no telemetry, no account.
# 1. Install from npm:
npm install -g gitquill
# 2. (Optional) pull a local model with Ollama
ollama pull qwen2.5-coder:7b
# 3. Make some changes, stage them, and let gitquill write the message
git add .
gitquill commit --yes # or the short alias: gq commit --yesPrefer a cloud provider?
gitquill config provider openai
gitquill config set provider.apiKey sk-...
gitquill commitGenerate a commit message from staged changes and (optionally) create the commit.
gitquill commit # generate, confirm, commit
gitquill commit --all # stage everything first
gitquill commit -y # commit without prompting
gitquill commit -e # open $EDITOR before committing
gitquill commit --dry-run # just show the message
gitquill commit --language ru # generate in Russian
gitquill commit --no-conventional
gitquill commit --type fix --scope auth # hint type & scope
gitquill commit --max-diff 4000 # cap staged-diff sizeGenerate Markdown release notes from a commit range.
gitquill release # latest tag β HEAD
gitquill release --from v1.0.0 --to HEAD
gitquill release --tag v1.2.0 --out CHANGELOG.md
gitquill release --flat # no grouping by type
gitquill release --no-header # omit the # project headerInspect & edit the persistent config at ~/.gitquill/config.json.
gitquill config show
gitquill config path
gitquill config provider ollama # apply a preset
gitquill config set provider.model llama3.1
gitquill config set commit.language es
gitquill config init # write a repo-local .gitquill.json
gitquill config resetPresets: ollama Β· openai Β· groq Β· openrouter Β· lmstudio
Run gitquill config init to create a .gitquill.json in your repo. Any
field set there wins over your global ~/.gitquill/config.json, so a
team can share a preferred model, language, or diff cap without touching
anyone's global config. Commit it to share with collaborators.
Diagnose your setup β Node version, git binary, repo state, provider connectivity.
gitquill doctorConfig lives at ~/.gitquill/config.json (override with GITQUILL_CONFIG_DIR).
| Variable | Purpose |
|---|---|
GITQUILL_CONFIG_DIR |
Override the config directory. |
OPENAI_API_KEY |
Used by the openai preset if set. |
GROQ_API_KEY |
Used by the groq preset if set. |
OPENROUTER_API_KEY |
Used by the openrouter preset if set. |
EDITOR / VISUAL |
Editor launched by gitquill commit -e. |
# install: https://ollama.com
ollama serve
ollama pull qwen2.5-coder:7b # or llama3.1, mistral, qwen2.5-coder:14b β¦
gitquill config provider ollama
gitquill doctor # should report "Provider reachable"
gitquill commitNo API key, no network egress, no per-token cost.
Contributions are welcome and appreciated! See CONTRIBUTING.md for guidelines, the development workflow, and our commit conventions.
Good first issues are labeled good first issue.
- Unit tests (vitest) β
bun run test - E2E tests against a mock OpenAI server β
bun run test:e2e - Repo-local
.gitquill.jsonoverrides -
--type/--scopecommit hints - npm publish (
npm i -g gitquill) -
gitquill prβ draft PR descriptions - Streaming output for long release notes
- Plug-in prompt templates
- More provider presets (Together, Mistral, DeepSeek, vLLM)
MIT Β© Cryptoteep and contributors. See LICENSE.
Inspired by the wonderful work of Conventional Commits, commitlint, Ollama, and every maintainer who has ever dreaded writing release notes on a Friday afternoon.
{ "version": 1, "provider": { "name": "ollama", "baseUrl": "http://localhost:11434/v1", "apiKey": "ollama", "model": "qwen2.5-coder:7b", "temperature": 0.3, "maxTokens": 512 }, "commit": { "conventional": true, "maxLength": 72, "emitBody": true, "language": "en", "maxDiff": 20000 }, "release": { "groupByType": true, "includeContributors": true, "language": "en", "header": true } }