big-release
Unified release automation

One binary.
Every language.
Zero runtime.

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.

Live proof

Four real apps, versioned and deployed by big-release

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.

Go

go.bigbase.click

Go 1.22+, standard library only

Go version
Node

node.bigbase.click

Node 22, Express

Node version
Python

python.bigbase.click

Python 3.12+, Flask, uv

Python version
PHP

php.bigbase.click

PHP 8.3+, Composer

PHP version
How it works

One merge, three automatic moves

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.

1

A conventional commit lands

Someone merges feat: add /healthz endpoint to main. That prefix is the only versioning input.

2

big-release computes the bump

feat means a minor bump. It reads the last git tag and calculates the next semantic version automatically.

3

It tags, releases & deploys

Pushes the git tag, creates the GitHub Release with notes, bumps VERSION — and your app redeploys.

Install

One command, any platform

big-release is a single static binary. No runtime, no dependencies.

terminal macOS ARM
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/
terminal macOS Intel
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/
terminal Linux
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/
.github/workflows/*.yml GitHub Actions
- 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/
Quickstart

From zero to automated releases

Pick your language. Copy the files. That's the setup.

Set up big-release for Go

Prerequisites: Go 1.22+, git, a GitHub repo with main branch
.big-release.yml release config
# big-release configuration
tagFormat: "v${version}"
initialVersion: "0.1.0"

plugins:
  - changelog
  - git
  - github
.github/workflows/release.yml CI release job
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 }}
go.mod module
module github.com/your-org/your-app

go 1.22
terminal dry run
# preview the next release without publishing
big-release --dry-run
  1. 1

    Commit with a convention

    Use feat: / fix: prefixes. That's the whole contract.

  2. 2

    Drop in .big-release.yml

    Set tagFormat and pick your plugins. Copy the block above.

  3. 3

    Add the release workflow

    Install the binary, run big-release release after your tests.

  4. 4

    Merge to main

    big-release does the rest — tag, GitHub Release, changelog, deploy.

Troubleshooting

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.

Set up big-release for Node.js

Prerequisites: Node 18+, npm/pnpm, git, a GitHub repo with main branch
.big-release.yml release config
# big-release configuration
tagFormat: "v${version}"
initialVersion: "0.1.0"

plugins:
  - changelog
  - git
  - github
.github/workflows/release.yml CI release job
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 }}
package.json scripts
{
  "name": "your-app",
  "version": "0.1.0",
  "scripts": {
    "start": "node server.js",
    "test": "node --test"
  }
}
terminal dry run
# preview the next release without publishing
big-release --dry-run
  1. 1

    Commit with a convention

    Use feat: / fix: prefixes. That's the whole contract.

  2. 2

    Drop in .big-release.yml

    Set tagFormat and pick your plugins. Copy the block above.

  3. 3

    Add the release workflow

    Install the binary, run big-release release after npm test.

  4. 4

    Merge to main

    big-release does the rest — tag, GitHub Release, changelog, version bump.

Troubleshooting

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.

Set up big-release for Python

Prerequisites: Python 3.12+, uv or pip, git, a GitHub repo with main branch
.big-release.yml release config
# big-release configuration
tagFormat: "v${version}"
initialVersion: "0.1.0"

plugins:
  - changelog
  - git
  - github
.github/workflows/release.yml CI release job
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 }}
pyproject.toml project
[project]
name = "your-app"
version = "0.1.0"
requires-python = ">=3.12"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
terminal dry run
# preview the next release without publishing
big-release --dry-run
  1. 1

    Commit with a convention

    Use feat: / fix: prefixes. That's the whole contract.

  2. 2

    Drop in .big-release.yml

    Set tagFormat and pick your plugins. Copy the block above.

  3. 3

    Add the release workflow

    Install the binary, run big-release release after uv run pytest.

  4. 4

    Merge to main

    big-release does the rest — tag, GitHub Release, changelog, deploy.

Troubleshooting

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.

Set up big-release for PHP

Prerequisites: PHP 8.3+, Composer, git, a GitHub repo with main branch
.big-release.yml release config
# big-release configuration
tagFormat: "v${version}"
initialVersion: "0.1.0"

plugins:
  - changelog
  - git
  - github
.github/workflows/release.yml CI release job
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 }}
composer.json package
{
  "name": "your-org/your-app",
  "type": "project",
  "require": {
    "php": ">=8.3"
  },
  "scripts": {
    "test": "phpunit"
  }
}
terminal dry run
# preview the next release without publishing
big-release --dry-run
  1. 1

    Commit with a convention

    Use feat: / fix: prefixes. That's the whole contract.

  2. 2

    Drop in .big-release.yml

    Set tagFormat and pick your plugins. Copy the block above.

  3. 3

    Add the release workflow

    Install the binary, run big-release release after composer test.

  4. 4

    Merge to main

    big-release does the rest — tag, GitHub Release, changelog, deploy.

Troubleshooting

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.

Compare

big-release vs semantic-release

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-releasesemantic-release
RuntimeSingle static binary, no runtimeRequires Node.js + npm install
LanguagesGo, Node, Python, Rust, PHP, Java, Swift, GodotNode-first (others via community plugins)
Protected branchesWorks with zero config out of the boxRequires branch-protection accommodation
ConfigOne .big-release.yml.releaserc + per-plugin npm installs
Conventional Commits
Multi-channel / prerelease
GitHub + GitLab Releases✓ (separate plugins)
Version logic

Every bump is decided by a commit

big-release maps Conventional Commit types to semantic-version bumps. That's the entire rule set.

feat:minor

A new feature bumps the middle digit — 0.3.1 → 0.4.0.

fix:patch

A bug fix bumps the last digit — 0.3.1 → 0.3.2.

BREAKING CHANGE:major

A breaking change bumps the first digit — 0.3.1 → 1.0.0.

Ecosystem

9 languages, one workflow

big-release auto-detects your language and publishes to the right registry.

LanguagePublisherRegistry
JavaScript / TypeScriptnpmnpmjs.com
JavaScript (pnpm)pnpmnpm-compatible registries
Pythonpypipypi.org
Rustcratescrates.io
Gogoproxyproxy.golang.org
PHPpackagistpackagist.org
Javamavenmaven central
Swiftswiftswiftpackageindex.com
Godot / GDScriptgodotGitHub Releases