v15.25.0
New Builds
Linux ARM64 (aarch64)
Butler now builds natively for Linux ARM64, and those builds are published to broth.
macOS ARM64 (Apple Silicon) + Universal Binary
Butler now builds natively for macOS ARM64. A universal binary (x86_64 + arm64 via lipo) is also produced and code-signed. The ox dependency was updated to support ARM architecture detection.
Note: we may stop generated universal builds in the future, testing it out to see if it's useful to anyone
Breaking Changes
Linux minimum glibc raised from 2.28 to 2.31
Linux binaries are now built on Debian Bullseye, raising the minimum required glibc from 2.28 to 2.31. Users on older Linux distributions (e.g. Debian Buster) may need to upgrade.
Build & CI/CD
New GitHub Actions Build & Release Workflow
We have migrating building and releasing binaries of butler to GitHub actions. The new workflow includes all new job pipelines for signing and notarizing builds. Builds are published to broth directly from GitHub actions.
Windows executables are now signed with Azure Trusted Signing.
CI Modernization
- Go version: Upgraded from Go 1.14/1.23 to Go 1.24.0. All CI workflows now use
go-version-file: 'go.mod'instead of hardcoding versions.
Helper Makefile
New Makefile with build, install, test, and clean targets for local development convenience.
Dependency Updates
Major dependency upgrades across the board. Many itchio dependencies were bumped to modern Go with enhancements and cleanups.
| Dependency | Old | New | Highlights |
|---|---|---|---|
itchio/arkive |
2020 | 2026-01-29 | Proper error handling for password protected zips |
itchio/boar |
2024-12-12 | 2026-01-29 | Support for libc7zip arm on linux and macOS |
itchio/dash |
2020 | 2026-01-28 | |
itchio/go-itchio |
2020-08-26 | 2025-12-29 | Includes new OAuth login API methods |
itchio/headway |
2020 | 2025-12-29 | |
itchio/httpkit |
2020 | 2025-12-31 | |
itchio/hush |
2020 | 2026-01-23 | Updated extensions for naked apps |
itchio/ox |
2020 | 2026-02-04 | Ability to detect arm architecture from host machine |
itchio/savior |
2020 | 2026-01-28 | |
BurntSushi/toml |
0.3.1 | 1.6.0 | |
mitchellh/mapstructure |
1.3.2 | 1.5.0 | |
golang.org/x/crypto |
0.31.0 | 0.47.0 | |
golang.org/x/sync |
0.10.0 | 0.19.0 | |
golang.org/x/sys |
0.28.0 | 0.40.0 | |
golang.org/x/text |
0.21.0 | 0.33.0 | |
golang.org/x/time |
2020 | 0.14.0 | |
klauspost/compress |
1.10.9 | 1.18.3 | |
stretchr/testify |
1.6.1 | 1.11.1 |
Documentation
Migrated from gitbook to honkit for documentation building. Docs deployed from master into GitHub pages.
Expanded Installation Guide
The docs/installing.md was completely rewritten with:
- Platform-specific step-by-step installation instructions (Windows, Linux, macOS)
- Verification steps for each platform
- Clarified broth URLs as permanent (vs expiring itch.io download links)
- New appendix: "Using butler from the itch app" with paths for each platform and how to find the current version
New Troubleshooting Page
Added docs/troubleshooting.md covering common issues: PATH errors, incorrect directory paths, spaces in file paths, invalid target errors, authentication problems, project page requirements, and firewall/antivirus issues.
butlerd
OAuth Login with PKCE Support
New Profile.LoginWithOAuthCode butlerd endpoint that allows the itch.io desktop app to authenticate users via OAuth authorization code exchange with PKCE. This accepts an authorization code, PKCE code verifier, redirect URI, and client ID — and returns the user profile along with a website cookie. The OAuth client ID is no longer hardcoded; it is provided as a parameter by the caller.
Unlike the existing LoginWithPassword and LoginWithAPIKey endpoints, the OAuth result also returns a Cookie map, enabling the desktop app to synchronize website login state after authentication.
butlerd NPM Package Rename
The butlerd npm package has moved to https://www.npmjs.com/package/@itchio/butlerd
The generous support path changed from butlerd/lib/support to @itchio/butlerd/lib/support.
butlerd Spec Updates
- Added
Profile.LoginWithOAuthCoderequest tobutlerd.jsonspec - Added
metadatafield (type{ [key: string]: any }) toCandidatetype in spec