Introduction
What is anodizer and why use it
Anodizer is a Rust-native release automation tool. It reads a declarative config file (.anodizer.yaml) and executes a full release pipeline: build, archive, checksum, changelog, GitHub release, package manager publishing, Docker images, signing, and announcements.
If you've used GoReleaser for Go projects, anodizer is the same idea — built for Rust. Same config structure, same CLI verbs, same template vocabulary.
Why anodizer?
One config, full pipeline. Instead of stitching together shell scripts, GitHub Actions steps, and manual uploads, you define your release in YAML and run anodizer release. Everything happens automatically:
- Build — Cross-compile binaries for every target
- Archive — Package them into tar.gz, zip, tar.xz, or tar.zst archives
- Checksum — Generate SHA-256 (or other) checksums
- Changelog — Generate from conventional commits
- Release — Create a GitHub release with all assets uploaded
- Publish — Push to crates.io, Homebrew, Scoop, and more
- Docker — Build and push multi-arch container images
- Sign — GPG or cosign signatures
- Announce — Notify Discord, Slack, or webhooks
Cargo-native. Anodizer understands Cargo workspaces, target triples, and cross-compilation strategies. It integrates with cargo-zigbuild and cross for seamless cross-platform builds.
Familiar to GoReleaser users. If you're migrating from Go, the config structure and template syntax will feel immediately familiar. Anodizer even accepts GoReleaser's {{ .Field }} template syntax alongside native Tera {{ Field }} syntax.
Quick overview
# .anodizer.yaml
project_name: myapp
crates:
- name: myapp
path: "."
builds:
- binary: myapp
archives:
- name_template: "{{ ProjectName }}-{{ Version }}-{{ Os }}-{{ Arch }}"
release:
github:
owner: myorg
name: myapp
publish:
cargo: {}
homebrew:
repository:
owner: myorg
name: homebrew-tapanodizer release
That's it. Binaries are built, archived, checksummed, released on GitHub, published to crates.io, and a Homebrew formula is pushed to your tap.