cambi
cambi is a tool that infers semantic version bumps from conventional commits, updates CHANGELOG.md, and manages GitHub releases.
It can:
- compute the next semantic bump (
major/minor/patch), - generate and maintain
CHANGELOG.md, - publish GitHub releases from git tag history.
Project page: https://sw.cowtech.it/cambi
Features
- Conventional commit bump inference (
feat=> minor, breaking => major, default patch) - Config layering (flags > env > config file > defaults)
- Changelog generation with optional custom template
- Changelog rebuild mode from tag history
- Optional changelog auto-commit
- GitHub release create/update/rebuild flows
- Notes-only mode (
release --notes-only) to print generated notes locally - Commit filtering with configurable ignore regexes
Installation
Prebuilt binaries
Download one of the prebuilt binaries for your platform, then make it executable:
Example:
From source (Cargo)
Usage
cambi [OPTIONS] <COMMAND>
Global options:
-c, --config <CONFIG>: optional explicit config file path-p, --tag-pattern <TAG_PATTERN>: override the release tag matcher regex-v, --verbose: enable verbose output-h, --help: print help-V, --version: print version
Commands
version(v): print the current versionsemver(s): compute semantic version informationupdate(u): update project version files from detected or explicit targetchangelog(c): updateCHANGELOG.mdwith the next release sectionrelease(r): publish releases on GitHub from git history derived by tags
version (v)
Print current version from the latest matching tag (or from -f, --from-tag).
Options:
-f, --from-tag <FROM_TAG>: override start tag instead of auto-detecting latest version tag-c, --config <CONFIG>-p, --tag-pattern <TAG_PATTERN>-v, --verbose-h, --help
semver (s)
Compute next bump type from commits since latest matching tag (or from -f, --from-tag).
Options:
-f, --from-tag <FROM_TAG>: override start tag instead of auto-detecting latest version tag-c, --config <CONFIG>-p, --tag-pattern <TAG_PATTERN>-v, --verbose-h, --help
update (u)
Update project version files. By default it infers the bump from commits. You can override detection by passing:
- a bump:
major,minor,patch - an exact semver:
1.2.3orv1.2.3
Options:
-f, --from-tag <FROM_TAG>: override start tag instead of auto-detecting latest version tag-o, --commit: commit updated version file-m, --commit-message <MESSAGE>: custom commit message (requires--commit)-t, --tag: create a git tag for the updated version (requires--commit)-c, --config <CONFIG>-p, --tag-pattern <TAG_PATTERN>-v, --verbose-h, --help
Supported update targets (first match wins):
Cargo.tomlpackage.jsonpyproject.toml*.gemspecmix.exspubspec.yamlPackage.swiftversion/VERSION
changelog (c)
Update CHANGELOG.md with the next pending release section.
Options:
-r, --rebuild: regenerateCHANGELOG.mdfrom the first commit-o, --commit: auto-commit ifCHANGELOG.mdis the only changed file-m, --commit-message <MESSAGE>: custom commit message (requires--commit)-d, --dry-run: preview changes without writing files-c, --config <CONFIG>-p, --tag-pattern <TAG_PATTERN>-v, --verbose-h, --help
release (r)
Create/update GitHub releases from git tags and commits.
Options:
-r, --rebuild: delete/recreate releases from scratch-n, --notes-only: print only the notes that would be used for the release body-t, --token <TOKEN>: override GitHub token-o, --owner <OWNER>: override GitHub owner/organization-u, --repo <REPO>: override GitHub repository-d, --dry-run: preview release actions without API calls-a, --prerelease: mark the GitHub release as a pre-release (requires positional target)-c, --config <CONFIG>-p, --tag-pattern <TAG_PATTERN>-v, --verbose-h, --help
Notes:
- release tags are
v-prefixed (for examplev1.2.3) - release title omits
v(for example1.2.3) -n, --notes-onlyconflicts with--rebuild,--dry-run,--token,--owner,--repo
Configuration
Config files
- Global:
~/.config/cambi.yml - Local (project):
./cambi.yml - Explicit:
--config/-cpath/to/file.yml
Local config overlays global config.
Environment variables
CAMBI_TOKEN(preferred) /GH_RELEASE_TOKENCAMBI_OWNERCAMBI_REPOCAMBI_TAG_PATTERNCAMBI_CHANGELOG_TEMPLATECAMBI_IGNORE_PATTERNS(semicolon-separated regex list)CAMBI_VERBOSE(1,true,yes)
Defaults
- Tag pattern:
^v\d+\.\d+\.\d+$ - Ignore patterns:
- ^.+: fixup$
- ^.+: wip$
- ^fixup: .+$
- ^wip: .+$
- ^fixup$
- ^wip$
- ^Merge .+$
Example cambi.yml
token: ghp_xxx
owner: my-org
repo: my-repo
tag_pattern: '^v\d+\.\d+\.\d+$'
ignore_patterns:
- "^docs: .+$"
- "^chore: .+$"
changelog_template: |
### $DATE / $VERSION
$COMMITS
Template placeholders:
$DATE$VERSION$COMMITS(already bullet-formatted)
Contributing
- Check open issues/PRs first
- Fork and create a feature branch
- Add or update tests for behavior changes
- Open a PR
License
Copyright (C) 2026 and above Shogun (shogun@cowtech.it).
Licensed under the ISC license.