Almost 200 commits adding Nix, Winget, and much more…

This release took almost 2 months (!), and I hope the wait was worth it!

Without further ado, let’s dive in!


Security improvements

We got a CVE on nFPM and another one on GoReleaser.

It is unlikely that you were affected by this, but it’s worth taking a look just in case.

Both incidents were fixed in this release.

Open pull requests for Homebrew, Krew, Scoop

You can now instead of just pushing to a branch, push and open a pull request. It even works cross-repository!

Here’s an example:

# .goreleaser.yml
brews: # can be brews, krew, scoops, etc...
  - # ...
      owner: john
      name: repo
      branch: "{{.ProjectName}}-{{.Version}}"
        enabled: true
          owner: mike
          name: repo
          branch: main

GoReleaser will also read the .github/ and prepend it to the PR description if it exists!


We added support to generate Nixpkgs. We don’t generate Nixpkgs that compile from source, though.

Instead, we use the already built archives.

This decision was made because this way we can support closed-source software as well as Open Source. The idea here is that you create your own NUR and instruct your users to install from there.


# .goreleaser.yml
  - name: goreleaser-pro
      owner: goreleaser
      name: nur
    description: Deliver Go binaries as fast and easily as possible
    license: unfree
    install: |-
      mkdir -p $out/bin
      cp -vr ./goreleaser $out/bin/goreleaser
      installManPage ./manpages/goreleaser.1.gz
      installShellCompletion ./completions/*      


Now that Winget supports installing zip packages, GoReleaser added support to generate the needed manifests, and you can then PR them to microsoft/winget-pkgs.

winget-installed goreleaser on windows

winget-installed goreleaser on windows


# .goreleaser.yml
  - name: goreleaser-pro
    publisher: goreleaser
    license: Copyright Becker Software LTDA
    copyright: Becker Software LTDA
    short_description: Deliver Go binaries as fast and easily as possible
      owner: goreleaser
      name: winget-pkgs
      branch: "goreleaser-pro-{{.Version}}"
        enabled: true
        draft: true
          owner: microsoft
          name: winget-pkgs
          branch: master

PS: when you open a PR to microsoft/winget-pkgs, you are expected to fill the PR template there… Don’t forget to do it! 😄

Ko improvements

The Ko pipe will now ignore empty tags (e.g. if a template evaluate to an empty string).

Ko also now properly registers its manifests within GoReleaser’s context, so you can sign them with docker_signs.

Deprecations that were permanently removed

Some things that were deprecated for over 6 months were removed in this release:

  • archives.replacements
  • archives.rlcp

There are also other deprecations to be removed soon!

Check the deprecations page to find out more, and run goreleaser check every now and then to see if your configuration file is good!


More fields now accept templates:

  • dockers.skip_push
  • docker_manifests.skip_push
  • scoops.description
  • scoops.homepage
  • snapcrafts.title
  • snapcrafts.icon
  • snapcrafts.assumes
  • snapcrafts.hooks

On the same token, there are a couple of new template functions and fields:

  • {{.IsNightly}} (always false on OSS)
  • {{.Checksums}} can be used in the release body template
  • {{envOrDefault "FOO" "bar" }} returns the value of $FOO if it is set, otherwise returns bar

Standard repository

Historically, you would set brews.tap, krews.index and etc. Internally, they all used the same structure: a repository. “A repository” is also (probably) how most think about these fields.

To make things easier on everyone, now all those fields are named repository instead.

You can check the deprecations page to find more information.

Continue on error

From this version onward, GoReleaser will not hard-stop when Homebrew, Nix, and other pipes fail to publish.

Our understanding is that having a broken, stopped-in-the-middle release, is worse than continuing and reporting all the errors in the end, so you can fix them all in a single pass and do a point-release.

You can still get the previous behavior by passing the --fail-fast flag.


As promised, upx now has more filters: goos, goarch, goarm and goamd64.


The Telegram announcer now supports choosing the message format.

You can also use mdv2escape to escape sequences accordingly to mdv2.


Besides just excluding commits that match some regular expressions, you can now include only the commits that match one of them.


# .goreleaser.yml
      - "^feat.*"
      - "^fix.*"

Bugfixes et al

We also had a bunch of bugfixes and documentation improvements, as always.

Other news

  • GoReleaser now has ~11.8k stars and 340 contributors! Thanks, everyone!
  • We eventually discuss new features in our Discord server.  Join the conversation!
  • nFPM had new releases as well,  check it out.


You can install or upgrade using your favorite package manager, or see the full release notes and download the pre-compiled binaries here and here (for Pro).

Helping out

You can help by contributing features and bug fixes, or by donating. You may also be interested in buying a GoReleaser Pro license.

You can find out more here.

This is a cross-post from GoReleaser’s blog!