big-release automates versioning, changelogs, and publishing for Go, Node, Python, PHP, Rust, Java, Swift, and Godot. A single static binary in CI — no Node.js, no plugins, no config sprawl.
Every badge is a running service whose version was set by big-release on the last merge to main. The version you see is live.
big-release runs in CI after tests pass. It reads your commits, decides the next version, and ships it — no manual tagging, no changelog edits.
Someone merges feat: add /healthz endpoint to main. That prefix is the only versioning input.
feat means a minor bump. It reads the last git tag and calculates the next semantic version automatically.
Pushes the git tag, creates the GitHub Release with notes, bumps VERSION — and your app redeploys.
big-release is a single static binary. No runtime, no dependencies.
curl -sL https://github.com/danielvm-git/big-release/releases/latest/download/big-release-darwin-arm64 -o big-release
chmod +x big-release
sudo mv big-release /usr/local/bin/
curl -sL https://github.com/danielvm-git/big-release/releases/latest/download/big-release-darwin-amd64 -o big-release
chmod +x big-release
sudo mv big-release /usr/local/bin/
curl -sL https://github.com/danielvm-git/big-release/releases/latest/download/big-release-linux-amd64 -o big-release
chmod +x big-release
sudo mv big-release /usr/local/bin/
- name: Install big-release
run: |
curl -sL https://github.com/danielvm-git/big-release/releases/latest/download/big-release-linux-amd64 -o big-release
chmod +x big-release && sudo mv big-release /usr/local/bin/
Pick your language. Copy the files. That's the setup.
main branch
# big-release configuration
tagFormat: "v${version}"
initialVersion: "0.1.0"
plugins:
- changelog
- git
- github
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Install big-release
run: |
curl -sL https://github.com/danielvm-git/big-release/releases/latest/download/big-release-linux-amd64 -o big-release
chmod +x big-release && sudo mv big-release /usr/local/bin/
- name: Release
run: big-release release --verbose
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
module github.com/your-org/your-app
go 1.22
# preview the next release without publishing
big-release --dry-run
Use feat: / fix: prefixes. That's the whole contract.
.big-release.ymlSet tagFormat and pick your plugins. Copy the block above.
Install the binary, run big-release release after your tests.
mainbig-release does the rest — tag, GitHub Release, changelog, deploy.
Missing VERSION file: big-release creates the git tag and GitHub Release automatically. A VERSION file is optional — only needed if your app reads it at runtime.
Protected branch rejection: big-release only pushes tags and creates Releases via the API — it never pushes to the branch. Protected branches work out of the box. If you also use the git plugin to commit changelogs back to the branch, you'll need to accommodate branch protection yourself.
Auth failures: Ensure GITHUB_TOKEN has contents: write permission. For private repos, use a personal access token or a GitHub App token.
main branch
# big-release configuration
tagFormat: "v${version}"
initialVersion: "0.1.0"
plugins:
- changelog
- git
- github
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm test
- name: Install big-release
run: |
curl -sL https://github.com/danielvm-git/big-release/releases/latest/download/big-release-linux-amd64 -o big-release
chmod +x big-release && sudo mv big-release /usr/local/bin/
- name: Release
run: big-release release --verbose
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
{
"name": "your-app",
"version": "0.1.0",
"scripts": {
"start": "node server.js",
"test": "node --test"
}
}
# preview the next release without publishing
big-release --dry-run
Use feat: / fix: prefixes. That's the whole contract.
.big-release.ymlSet tagFormat and pick your plugins. Copy the block above.
Install the binary, run big-release release after npm test.
mainbig-release does the rest — tag, GitHub Release, changelog, version bump.
package.json version out of sync: big-release manages the git tag, not package.json. If you publish to npm, add the npm publisher in .big-release.yml — it updates package.json and runs npm publish automatically.
Protected branch rejection: big-release only pushes tags and creates Releases via the API. Protected branches work out of the box.
Auth failures: Ensure GITHUB_TOKEN has contents: write permission.
main branch
# big-release configuration
tagFormat: "v${version}"
initialVersion: "0.1.0"
plugins:
- changelog
- git
- github
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install uv && uv sync
- run: uv run pytest -q
- name: Install big-release
run: |
curl -sL https://github.com/danielvm-git/big-release/releases/latest/download/big-release-linux-amd64 -o big-release
chmod +x big-release && sudo mv big-release /usr/local/bin/
- name: Release
run: big-release release --verbose
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
[project]
name = "your-app"
version = "0.1.0"
requires-python = ">=3.12"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
# preview the next release without publishing
big-release --dry-run
Use feat: / fix: prefixes. That's the whole contract.
.big-release.ymlSet tagFormat and pick your plugins. Copy the block above.
Install the binary, run big-release release after uv run pytest.
mainbig-release does the rest — tag, GitHub Release, changelog, deploy.
pyproject.toml version out of sync: big-release manages the git tag, not pyproject.toml. If you publish to PyPI, add the pypi publisher in .big-release.yml — it updates the version and runs twine upload automatically.
Protected branch rejection: big-release only pushes tags and creates Releases via the API. Protected branches work out of the box.
Auth failures: Ensure GITHUB_TOKEN has contents: write permission. For PyPI publishing, set PYPI_TOKEN as a repo secret.
main branch
# big-release configuration
tagFormat: "v${version}"
initialVersion: "0.1.0"
plugins:
- changelog
- git
- github
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: shivammathur/setup-php@v2
with:
php-version: "8.3"
- run: composer install --no-interaction
- run: composer test
- name: Install big-release
run: |
curl -sL https://github.com/danielvm-git/big-release/releases/latest/download/big-release-linux-amd64 -o big-release
chmod +x big-release && sudo mv big-release /usr/local/bin/
- name: Release
run: big-release release --verbose
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
{
"name": "your-org/your-app",
"type": "project",
"require": {
"php": ">=8.3"
},
"scripts": {
"test": "phpunit"
}
}
# preview the next release without publishing
big-release --dry-run
Use feat: / fix: prefixes. That's the whole contract.
.big-release.ymlSet tagFormat and pick your plugins. Copy the block above.
Install the binary, run big-release release after composer test.
mainbig-release does the rest — tag, GitHub Release, changelog, deploy.
composer.json version not updated: big-release manages the git tag, not composer.json. If you publish to Packagist, add the packagist publisher in .big-release.yml.
Protected branch rejection: big-release only pushes tags and creates Releases via the API. Protected branches work out of the box.
Auth failures: Ensure GITHUB_TOKEN has contents: write permission.
big-release is a from-scratch Go port of semantic-release's core algorithm, built to fix two things: the Node.js runtime requirement and protected-branch friction.
| big-release | semantic-release | |
|---|---|---|
| Runtime | Single static binary, no runtime | Requires Node.js + npm install |
| Languages | Go, Node, Python, Rust, PHP, Java, Swift, Godot | Node-first (others via community plugins) |
| Protected branches | Works with zero config out of the box | Requires branch-protection accommodation |
| Config | One .big-release.yml | .releaserc + per-plugin npm installs |
| Conventional Commits | ✓ | ✓ |
| Multi-channel / prerelease | ✓ | ✓ |
| GitHub + GitLab Releases | ✓ | ✓ (separate plugins) |
big-release maps Conventional Commit types to semantic-version bumps. That's the entire rule set.
A new feature bumps the middle digit — 0.3.1 → 0.4.0.
A bug fix bumps the last digit — 0.3.1 → 0.3.2.
A breaking change bumps the first digit — 0.3.1 → 1.0.0.
big-release auto-detects your language and publishes to the right registry.
| Language | Publisher | Registry |
|---|---|---|
| JavaScript / TypeScript | npm | npmjs.com |
| JavaScript (pnpm) | pnpm | npm-compatible registries |
| Python | pypi | pypi.org |
| Rust | crates | crates.io |
| Go | goproxy | proxy.golang.org |
| PHP | packagist | packagist.org |
| Java | maven | maven central |
| Swift | swift | swiftpackageindex.com |
| Godot / GDScript | godot | GitHub Releases |