Publish
- Selecting publishers Run a tailored subset of publishers with the --publishers allowlist and the unified --skip denylist
- GitHub Releases Create GitHub releases with uploaded assets
- crates.io Publish crates to the Rust package registry
- Homebrew Generate Homebrew formulae and push to tap repositories
- Scoop Generate Scoop manifests for Windows package management
- Chocolatey Publish to the Chocolatey Windows package manager
- Winget Publish to the Windows Package Manager (winget)
- AUR Publish to the Arch User Repository
- Krew Publish kubectl plugins to the Krew index
- Snapshots Build locally without publishing
- Nightlies Automated rolling nightly releases
- Custom Publishers Run arbitrary commands on release artifacts
- MCP registry Publish an MCP server manifest to the Model Context Protocol registry
- SchemaStore Register and refresh your tool's JSON schemas on SchemaStore at release time
- Blob Storage Upload release artifacts to S3, GCS, or Azure Blob Storage
- Nix Publish Nix derivations to a nixpkgs-style repository
- Artifactory Upload artifacts to JFrog Artifactory
- AUR Sources Publish source-based AUR packages that build from source via cargo
- Cloudsmith Upload packages to Cloudsmith repositories
- Docker Hub Sync descriptions to Docker Hub repositories
- Gemfury Push packages to Gemfury (fury.io)
- Homebrew Casks Generate Homebrew cask formulae for macOS applications
- NPM Publish prebuilt binaries through the npm registry
- Upload Upload artifacts to any HTTP server
- Milestones Automatically close milestones after a release
- Before-Publish Hooks Run validators against the staged dist tree immediately before publishers fire
- Artifact validation Offline schema validation of every publisher's rendered artifact before a release
The required: field
Every publisher block accepts a required: field that controls whether a failure
from that publisher fails the overall release.
homebrew_casks:
- repository:
owner: myorg
name: homebrew-tap
required: true # release fails if the Homebrew cask push fails
required: sits on every publisher block the same way — the example above
happens to show the top-level homebrew_casks array, but a per-crate
publish.scoop, publish.cargo, or publish.homebrew_cask block takes it
identically.
Behavior
| Value | Effect |
|---|---|
true | Failure here causes the release to exit non-zero. |
false | Failure is logged but the release continues. |
| omitted (default) | Falls through to the publisher's hardcoded default. |
Per-publisher defaults
| Publisher | Default | Rationale |
|---|---|---|
GitHub Releases (release:) | true | Core delivery artifact; a failed release upload is always a blocker. |
crates.io (cargo) | true | Registry publish is the primary artifact for library crates. |
| All others | false | Secondary distribution channels; partial failures should not block the release. |
Each per-publisher page lists its default in the Classification table and includes a
required: snippet in the config reference.
Other publishers — Homebrew Casks (the canonical Homebrew surface; deprecated Formula is documented separately), Scoop, Chocolatey, Winget, AUR, Krew, MCP registry, SchemaStore, crates.io, NPM, Docker Hub, and others — are documented in their own pages.
Submitter publishers
Chocolatey, winget, and AUR Sources are submitter publishers: they push to an external moderation queue whose outcome is asynchronous. The submit itself succeeds at queue acceptance time — not when the package is approved and live.
Setting required: true on a submitter publisher has no meaningful effect because
the failure mode it guards against (queue rejection) happens days after the release
completes. Anodizer emits a tracing::warn at config-validation time if required: true
is set on one of these publishers. See the per-publisher pages for the exact warning
message.