Skip to main content

Configuration Reference

Complete configuration file reference

Anodizer uses .anodizer.yaml (or .anodizer.toml) in your project root.

Top-Level Fields

FieldTypeDefaultDescription
afterHooksConfigHooks run after the release pipeline completes SUCCESSFULLY.

A failed run never reaches them — route failure handling through on_error:, and teardown that must happen either way through always:.

Use --skip=after to bypass — one token covers this block and every crates[].after: block.

after:
hooks:
- cmd: ./notify-release-succeeded.sh
alwaysHooksConfigHooks run LAST on every terminal path — the release's finally.

Ordering: on success they run after after:; on failure they run after on_error:. They also fire on the one exit neither of those reaches — a before: hook that failed before the pipeline started. Use them for teardown that has to happen either way: removing a staging directory, releasing a lock, stopping a sidecar container.

They fire once per anodizer release / anodizer build invocation, pairing 1:1 with before: — including on each --split shard and on --merge, which are separate invocations that each run before: of their own.

Use --skip=always to bypass. Skipping the finally lane is supported on purpose — --skip=before already suppresses the lane it pairs with — but the consequence is that teardown does not run, so anything the run staged stays staged.

The run's outcome is exposed as template vars ({{ .Success }}, {{ .Error }}) and as ANODIZER_* env vars (ANODIZER_SUCCESS, ANODIZER_ERROR, ANODIZER_VERSION, ANODIZER_TAG), so a hook can branch on the outcome and read the error text without interpolating untrusted text into the shell command. ANODIZER_ERROR is empty on success.

A failing always: hook never masks a release failure: on the failure path it is logged as a warning and the original pipeline error is still what the run exits with. On the success path there is no error to mask, so the hook's own failure fails the run — the same contract after: has.

always:
hooks:
- cmd: ./teardown-staging.sh
announceAnnounceConfigAnnouncement configuration (Slack, Discord, email, etc.).
appimageslist of AppImageConfig[]AppImage configurations. Each entry bundles a built Linux binary plus its desktop integration into a single self-contained .AppImage via linuxdeploy.
artifactorieslist of ArtifactoryConfigArtifactory upload configurations.
attestationsAttestationConfigSLSA build-provenance / attestation configuration for binaries and archives. In the default subjects mode, anodizer writes a subjects manifest for actions/attest-build-provenance; in emit mode it generates and signs a self-contained in-toto SLSA provenance statement. When omitted (or enabled: false), the attestation stage is a no-op.
aur_sourceslist of AurSourceConfigAUR source package publishing configurations (source-only PKGBUILD, not -bin).
beforeHooksConfigHooks run before the release pipeline starts.

Use --skip=before to bypass — one token covers this block and every crates[].before: block.
before_publishHooksConfigHooks run after build/archive/sign/sbom/checksum complete but immediately before the publish phase dispatches any publisher.

Use cases: smoke-test artifacts against the staged dist tree, run external validators (antivirus, vulnerability scanners), stage external state, or abort the release before any publisher writes to a registry.

A non-zero exit code from any hook aborts the release before publish runs. Hooks fire in declared order. Use --skip=before-publish to bypass.
binary_signslist of SignConfig[]Binary-specific signing configs (same shape as signs but only for binary artifacts). The artifacts field on each entry is constrained at parse time to binary / none (or omitted) — a broader filter on binary_signs would silently match nothing because the loop only iterates Binary artifacts. Constraint lives in deserialize_binary_signs.
changelogChangelogConfigChangelog generation configuration.
cloudsmithslist of CloudSmithConfigCloudSmith publisher configurations.
crateslist of CrateConfig[]List of crates in this project.
defaultsDefaultsDefault values applied to all crates unless overridden.
diststring./distOutput directory for build artifacts (default: ./dist).
docker_signslist of DockerSignConfigDocker image signing configurations.
dockerhublist of DockerHubConfigDockerHub description sync configurations.
envlist of stringEnvironment variables available to all template expressions.

List of KEY=VALUE strings: env: ["MY_VAR=hello", "DEPLOY_ENV=staging"]. Order is preserved so chained env applications (sign + sbom + notarize) see entries in declared order. Values are rendered through the template engine before being set, so expressions like {{ Tag }} or {{ Date }} are expanded.
env_filesEnvFilesConfigEnvironment file configuration. Accepts either: - A list of .env file paths: [".env", ".release.env"] - A struct with token file paths: { github_token: "~/.config/goreleaser/github_token" }
force_tokenForceTokenKindForce a specific token type for authentication. When set, overrides automatic token detection from environment variables.
gemfurylist of GemFuryConfigGemFury (fury.io) deb/rpm/apk publishing configurations. Mirrors The gemfury: block. The legacy spelling furies: is accepted via serde alias; a one-time deprecation warning is emitted by warn_on_legacy_furies_alias.
gitGitConfigGit-level tag discovery and sorting settings.
gitea_urlsGiteaUrlsConfigCustom Gitea API/download URLs for self-hosted Gitea installations.
github_urlsGitHubUrlsConfigCustom GitHub API/upload/download URLs for GitHub Enterprise installations.
gitlab_urlsGitLabUrlsConfigCustom GitLab API/download URLs for self-hosted GitLab installations.
homebrew_caskslist of HomebrewCaskConfigTop-level Homebrew Cask configurations. homebrew_casks is a top-level array with its own repository, commit_author, directory, skip_upload, hooks, dependencies, conflicts, completions, manpages, structured uninstall/zap, etc.
homebrew_coreslist of HomebrewCoreConfighomebrew-core formula-bump configurations. One entry per formula. Bumps an existing formula in Homebrew/homebrew-core (or a formula repository override) via the GitHub API and opens a pull request. The homebrew_cores: block.
includeslist of IncludeSpecAdditional config files to merge into this config. Supports plain string paths, from_file: for structured file paths, and from_url: for fetching configs from URLs with optional headers.
install_scriptslist of InstallScriptConfig[]curl | sh installer-script configurations. Each entry emits a deterministic POSIX install.sh release asset that detects the host OS + arch, downloads and sha256-verifies the matching archive, and installs the binary.
makeselfslist of MakeselfConfig[]Makeself self-extracting archive configurations.
mcpMcpConfigper fieldMCP (Model Context Protocol) server registry publishing configuration. When name is empty (the default), the publisher is skipped. The mcp: publisher block.
metadataMetadataConfigProject metadata configuration (applied to metadata.json output files).
milestoneslist of MilestoneConfigMilestone closing configurations.
monorepoMonorepoConfigMonorepo configuration. When configured, tag discovery filters by tag_prefix and the working directory is scoped to dir.
nightlyNightlyConfigNightly release configuration.
notarizeNotarizeConfigmacOS code signing and notarization configuration.
npmslist of NpmConfigNPM package registry publishing configurations. One entry per published package. In the default optional-deps mode anodizer emits npm's native per-platform packages (biome / git-cliff pattern); in postinstall mode it emits a download shim (the npms: parity).
on_errorHooksConfigHooks run when the release pipeline fails at ANY stage (build, sign, publish, ...). The pipeline holds on failure: published state is left exactly where the failed run put it, so {{ .RolledBack }} is always false. Recover by re-running the identical command (publishers reconcile against what already shipped and skip it), or withdraw the release deliberately with anodizer tag rollback.

Notification / cleanup hooks: a hook's own failure is logged as a warning and never masks the pipeline error. The failure context is exposed both as template vars ({{ .Error }}, {{ .RolledBack }}) and as ANODIZER_* env vars (ANODIZER_ERROR, ANODIZER_ROLLED_BACK, ANODIZER_VERSION, ANODIZER_TAG) so hooks can consume the error text without shell interpolation.

Use --skip=on-error to bypass — one token covers this block and every publish.on_error: block.

on_error:
hooks:
- cmd: ./notify-release-failed.sh
partialPartialConfigPartial/split build configuration for fan-out CI pipelines.
preflightPreflightConfig{"strict":false}Pre-publish preflight tuning. preflight.strict: true promotes indeterminate probe outcomes (5xx / rate-limit / network failure / undeterminable permissions) from warnings to hard blockers. The probes themselves always run read-only before any publisher mutates a registry; the default (lenient) behavior needs no config.
project_namestringHuman-readable project name used in templates and release titles.
publisherslist of PublisherConfigGeneric artifact publisher configurations.
pypislist of PypiConfigPyPI publishing configurations. One entry per published project. Emits native py3-none-<platform> binary wheels from the built binaries (plus an optional maturin sdist) and uploads them via PyPI's legacy (twine-protocol) upload API. The pypis: block.
releaseReleaseConfigGitHub release configuration shared by all crates.
report_sizesboolWhen true, log artifact file sizes after building.
retryRetryConfigTop-level retry configuration applied to network-bound operations (announcers, git providers, HTTP uploads, docker pipes). When omitted, RetryConfig::default() is used (10 attempts, 10s base, 5m cap — the project-level retry policy).
sbomslist of SbomConfig[]Software bill of materials (SBOM) generation configurations.
schemastoreSchemastoreConfigper fieldSchemaStore publisher. Registers the project's JSON Schema(s) on SchemaStore at release time. When schemas is empty (the default), the publisher is skipped. The schemastore: publisher block.
signslist of SignConfig[]Signing configurations for binaries, archives, and checksums.
snapshotSnapshotConfigSnapshot release configuration (local/non-tag builds).
sourceSourceConfigSource archive configuration.
srpmsSrpmConfigSource RPM configuration. Renamed from srpm: (singular) for spelling parity with Defaults.srpms and the rest of the plural-name packaging fields. The srpm: spelling is still accepted via serde alias for back-compat.
tagTagConfigAutomatic semantic version tagging configuration.
template_fileslist of TemplateFileConfigTemplate files to render and include as release artifacts. File contents are processed through the template engine.
uploadslist of UploadConfigGeneric HTTP upload configurations.
upxlist of UpxConfig[]UPX binary compression configurations.
variablesmapCustom template variables accessible as {{ Var.<key> }} in templates. Provides a way to define reusable values, especially useful with config includes.

Stored as a BTreeMap so rendering iterates in deterministic (sorted) key order — without this guarantee, a value that references another variable (b: "{{ Var.a }}_v2") could render before its dependency on a different process / host. The current resolver is single-pass (one render per value), so cross-variable references only resolve when the referenced key sorts earlier.
verify_releaseVerifyReleaseConfigper fieldOpt-in post-release verification gate. Runs LAST (after the release is created and every publisher has run) and REPORTS post-publish defects — missing assets, failed install smoke-tests, glibc-ceiling violations. Because it runs after the irreversible publish, a failure exits non-zero to flag CI but never undoes the release. Off unless verify_release.enabled: true.
versionintegerSchema version. Currently supports 1 (implicit default) and 2.
version_fileslist of stringRepo-committed files that embed the release version outside Cargo.toml (e.g. a Helm Chart.yaml, an install doc, a README badge), given as repo-root-relative path strings. At tag time each listed file has its occurrences of the old version rewritten to the new version — both the bare (0.1.0) and v-prefixed (v0.1.0) forms, word-boundary anchored — and is staged into the same bump commit as Cargo.toml / Cargo.lock, so these files never drift from the tag.

version_files:
- charts/cfgd/Chart.yaml
- docs/installation.md
workspaceslist of WorkspaceConfigIndependent workspace roots in a monorepo.

after

A lifecycle hook block: before:, after:, on_error:, always:, or before_publish:. Each block carries a list of hook commands that run around the entire pipeline (not individual stages); which block a list sits under decides when it fires.

The canonical key is hooks: in every block, matching the conventional spelling. The post: spelling is accepted as a serde alias on hooks for back-compat with the previous anodizer spelling; users with after: { post: [...] } keep working and a deprecation warning is logged when both spellings appear in the same block (see HooksConfig::merge_hook_aliases).

FieldTypeDefaultDescription
hookslist of HookEntryCommands to run when the block fires. The wire format accepts either hooks: (canonical) or the legacy post: spelling; both fold into this field at parse time.
postlist of HookEntryLegacy alias for hooks: (anodizer pre-v0.4). Always None after parsing — merge_hook_aliases collapses it into hooks. Present on the struct only because Deserialize writes through it before the fold step.

always

A lifecycle hook block: before:, after:, on_error:, always:, or before_publish:. Each block carries a list of hook commands that run around the entire pipeline (not individual stages); which block a list sits under decides when it fires.

The canonical key is hooks: in every block, matching the conventional spelling. The post: spelling is accepted as a serde alias on hooks for back-compat with the previous anodizer spelling; users with after: { post: [...] } keep working and a deprecation warning is logged when both spellings appear in the same block (see HooksConfig::merge_hook_aliases).

FieldTypeDefaultDescription
hookslist of HookEntryCommands to run when the block fires. The wire format accepts either hooks: (canonical) or the legacy post: spelling; both fold into this field at parse time.
postlist of HookEntryLegacy alias for hooks: (anodizer pre-v0.4). Always None after parsing — merge_hook_aliases collapses it into hooks. Present on the struct only because Deserialize writes through it before the fold step.

announce

Announce-stage integrations.

Message bodies are secret-redacted before send: known secret env values are masked (a real token becomes $NAME). Redaction is on by default; anodizer notify --allow-secrets opts a single send out for a trusted private channel, while anodizer's own log output stays redacted regardless.

FieldTypeDefaultDescription
blueskyBlueskyAnnounceBluesky announcement configuration.
deadlineHumanDurationOverall wall-clock deadline for the announce stage (e.g. "90s", "2m"). Optional — defaults to DEFAULT_ANNOUNCE_DEADLINE (90s).

Announcers run concurrently; any still running when this deadline elapses is abandoned with a warning rather than awaited. This bounds the stage so unreachable channels cannot accumulate into a hang that trips the pipeline timeout after publishers already crossed one-way doors. Raise it only if a slow-but-reachable channel legitimately needs longer.
discordDiscordAnnounceDiscord announcement configuration.
discourseDiscourseAnnounceDiscourse announcement configuration.
emailEmailAnnounceEmail announcement configuration. accepts the historical smtp: key as an alias because the field was renamed smtp: -> email: in v1.21+ and kept the alias for migration. Keeping the alias avoids forcing a re-yaml of legacy configs.
gate_onAnnounceGaterequired_publishersSelects when AnnounceStage runs vs. skips based on the PublishReport written by PublishStage/BlobStage. Default is required_publishers (announce only if every required publisher succeeded). See AnnounceGate for the other variants.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the entire announce stage is skipped. Render failure hard-errors. The announce.if:. Distinct from skip: (always-skip predicate) — both surfaces are documented.
linkedinLinkedInAnnounceLinkedIn announcement configuration.
mastodonMastodonAnnounceMastodon announcement configuration.
mattermostMattermostAnnounceMattermost announcement configuration.
opencollectiveOpenCollectiveAnnounceOpenCollective announcement configuration.
redditRedditAnnounceReddit announcement configuration.
skipStringOrBoolTemplate-conditional skip: if rendered to "true", skip the entire announce stage.
slackSlackAnnounceSlack announcement configuration.
teamsTeamsAnnounceMicrosoft Teams announcement configuration.
telegramTelegramAnnounceTelegram announcement configuration.
twitterTwitterAnnounceTwitter/X announcement configuration.
webhookWebhookConfigGeneric webhook announcement configuration.

appimages

AppImage packaging configuration.

Drives the AppImage stage, which bundles a built Linux binary plus its desktop integration (a .desktop entry + icon) into a single self-contained, runnable .AppImage file via linuxdeploy's appimage output plugin. One .AppImage is produced per matching Linux target so a multi-arch build yields distinct, non-colliding outputs.

YAML:

appimages:
  - id: helix
    ids: [helix-bin]
    desktop: contrib/Helix.desktop
    icon: contrib/helix.png
    appdir_extra:
      - src: runtime/
        dst: usr/lib/helix/runtime
    update_information: "gh-releases-zsync|helix-editor|helix|latest|helix-*.AppImage.zsync"
    runtime_harvest:
      command: "{{ ArtifactPath }} --populate-runtime {{ HarvestDir }}"
      dir: runtime/
FieldTypeDefaultDescription
appdir_extralist of AppImageExtraExtra files / directories copied into the AppDir before linuxdeploy runs (e.g. a harvested runtime/ tree). Each entry's dst is interpreted relative to the AppDir root.
archlist of stringTarget architecture filter. When omitted, every architecture in the build matrix produces its own .AppImage.
desktopstringPath to the .desktop entry file (template). Required — linuxdeploy will not assemble an AppImage without a desktop file.
extra_argslist of stringExtra arguments appended to the linuxdeploy command line.
filenamestringOutput filename template (default includes project, version, os, arch). The .AppImage extension is appended automatically when absent.
iconstringPath to the application icon (template). Required.
idstringUnique identifier for this AppImage config (default: "default").
idslist of stringBuild IDs filter: only bundle binaries whose id is in this list. When omitted, every Linux binary in the build matrix is eligible.
namestringApplication name passed to linuxdeploy via the APP env var and used as the AppDir basename. Defaults to the project name.
oslist of stringTarget OS filter (default: ["linux"]). AppImage is a Linux-only format.
runtime_harvestRuntimeHarvestRuntime-asset harvest hook: run the freshly-built binary ONCE on the host to populate a directory, then bundle that directory into the AppDir. The harvested data is architecture-independent (grammars, themes, queries), so it is produced once on the host-native binary and reused for every target's AppImage.
skipStringOrBoolSkip this config. Accepts bool or template string.
update_informationstringzsync delta-update metadata embedded in the AppImage, passed to linuxdeploy via the UPDATE_INFORMATION env var. When omitted, the AppImage carries no update information and UPDATE_INFORMATION is left unset (matching linuxdeploy's default).

artifactories

Artifactory upload configuration. Uploads artifacts to JFrog Artifactory repositories.

FieldTypeDefaultDescription
checksumboolInclude checksums in uploaded artifacts.
checksum_headerstringHeader name used for checksum verification (e.g. X-Checksum-Sha256).
client_x509_certstringPath to client X.509 certificate for mTLS authentication.
client_x509_keystringPath to client X.509 private key for mTLS authentication.
custom_artifact_nameboolUse custom artifact naming instead of default.
custom_headersmapCustom HTTP headers sent with each upload request.
deb_architecturestringOverride the Debian architecture for .deb uploads (;deb.architecture=). When unset (the default), the architecture is derived from each artifact's build target (x86_64amd64, aarch64arm64, armv7armhf, i686i386, …), so it never needs to be set by hand. Set this only to force a value for an artifact whose target can't be mapped. Ignored for non-.deb artifacts.
deb_componentslist of stringDebian repository component(s) for .deb uploads, written into the ;deb.component= matrix param. Defaults to ["main"] when unset. Multiple components are emitted comma-separated. Ignored for non-.deb artifacts.
deb_distributionslist of stringDebian repository distribution(s) for .deb uploads, written into the Artifactory ;deb.distribution= upload matrix param so apt can index the package. Defaults to ["stable"] when unset. A multi-element list is emitted as Artifactory's comma-separated form (deb.distribution=bookworm,bullseye), publishing the same .deb into several distributions at once. Ignored for non-.deb artifacts.
excludelist of stringGlob patterns matched against each artifact's file name; anodizer drops any artifact whose name matches at least one glob from THIS Artifactory target only. Use it to keep heavy sidecars (checksums, signatures, SBOMs) off a given repository while archives still upload. Composes with ids: and exts: (all filters apply). None/empty keeps everything.

artifactories:
- target: "https://repo.example.com/{{ .ProjectName }}/{{ .Tag }}/{{ .ArtifactName }}"
exclude: [".sha256", ".sig", "*.cdx.json"]
extra_fileslist of ExtraFileSpecExtra files to upload alongside build artifacts.
extra_files_onlyboolWhen true, upload only extra_files (skip normal artifacts).
extslist of stringFile extension filter: only upload artifacts matching these extensions.
idslist of stringBuild IDs filter: only upload artifacts from builds whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the artifactory publisher is skipped. Render failure hard-errors. The artifactories[].if:.
metaboolInclude dist/metadata.json in uploaded artifacts. The sibling dist/artifacts.json manifest is never uploaded.
methodstringHTTP method to use for uploads (default: "PUT").
modestringUpload mode: "archive" (upload archives) or "binary" (upload binaries).
namestringHuman-readable name for this publisher (used in logs).
overwriteboolRe-upload an artifact even when an identical one already exists at the target path (default: false).

With the default, a re-run that finds the same version's artifact already uploaded with a matching SHA-256 records an idempotent SKIP rather than re-PUTting it — so re-running a partially-failed release is safe. A path that already holds a different artifact for the same version still hard-errors (immutable-version drift) unless overwrite is set. With overwrite: true, every artifact is PUT unconditionally (Artifactory replaces the stored copy), restoring blind-overwrite behaviour for repos configured to allow it.
passwordstringArtifactory password or API key (or env var reference).
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
signatureboolInclude signatures in uploaded artifacts.
skipStringOrBoolTemplate-conditional skip: if rendered result is "true", skip this publisher.
targetstringTarget URL template for uploads (supports template variables).
trusted_certificatesstringPEM-encoded trusted CA certificates for TLS verification. Appended to the system certificate pool.
usernamestringArtifactory username for authentication.

attestations

SLSA build-provenance / attestation configuration for binaries and archives.

Two modes select how anodizer participates in attestation:

  • AttestationMode::Subjects (the default) emits a subjects manifest (dist/attestation-subjects.json) that anodizer-action feeds to GitHub's actions/attest-build-provenance. anodizer does NOT mint a GitHub-trusted attestation itself in this mode — the Action's OIDC identity does. This is the path fd / biome / gping use. - AttestationMode::Emit generates a self-contained in-toto v1 statement carrying an SLSA provenance v1 predicate over the selected artifacts, writes it as a release asset (attestation.intoto.jsonl), and lets the existing signs: stage sign it (keyed, not OIDC). This is for users who can't run the Action (the --with-provenance toggle).

YAML:

attestations:
  enabled: true
  mode: subjects          # or: emit ; default = subjects
  artifacts: [archive, binary, checksum]
FieldTypeDefaultDescription
artifactslist of AttestationArtifactKindWhich produced-artifact kinds to attest. Each entry selects a KIND (archive, binary, checksum); the concrete subject set (filenames + sha256) is DERIVED from the artifacts anodizer already produced.

Defaults to [archive, binary, checksum] when omitted.
enabledboolfalseEnable attestation. When false (the default), the stage is a no-op.
modeAttestationModeParticipation mode: subjects (default) writes a manifest for actions/attest-build-provenance; emit generates and signs an in-toto SLSA provenance statement as a release asset.
skipStringOrBoolSkip the attestation stage. Accepts a bool or a template string.

aur_sources

FieldTypeDefaultDescription
amd64_variantAmd64Variantx86_64 micro-architecture variant — v1 (baseline), v2, v3 (AVX2), or v4. Constrained to a typed enum because AUR source pkgs build from the upstream tarball (no binary artifacts to filter), so the value's only role is as the Amd64 template var consumed by prepare: / build: / package: script bodies — typos must fail at parse time, not silently render an invalid string into the PKGBUILD. When unset, defaults to v1 at template-render time.
archeslist of stringExplicit architecture list (default: auto-detect from artifacts).
backuplist of stringBackup files to preserve on upgrade.
buildstringCustom build() function body for PKGBUILD.
commit_authorCommitAuthorConfigCommit author with optional signing.
commit_msg_templatestringCustom commit message template.
conflictslist of stringPackages this PKGBUILD conflicts with.
contributorslist of stringContributors listed in PKGBUILD comments.
dependslist of stringRuntime dependencies.
descriptionstringShort description of the package.
directorystringSubdirectory in the git repo for committed files.
git_ssh_commandstringCustom SSH command for git operations.
git_urlstringAUR SSH git URL override. Defaults to ssh://aur@aur.archlinux.org/<package>.git, derived from the resolved package name; set this only for a non-standard endpoint.
homepagestringProject homepage URL.
idslist of stringBuild IDs filter.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the AUR source config is skipped. Render failure hard-errors. The aur_sources[].if:.
installstringContent for a .install file (post-install/pre-remove scripts).
licensestringSPDX license identifier.
maintainerslist of stringPKGBUILD maintainer entries.
makedependslist of stringBuild-time dependencies (source packages need these).
namestringOverride the package name (default: crate name, no -bin suffix).
optdependslist of stringOptional dependencies.
packagestringCustom package() function body for PKGBUILD.
preparestringCustom prepare() function body for PKGBUILD.
private_keystringPath to SSH private key file.
provideslist of stringPackages this PKGBUILD provides.
relstringPackage release number (default: "1").
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
skipStringOrBoolSkip this config. Accepts the legacy disable: spelling via serde alias for back-compat.
skip_uploadStringOrBoolSkip publishing. "true" always skips; "auto" skips for prereleases.
url_templatestringCustom URL template for download URLs.

before

A lifecycle hook block: before:, after:, on_error:, always:, or before_publish:. Each block carries a list of hook commands that run around the entire pipeline (not individual stages); which block a list sits under decides when it fires.

The canonical key is hooks: in every block, matching the conventional spelling. The post: spelling is accepted as a serde alias on hooks for back-compat with the previous anodizer spelling; users with after: { post: [...] } keep working and a deprecation warning is logged when both spellings appear in the same block (see HooksConfig::merge_hook_aliases).

FieldTypeDefaultDescription
hookslist of HookEntryCommands to run when the block fires. The wire format accepts either hooks: (canonical) or the legacy post: spelling; both fold into this field at parse time.
postlist of HookEntryLegacy alias for hooks: (anodizer pre-v0.4). Always None after parsing — merge_hook_aliases collapses it into hooks. Present on the struct only because Deserialize writes through it before the fold step.

before_publish

A lifecycle hook block: before:, after:, on_error:, always:, or before_publish:. Each block carries a list of hook commands that run around the entire pipeline (not individual stages); which block a list sits under decides when it fires.

The canonical key is hooks: in every block, matching the conventional spelling. The post: spelling is accepted as a serde alias on hooks for back-compat with the previous anodizer spelling; users with after: { post: [...] } keep working and a deprecation warning is logged when both spellings appear in the same block (see HooksConfig::merge_hook_aliases).

FieldTypeDefaultDescription
hookslist of HookEntryCommands to run when the block fires. The wire format accepts either hooks: (canonical) or the legacy post: spelling; both fold into this field at parse time.
postlist of HookEntryLegacy alias for hooks: (anodizer pre-v0.4). Always None after parsing — merge_hook_aliases collapses it into hooks. Present on the struct only because Deserialize writes through it before the fold step.

binary_signs

FieldTypeDefaultDescription
argslist of stringArguments passed to the signing command (supports templates with ${artifact} and ${signature}).
artifactsstringArtifact types to sign: "all", "archive", "binary", "checksum", "package", "sbom" (default: "none").
authenticodeAuthenticodeConfigAuthenticode (Windows PE/MSI) signing backend. When set, this sign config signs Windows artifacts in place via osslsigncode (Linux/cross) or signtool (Windows) instead of producing a detached cosign/gpg signature. The signing command, argv, timestamp URL, and artifact selector are all derived; supply only the cert (a secret).
certificatestringCertificate file to embed in the signature (Cosign bundle signing).
cmdstringSigning command to invoke (default: "cosign" or "gpg").
envlist of stringEnvironment variables passed to the signing command.
idstringUnique identifier for this sign config.
idslist of stringBuild IDs filter: only sign artifacts from builds whose id is in this list.
ifstringTemplate-conditional: skip this sign config if rendered result is "false" or empty.
outputStringOrBoolCapture and log stdout/stderr of the signing command. Accepts bool or template string (e.g., "{{ IsSnapshot }}").
signaturestringSignature output filename template (supports templates).
stdinstringContent written to the signing command's stdin.
stdin_filestringPath to a file whose content is written to the signing command's stdin.
verifySignVerifyConfigPost-sign verification knobs. Verification is ON by default wherever its inputs are derivable (keyed cosign, keyless cosign on GitHub Actions, gpg); set verify: { enabled: false } to disable, or supply the keyless certificate identity / issuer when they cannot be derived from the environment.

changelog

FieldTypeDefaultDescription
abbrevintegerHash abbreviation length. Default: 0 (no truncation, emit the full SHA). Set to -1 to omit the hash entirely; positive values truncate to N chars. Values below -1 are clamped to -1 (a git log --abbrev=N would otherwise reject -2, -3, ...).
aiChangelogAiConfigAI-powered changelog enhancement configuration.
dividerstringDivider string inserted between changelog groups (e.g. "---"). Supports templates.
filesChangelogFilesConfigChangelog file-layout controls: which CHANGELOG.md files a release writes (per-crate vs the aggregate root). Separate from the content-generation keys above (use, format, groups, filters, paths, sort, ...) so file management and content concerns stay orthogonal. See ChangelogFilesConfig.
filtersChangelogFiltersCommit message filters to include or exclude from the changelog.
footerContentSourceText appended to the changelog. Same shape as header.
formatstringTemplate for each changelog commit line. Available variables: SHA (full hash), ShortSHA (abbreviated), Message (commit subject), AuthorName, AuthorEmail, Login (per-commit GitHub username), Logins (per-entry comma-separated list of GitHub usernames for that commit), AllLogins (comma-separated list of all GitHub usernames across the entire release), AuthorUsername (renders @login when the login is known, the plain author name otherwise).

Logins come from the SCM API backends (use: github/gitea) and — when the release targets GitHub and a token is available — from GitHub-API enrichment of the default git backend, so use: git changelogs render @login mentions too. Release bodies carry bare @login (GitHub autolinks them); on-disk CHANGELOG.md files get explicit [@login](https://github.com/login) links. Without a token (or offline, or with a non-GitHub remote) rendering keeps the plain author name.

Default depends on backend (the full SHA is used):
git backend (default): "{{ SHA }} {{ Message }}"
github/gitlab/gitea backend: "{{ SHA }}: {{ Message }} (@Login or AuthorName <AuthorEmail>)" — falls back to AuthorName <AuthorEmail> when Login is empty.

When abbrev < 0, the default reduces to "{{ Message }}" (no hash prefix).
groupslist of ChangelogGroupGroups for organizing changelog entries by commit message prefix.
headerContentSourceText prepended to the changelog. Inline string, from_file: <path>, or from_url: <url> — symmetric with the release block's header/footer so users can compose headers from a templated file or remote endpoint (the upstream uses a plain string here; anodizer extends to ContentSource for consistency with release.header).
pathslist of stringOptional path filter that NARROWS the per-crate scope by intersection — it never replaces it. Each changelog track already scopes to its own commits (a per-crate track to its crate directory; the aggregate to the union of every crate directory plus the workspace manifests). When set, paths further restricts that derived scope to commits whose touched files match these globs; it can only ever drop commits, never widen to another track's directory. A paths value that is a superset of the derived scope (e.g. ["crates/**", "Cargo.toml", "Cargo.lock"] over a workspace) is therefore a no-op — and so is the recommended default of leaving paths unset, where scoping is fully derived. The same derived scope and intersect drive all three changelog formats (keep-a-changelog, json, and release-notes), so they cannot drift.

With use: git the intersect is precise (commits are filtered by their touched files). With use: github only the first path is used for API queries; with use: gitlab / gitea path filtering is unsupported, so a narrowing paths there is coarse and a warning is emitted. Supports template rendering.
skipStringOrBoolSkip changelog generation. Accepts bool or template string (e.g. "{{ if IsSnapshot }}true{{ endif }}" for conditional skip).

Accepts disable: as an alias so imported configs (which use changelog.disable:) parse cleanly without a rename. Anodizer's broader convention is skip: (mirrors release.skip_upload, stage-level skip: flags), so the canonical key stays skip:.
snapshotboolWhen true, render the changelog even in snapshot mode. Anodizer matches the default (skip changelog on snapshot) and lets users opt back in here for local preview / draft generation. Wired in crates/stage-changelog/src/lib.rs::ChangelogStage::run.
sortstringSort order for changelog entries: "asc" or "desc" (default: "asc").
titlestringTitle heading for the changelog. Default: "Changelog". Supports templates.
usestringChangelog source: "git" (default), "github", or "github-native". "github" fetches commits via the GitHub API, enriching entries with author login information (available as the {{ Logins }} per-entry template variable and the {{ AllLogins }} release-wide variable). "github-native" delegates entirely to GitHub's auto-generated notes.

cloudsmiths

CloudSmith publisher configuration. Pushes packages to CloudSmith repositories.

FieldTypeDefaultDescription
componentstringDebian component name (e.g. "main").
distributionsmapDistribution mapping per format. Each entry accepts either a single slug (deb: "ubuntu/focal") or an array of slugs (deb: ["ubuntu/focal", "ubuntu/jammy"]); the array form issues one upload per entry.
excludelist of stringGlob patterns matched against each artifact's file name; anodizer drops any artifact whose name matches at least one glob from THIS CloudSmith target only. Use it to keep heavy sidecars off a given repository while packages still upload. Composes with ids: and formats: (all filters apply). None/empty keeps everything.

cloudsmiths:
- organization: my-org
repository: my-repo
exclude: [".sha256", ".sig", "*.cdx.json"]
formatslist of stringPackage format filter: only publish artifacts matching these formats.
idslist of stringBuild IDs filter: only publish artifacts from builds whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the CloudSmith publisher is skipped. Render failure hard-errors. Config key: cloudsmiths[].if:.
keep_versionsintegerRetain only the N most-recent release versions of each published package, pruning older ones from the CloudSmith repository after a successful upload.

This is opt-in and destructive: leaving it unset (the default) prunes nothing. When set, after the just-uploaded artifacts are confirmed present the publisher lists every version of this package in the repository, ranks the distinct release versions by SemVer (newest first), keeps the top N — which always includes the version just published — and issues DELETE for every artifact (all formats and architectures) belonging to versions ranked beyond N. Other packages sharing the repository are never touched.

All package formats of one release are treated as the same version: the deb/rpm epoch (1:0.9.1-1) and apk revision (0.9.1-r1) suffixes are normalized to the base SemVer (0.9.1) before ranking, so keeping 2 versions keeps every .deb/.rpm/.apk of the two newest releases.

Pruning is best-effort: it runs only after the upload (the real work) has already succeeded, is skipped entirely in dry-run and snapshot mode, and a list/delete failure emits a prominent warning and continues rather than failing the release or rolling anything back. keep_versions: 0 is rejected — anodizer never prunes every version.

Primarily a remedy for storage-capped repositories (e.g. the CloudSmith free plan's 500 MB limit, which offers no server-side retention policy).

cloudsmiths:
- organization: acme
repository: tools
keep_versions: 3 # keep the 3 newest releases, prune older ones
organizationstringCloudSmith organization slug.
repositorystringCloudSmith repository slug.
republishStringOrBoolWhen true, allow republishing over existing package versions.
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
secret_namestringEnvironment variable name containing the CloudSmith API key.
skipStringOrBoolTemplate-conditional skip: if rendered result is "true", skip this publisher.

crates

FieldTypeDefaultDescription
afterHooksConfigHooks that run inside THIS crate's scope at the end of the release, after the crate's publish dispatch (and post-publish verification) completes. Per-crate counterpart of the top-level after: (which fires once around the whole release). Same per-crate firing semantics across all modes, template surface, and abort semantics as the per-crate before:.
app_bundleslist of AppBundleConfigmacOS app bundle configurations for this crate.
archiveslist of ArchiveConfig[]Archive configurations for this crate. Set to false to disable archiving, or provide an array of archive configs.
beforeHooksConfigHooks that run inside THIS crate's scope at the start of the release, before the build. Distinct from the top-level before:, which fires ONCE around the whole release; these fire once per crate with that crate's version/tag template vars anchored, so cmd / dir / env / if render against the crate's own Version / Tag / ProjectName. A non-zero exit aborts the release.

Fires once per crate in EVERY multi-crate mode — workspace per-crate AND workspace lockstep with multiple publisher crates — in both a full anodizer release and anodizer release --publish-only, matching the per-crate iteration of before_publish: and the publishers. With an explicit --crate subset only the selected crates' hooks fire. No-op in a single-crate config with no crates: block (use the top-level before: there).
before_publishHooksConfigHooks that run immediately before THIS crate's publishers dispatch, once per matching artifact (the same per-artifact semantics as the top-level before_publish:), scoped to the crate's own artifacts and template vars. Honors the per-entry ids: / artifacts: filters. A non-zero exit aborts the release before that crate publishes to any registry. The top-level before_publish: still fires once over the full artifact set; this one targets a single crate's artifacts.
binstallBinstallConfigcargo-binstall metadata configuration for this crate.
blobslist of BlobConfigCloud storage (S3/GCS/Azure) upload configurations for this crate.
buildslist of BuildConfigBuild configurations for this crate. One entry per binary by default.
checksumChecksumConfigChecksum configuration for this crate.
crossCrossStrategyCross-compilation strategy for this crate: auto, zigbuild, cross, or cargo.
depends_onlist of stringOther crates this crate depends on; ensures release ordering.
dmgslist of DmgConfigmacOS DMG disk image configurations for this crate.
docker_digestDockerDigestConfigDocker image digest file configuration for this crate.
docker_manifestslist of DockerManifestConfigDocker multi-platform manifest configurations for this crate.
dockers_v2list of DockerV2ConfigDocker V2 image build configurations for this crate (canonical API: images+tags, annotations, build_args, sbom, disable). The legacy docker: block was removed; this is the only docker surface. The docker_v2: spelling is still accepted via serde alias for back-compat.
flatpakslist of FlatpakConfigLinux Flatpak bundle configurations for this crate.
msislist of MsiConfigWindows MSI installer configurations for this crate.
namestringCrate name as published (must match the Cargo.toml package name).
nfpmslist of NfpmConfigLinux package (deb, rpm, apk) configurations for this crate. Renamed from nfpm: (singular) for spelling parity with Defaults.nfpms and the rest of the plural-name per-crate packaging lists (dmgs, msis, pkgs, nsis, ...). The nfpm: spelling is still accepted via serde alias for back-compat.
no_unique_dist_dirStringOrBoolWhen true (or template evaluating to "true"), all build outputs are placed in a flat dist/ directory instead of dist/{target}/.
nsislist of NsisConfigNSIS installer configurations for this crate.
pathstringRelative path to the crate directory from the project root.
pkgslist of PkgConfigmacOS PKG installer configurations for this crate.
publishPublishConfigPublishing targets (Homebrew, Scoop, AUR, etc.) for this crate.
releaseReleaseConfigGitHub release configuration for this crate.
snapcraftslist of SnapcraftConfigSnapcraft package configurations for this crate.
tag_templatestringGit tag template used to tag and identify releases (supports templates). Overrides defaults.crates.tag_template. When both are unset, resolves to CrateConfig::DEFAULT_TAG_TEMPLATE — use resolved_tag_template() rather than reading this field directly.
universal_binarieslist of UniversalBinaryConfigmacOS universal binary (fat binary) configurations for this crate.
versionstringPinned semver version. When set, anodizer bump --strict refuses to edit this crate's Cargo.toml to anything other than this value; without --strict, the bump proceeds with a warning. Lets a release captain freeze a crate's version while still running broad --workspace bumps.
version_fileslist of stringRepo-committed files that embed this crate's release version outside Cargo.toml (repo-root-relative path strings). At tag time each file has its occurrences of the old version rewritten to the new version — both bare and v-prefixed forms, word-boundary anchored — and is staged into the same bump commit as this crate's Cargo.toml. Overrides the workspace-level defaults.version_files.
version_syncVersionSyncConfigAutomatic version number synchronization configuration for this crate.

defaults

Workspace-level defaults that path-mirror the CrateConfig (and select top-level Config) shape. Each field here is folded into every resolved crate by defaults_merge::apply_defaults according to the deep-merge / merge-by-identity semantics documented in defaults_merge.

Multi-publisher fields are single-struct on both sides today: defaults supplies one struct per publisher, and per-crate publish.* fields are also single-struct. A future change may introduce list-or-scalar via OneOrMany<T> on the per-crate side so a crate can declare multiple homebrew taps / scoop buckets / etc.; the defaults side would stay single-struct and merge into the first per-crate entry by identity.

FieldTypeDefaultDescription
app_bundlesAppBundleConfigDefault app-bundle settings applied to all crates.
archivesArchiveConfigDefault archive settings applied to all crates.
binary_signsSignConfigDefault binary-signing settings.
buildsBuildConfigDefault build settings applied to every crate's builds (deep-merged into each CrateConfig.builds[] entry by identity on id/binary).
checksumChecksumConfigDefault checksum settings applied to all crates. Mirrors CrateConfig.checksum so checksum config can be hoisted to defaults.
cratesDefaultsCrateBlockCrate-axis defaults marker. Only valid when top-level crates: is set. Reserved for per-crate overrides keyed by crate id (future waves).
crossCrossStrategyDefault cross-compilation strategy: auto, zigbuild, cross, or cargo. Mirrors CrateConfig.cross so the strategy can be hoisted to defaults.
dmgsDmgConfigDefault DMG settings applied to all crates.
docker_signsDockerSignConfigDefault Docker image signing settings.
dockers_v2DockerV2ConfigDefault Docker (V2 API) image settings applied to all crates. The docker_v2: spelling is still accepted via serde alias for back-compat.
envlist of stringDefault environment variables (KEY=VALUE strings) hoisted across crates.
flatpaksFlatpakConfigDefault flatpak settings applied to all crates.
install_scriptsInstallScriptConfigDefault install-script settings applied to all crates.
makeselvesMakeselfConfigDefault makeself settings applied to all crates.
msisMsiConfigDefault MSI settings applied to all crates.
nfpmsNfpmConfigDefault nfpm (deb/rpm/apk) settings applied to all crates.
notarizeNotarizeConfigDefault macOS notarization settings.
nsisNsisConfigDefault NSIS settings applied to all crates.
pkgsPkgConfigDefault macOS PKG settings applied to all crates.
publishPublishDefaultsDefault publisher configurations (single-struct per publisher). Per-crate publish.* entries are merged into these by identity.
sbomSbomConfigDefault SBOM generation settings.
signSignConfigDefault artifact signing settings.
snapcraftsSnapcraftConfigDefault snapcraft settings applied to all crates.
sourceSourceConfigDefault source-archive settings applied to all crates.
srpmsSrpmConfigDefault SRPM settings applied to all crates.
targetslist of stringDefault build targets (e.g., ["x86_64-unknown-linux-gnu", "aarch64-apple-darwin"]).
upxUpxConfigDefault UPX compression settings applied to all crates.
version_fileslist of stringDefault repo-committed files whose embedded release version is rewritten at tag time (repo-root-relative path strings). Hoisted across crates; folded into each crate's version_files by defaults_merge when the crate does not set its own list. Mirrors CrateConfig.version_files.
workspacesDefaultsWorkspaceBlockWorkspace-axis defaults marker. Only valid when top-level workspaces: is set. Reserved for per-workspace overrides keyed by workspace name (future waves).

docker_signs

FieldTypeDefaultDescription
argslist of stringArguments passed to the signing command (supports templates).
artifactsstringDocker artifact types to sign: "all", "image", or "manifest" (default: "none").
certificatestringCertificate file to embed in the signature (Cosign bundle signing).
cmdstringSigning command to invoke (default: "cosign").
envlist of stringEnvironment variables passed to the signing command.
idstringUnique identifier for this docker sign config.
idslist of stringDocker config IDs filter: only sign images from configs whose id is in this list.
ifstringTemplate-conditional: skip this docker sign config if rendered result is "false" or empty.
outputStringOrBoolCapture and log stdout/stderr of the docker signing command.
signaturestringSignature output filename template (supports templates).
stdinstringContent written to the signing command's stdin.
stdin_filestringPath to a file whose content is written to the signing command's stdin.
verifySignVerifyConfigPost-sign verification knobs — see SignVerifyConfig. Docker signatures are verified with cosign verify against the registry the sign just pushed to.

dockerhub

DockerHub description sync configuration. Pushes image descriptions and README content to DockerHub repositories.

FieldTypeDefaultDescription
descriptionstringShort description for the DockerHub repository (max 100 chars).
full_descriptionDockerHubFullDescriptionFull description (README) source for the DockerHub repository.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the DockerHub publisher is skipped. Render failure hard-errors. Exposes the dockerhub[].if: conditional gate; distinct from skip: (which expresses "always skip") and provides config-import parity.
imageslist of stringDockerHub image names to update (e.g. myorg/myapp).
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
secret_namestringEnvironment variable name containing the DockerHub token.
skipStringOrBoolSkip this publisher. Accepts bool or template string. Accepts the legacy disable: spelling via serde alias for back-compat with imported configs (the legacy disable: spelling).
usernamestringDockerHub username for authentication.

gemfury

GemFury package registry publisher configuration.

Pushes deb / rpm / apk artifacts to https://push.fury.io/<account>. Authenticates via HTTP Basic auth using the push token as the username (empty password) — the conventional Fury push surface.

FieldTypeDefaultDescription
accountstringGemFury account name. Required; rendered through the template engine so account: "{{ Env.MY_FURY_ACCOUNT }}" works.
api_secret_namestringEnvironment variable name carrying the API (delete) token. Default FURY_API_TOKEN.
api_tokenstringOptional API token used by rollback to issue DELETE /<account>/packages/<name>/versions/<version>. When unset, the env var named by api_secret_name (default FURY_API_TOKEN) is consulted at rollback time. If both are absent at rollback time, the publisher falls back to a manual-cleanup warn.
excludelist of stringGlob patterns matched against each artifact's file name; anodizer drops any artifact whose name matches at least one glob from THIS GemFury target only. Use it to keep heavy sidecars off the account while packages still upload. Composes with ids: and the format filter (all filters apply). None/empty keeps everything.

gemfury:
- account: my-account
exclude: [".sha256", ".sig", "*.cdx.json"]
formatslist of stringPackage format filter: only push artifacts matching these formats. Defaults to ["apk", "deb", "rpm"].
idstringUnique identifier for selecting this entry from the CLI (--id=...).
idslist of stringBuild IDs filter: only include artifacts whose archive id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the GemFury publisher entry is skipped. Render failure hard-errors. Exposes the gemfury[].if: conditional gate; distinct from skip: (which expresses "always skip") and provides config-import parity.
requiredboolOverride whether this publisher failing should fail the overall release.

Default: true — GemFury is a Manager-group publisher (mutable but reversible via the delete API), so a failed publish aborts by default to avoid surprising the operator with a half-released version. Set to false to log failures but continue.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
secret_namestringEnvironment variable name carrying the push token. Default FURY_PUSH_TOKEN. The actual token VALUE is read from this env var at publish/rollback time.
skipStringOrBoolTemplate-conditional skip: if rendered result is "true", skip this publisher entry. Accepts bool or template string. Accepts the legacy disable: spelling via serde alias for back-compat with imported gemfury[].disable: configs.
tokenstringPush token used as the HTTP Basic auth username (empty password). When unset, the env var named by secret_name (default FURY_PUSH_TOKEN) is consulted at publish time. NEVER logged.

git

Git-level tag discovery and sorting settings.

Controls how anodizer discovers and orders tags when determining the current and previous versions. This is separate from TagConfig, which controls version bumping logic.

FieldTypeDefaultDescription
ignore_tag_prefixeslist of stringTag prefixes to ignore during version detection (supports templates). Tags starting with any prefix in this list are excluded. The ignore-tag-prefixes feature.
ignore_tagslist of stringTag patterns to ignore during version detection (supports templates). Tags matching any pattern in this list are excluded from version detection entirely.
prerelease_suffixstringSuffix that identifies pre-release tags for sorting purposes. When set, tags ending with this suffix are treated as pre-releases and sorted accordingly during tag discovery.
tag_sortstringHow to sort git tags when determining the latest version.

Accepted values: - "-version:refname" (default) — lexicographic version sort on the tag name. - "-version:creatordate" — sort by the tag's creation date (newest first). - "semver" — strict SemVer 2.0.0 ordering computed in Rust; prereleases sort below their release per spec section 11. Bypasses git's native sort. - "smartsemver" — same ordering as "semver", but when the current version (resolved from the template Version variable) is non-prerelease, prerelease tags are filtered out before previous-tag selection. Prevents v0.2.0-beta.3 from being picked as the predecessor of v0.2.0 (which would otherwise produce an empty changelog).

gitea_urls

Custom Gitea API/download URLs for self-hosted Gitea installations. Gitea API/download URL overrides.

FieldTypeDefaultDescription
apistringGitea API base URL (e.g. https://gitea.example.com/api/v1/).
downloadstringGitea download URL for release assets.
skip_tls_verifyboolWhen true, skip TLS certificate verification for the custom URLs.

github_urls

Custom GitHub API/upload/download URLs for GitHub Enterprise installations. GitHub API/download URL overrides.

FieldTypeDefaultDescription
apistringGitHub API base URL (e.g. https://github.example.com/api/v3/).
downloadstringGitHub download URL for release assets (e.g. https://github.example.com/).
skip_tls_verifyboolWhen true, skip TLS certificate verification for the custom URLs.
uploadstringGitHub upload URL for release assets (e.g. https://github.example.com/api/uploads/).

gitlab_urls

Custom GitLab API/download URLs for self-hosted GitLab installations. GitLab API/download URL overrides.

FieldTypeDefaultDescription
apistringGitLab API base URL (e.g. https://gitlab.example.com/api/v4/).
downloadstringGitLab download URL for release assets.
skip_tls_verifyboolWhen true, skip TLS certificate verification for the custom URLs.
use_job_tokenboolWhen true, use the CI_JOB_TOKEN for authentication instead of a personal token.
use_package_registryboolWhen true, use the GitLab Package Registry for uploads instead of Generic Packages.

homebrew_casks

Unified Homebrew Cask configuration.

Used at both call-sites: - homebrew_casks: — top-level array; carries repository, commit_author, directory, ids, url, structured uninstall/zap, etc. - crates[].publish.homebrew_cask: — per-crate override; same shape, with url_template as the simpler URL alternative.

Fields from both original types are present; any field may be None at either call-site. The union avoids a two-type bifurcation while keeping both axes.

FieldTypeDefaultDescription
alternative_nameslist of stringAlternative cask names (aliases).
appstringmacOS .app bundle name (e.g. "MyApp.app").
binarieslist of HomebrewCaskBinaryBinary stubs to create in /usr/local/bin.

Each entry is either a bare string ("my-cli" → emits binary "my-cli") or a structured { name, target } object ({ name: "my-cli", target: "mycli" } → emits binary "my-cli", target: "mycli"). The target: form mirrors the Homebrew Ruby cask DSL for binary renames — without it, a wrapped binary installs at the wrong path. Cask binary entry.
binarystringDeprecated singular spelling of binaries. The upstream replaced binary: foo with binaries: [foo]; this field captures the legacy spelling so imported configs keep parsing. apply_homebrew_cask_legacy_singulars folds the value into binaries at config-load time and emits a one-time deprecation warning per occurrence. The field is excluded from serialization so a round-tripped config emits only the canonical plural form.
caveatsstringCustom caveats shown after install.
commit_authorCommitAuthorConfigCommit author with optional signing.
commit_msg_templatestringCustom commit message template. Default: "Brew cask update for {{ ProjectName }} version {{ Tag }}"
completionsHomebrewCaskCompletionsShell completion definitions.
conflictslist of HomebrewCaskConflictEntryConflicting casks or formulae.
custom_blockstringArbitrary Ruby code inserted into the cask block.
dependencieslist of HomebrewCaskDependencyEntryCask dependencies (other casks or formulae).
descriptionstringCask description.
directorystringSubdirectory in the tap repo for cask placement (default: "Casks").
generate_completions_from_executableHomebrewCaskGeneratedCompletionsAuto-generate shell completions from an executable.
homepagestringProject homepage URL.
hooksHomebrewCaskHooksPre/post install/uninstall hooks.
idslist of stringBuild IDs filter: only include artifacts from builds whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the Homebrew Cask config is skipped. Render failure hard-errors. Config key: homebrew_casks[].if:.
licensestringLicense identifier (SPDX).
livecheckHomebrewLivechecklivecheck stanza configuration for the cask. When unset, the cask emits livecheck do\n skip "Auto-generated on release."\nend (a binary cask's download URL/sha256 are rewritten on every release, so brew livecheck has nothing stable to poll). Set strategy: / url: / regex: (with skip: false) to opt into active version detection — the same shape a Homebrew cask livecheck do … end block accepts. Reuses the formula livecheck config type.
manpagestringDeprecated singular spelling of manpages. The upstream replaced manpage: foo.1 with manpages: [foo.1]; this field captures the legacy spelling so imported configs keep parsing. apply_homebrew_cask_legacy_singulars folds the value into manpages at config-load time and emits a one-time deprecation warning per occurrence. The field is excluded from serialization so a round-tripped config emits only the canonical plural form.
manpageslist of stringManual page references to install.
namestringCask name (default: crate / project name).
repositoryRepositoryConfigUnified repository config for the Homebrew tap.
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
servicestringHomebrew service definition.
skip_uploadStringOrBoolSkip publishing the cask. "true" always skips; "auto" skips for prerelease versions. Accepts bool or template string.
uninstallHomebrewCaskUninstallStructured uninstall stanza configuration.
update_existing_prStringOrBoolWhen true, force-push the updated cask file to the existing PR branch when a PR for the same head branch already exists. The PR content is updated in place rather than creating a duplicate. When false (default), the push is skipped and a warning is emitted so the operator sees that the publisher did not update the PR.
urlHomebrewCaskURLStructured download URL configuration (top-level axis).
url_templatestringSimple URL template for the .dmg/.zip download (per-crate shorthand).

Cannot be combined with url.template: — set one or the other. If both are present, config validation rejects the config at parse time. Use url: for the structured form (verified domain, custom headers, etc.) or url_template: for a bare string shorthand — never both simultaneously.
zapHomebrewCaskUninstallDeep uninstall (zap) stanza configuration.

homebrew_cores

homebrew-core formula-bump publisher configuration.

Bumps an EXISTING formula in Homebrew/homebrew-core (or any formula repository override) purely through the GitHub API — no clone, no brew invocation. The formula file's url (or tag:/revision: pair), sha256, and version stanzas are rewritten to the new release, the change is committed to a branch, and a pull request is opened against the formula repository. Each homebrew_cores[] entry bumps one formula.

Every field is optional: the formula name defaults to the crate name, the target repository defaults to Homebrew/homebrew-core, the formula path defaults to the sharded core layout (Formula/<letter>/<name>.rb, falling back to the flat Formula/<name>.rb), and the download URL defaults to the GitHub source tarball for the release tag.

homebrew_cores:
  - name: my-tool
FieldTypeDefaultDescription
commit_authorCommitAuthorConfigCommit author for the formula-bump commit, with optional signing. Its use_github_app_token is the canonical homebrew-core knob: when set, the author/committer fields are omitted from the contents-API commit so GitHub attributes it to the token's own account — the <app-slug>[bot] identity a GitHub App workflow needs to satisfy homebrew-core's DCO/CLA policy. Otherwise the resolved name/email (config → local git identity → the anodizer default) author the commit.

Note: signing has no effect here — formula bumps commit through the GitHub contents API, which GitHub signs server-side; the git -c commit.gpgsign path the tap/winget/krew publishers use does not apply.

homebrew_cores:
- commit_author:
use_github_app_token: true
commit_msg_templatestringTemplated commit message (also the PR title). Default: "<formula> <version>" — the message form homebrew-core's CI expects for version bumps.
direct_commitStringOrBoolCommit straight to the base branch instead of opening a pull request. Accepts bool or template string. Only honored for formula repositories you can push to — bumps targeting Homebrew/homebrew-core always go through a fork + PR, because homebrew-core never accepts direct pushes.

A back-compat alias for repository.pull_request.enabled: false, the preferred spelling shared with the tap/scoop/nix publishers — either one selects the direct-commit path (both are still overridden by the always-fork-and-PR rule for Homebrew/homebrew-core).
download_urlstringTemplated download URL written into the formula's url stanza. Defaults to the GitHub source tarball for the release tag: https://github.com/<owner>/<repo>/archive/refs/tags/<tag>.tar.gz (owner/repo derived from the crate's release repository, then the git remote).
idstringUnique identifier for selecting this entry from the CLI (--id=...).
idslist of stringCrate scoping: when set, the formula name default is derived from the first crate named here instead of the workspace's primary crate. The workspace per-crate pattern — one homebrew_cores[] entry per crate, each scoped by ids:.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), this entry is skipped. Render failure hard-errors.
namestringFormula name (templated). Defaults to the scoped crate name (see ids:), then the workspace's primary crate name, then the project name.
pathstringFormula file path inside the repository (templated). Defaults to the homebrew-core sharded layout Formula/<first-letter>/<name>.rb, falling back to the flat Formula/<name>.rb used by most personal taps when the sharded path does not exist.
repositoryRepositoryConfigTarget formula repository. Defaults to Homebrew/homebrew-core. Carries the auth token override (repository.token), the base branch (repository.branch, default: the repo's default branch), and PR settings (repository.pull_request.draft / .body).

homebrew_cores:
- repository: { owner: my-org, name: my-formulas }
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — the bump is a PR that can be re-opened by hand, so a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves the opened pull request in place rather than closing it. Default false.
sha256stringHex SHA-256 of the new download (templated). When unset, anodizer downloads download_url and hashes it — the same behavior as brew bump-formula-pr without --sha256.
skipStringOrBoolSkip this publisher. Accepts bool or template string. Accepts the legacy disable: spelling via serde alias for back-compat.
update_existing_prStringOrBoolWhen truthy, refresh the existing bump PR in place instead of skipping it: a same-version re-cut force-resets the bump branch to the current base and re-commits the rewritten formula, so the open PR carries this run's content rather than a stale earlier attempt (and no duplicate PR is opened). When falsy (default), an already-open bump PR is left untouched and a warning names this toggle. Accepts bool or template string. Mirrors winget / krew / homebrew_cask's update_existing_pr.

install_scripts

curl | sh installer-script configuration.

Drives the install-script stage, which emits a deterministic POSIX install.sh as a release asset. At run time the script detects the host OS + architecture, maps it to the matching release archive, downloads and sha256-verifies it, extracts the binary, and installs it into an install directory (falling back to $HOME/.local/bin when the primary directory is not writable and no sudo is available).

Every field is optional: the repository slug is derived from the git origin remote, the installed binary names from the project name, the per-platform asset names from the release's configured targets (via the same engine SSOT that keeps cargo-binstall pkg_url from 404ing), and the checksums filename and tag prefix from the flagship crate that builds the project binary — so a bare install_scripts: {} produces a fully working installer with no required input.

FieldTypeDefaultDescription
base_urlstringBase URL the script downloads releases from and queries the REST API against (default: https://github.com). Point this at a GitHub Enterprise host to install from a self-hosted GitHub; the script derives the API base as <base_url>/api/v3 for any non-github.com host.
binarieslist of stringBinary names to install out of the extracted archive (default: a single-element list of the project name). Every name is installed, so an archive shipping multiple binaries lands them all.
descriptionstringOne-line description rendered into the script's header banner.
filenamestringOutput filename (default: install.sh).
homepagestringProject homepage URL rendered into the script's header banner.
idstringUnique identifier for this install-script config (default: "default").
install_dirstringDirectory the binary is installed into (default: /usr/local/bin). The generated script falls back to $HOME/.local/bin when this directory is not writable and no sudo is available.
namestringHuman-readable name rendered into the script's header banner (default: the project name).
repostringGitHub owner/name slug the script downloads releases from (default: derived from the git origin remote).
skipStringOrBoolSkip this config. Accepts bool or template string. Accepts the legacy disable: spelling via serde alias for back-compat with imported configs.
verify_checksumboolWhether the script verifies each download's sha256 checksum before installing (default: true). Set false only for repos that publish no checksums file or .sha256 sidecars.

makeselfs

FieldTypeDefaultDescription
archlist of stringTarget architecture filter.
compressionstringCompression algorithm: gzip, bzip2, xz, lzo, compress, or none.
descriptionstringDescription for LSM metadata.
extra_argslist of stringExtra arguments passed to the makeself command.
filenamestringOutput filename template (default includes project, version, os, arch).
fileslist of MakeselfFileAdditional files to include in the archive.
homepagestringHomepage URL for LSM metadata.
idstringUnique identifier for this makeself config (default: "default").
idslist of stringBuild IDs filter: only include artifacts whose id is in this list.
keywordslist of stringKeywords for LSM metadata.
licensestringLicense for LSM metadata.
maintainerstringMaintainer for LSM metadata.
namestringDisplay name embedded in the self-extracting archive.
oslist of stringTarget OS filter (default: ["linux", "darwin"]).
scriptstringStartup script to run when the archive is extracted and executed. Required — the archive will not be created without this.
skipStringOrBoolSkip this config. Accepts bool or template string. Accepts the legacy disable: spelling via serde alias for back-compat with imported configs.

mcp

MCP server registry publisher configuration.

Publishes an apiv0.ServerJSON document to the MCP registry (https://registry.modelcontextprotocol.io/v0/publish by default). MCP config (server details flattened onto the publisher block).

FieldTypeDefaultDescription
authMcpAuth{"type":"none"}Authentication method for the registry's /v0/publish endpoint. Defaults to none (anonymous publish, allowed for development / staging registries).
descriptionstringClear human-readable description of server functionality (max 100 chars).
homepagestringOptional URL to the server's homepage, documentation, or project website. Serialized as websiteUrl in the registry payload.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the MCP publisher is skipped. Render failure hard-errors. The mcp.if: conditional gate.
namestringServer name in reverse-DNS format (e.g. io.github.user/weather). Must contain exactly one forward slash separating namespace from server name. An empty / unset value skips the publisher entirely.
packageslist of McpPackage[]Distribution packages — one entry per package registry (npm, pypi, nuget, oci, mcpb).
registrystringOverride the registry endpoint (for staging or a private mirror). Defaults to https://registry.modelcontextprotocol.io when unset.
repositoryMcpRepository{"url":"","source":"","id":"","subfolder":""}Optional source repository metadata. Emitted as the repository object in the registry payload — omitted entirely when url is empty.
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
skipStringOrBoolSkip this publisher when the expression evaluates truthy. Accepts a bool or a Tera template that renders to "true"/"false" (e.g. "{{ if .IsSnapshot }}true{{ endif }}"). Accepts the legacy disable: spelling via serde alias for back-compat with imported imported configs (the MCP config field MCP.Disable string).
titlestringOptional human-readable title shown in registry UIs (max 100 chars). Templated; supports {{ ProjectName | title }}, {{ Version }}, etc.
transportslist of McpTransport[]Top-level transports list. Intentional config-portability shim: McpConfig carries deny_unknown_fields, so a migrated an imported config containing transports: would fail to parse if the field were absent. The list is accepted and discarded — the current MCP server schema derives transports per-package via packages[].transport, so the top-level list is never read after deserialization and is intentionally not emitted to the registry.

metadata

FieldTypeDefaultDescription
commit_authorCommitAuthorConfigCommit author identity for commit workflows. Reuses the shared CommitAuthorConfig (name + email + optional signing). Exposed as {{ Metadata.CommitAuthor.Name }} / {{ Metadata.CommitAuthor.Email }}.
descriptionstringHuman-readable project description (exposed as {{ Metadata.Description }}).
documentationstringProject documentation URL, e.g. a docs.rs or hosted-docs link (exposed as {{ Metadata.Documentation }}). Derived from Cargo.toml [package].documentation when unset.
full_descriptionContentSourceLong-form project description. Supports inline string, from_file, or from_url. Exposed as {{ Metadata.FullDescription }}. FromUrl is resolved lazily (requires the release stage); FromFile is resolved at context-populate time with template-rendered path.
homepagestringProject homepage URL (exposed as {{ Metadata.Homepage }}).
licensestringProject license identifier, e.g. "MIT" or "Apache-2.0" (exposed as {{ Metadata.License }}).
maintainerslist of stringList of project maintainers (exposed as {{ Metadata.Maintainers }}).
mod_timestampstringGlobal modification timestamp for metadata output files (metadata.json and artifacts.json). Template string (e.g. "{{ CommitTimestamp }}") or unix timestamp. When set, rendered late in the pipeline and applied as file mtime. Exposed as {{ Metadata.ModTimestamp }}.
repositorystringProject source-repository URL, e.g. a GitHub URL (exposed as {{ Metadata.Repository }}). Derived from Cargo.toml [package].repository when unset; feeds the npm package.json repository field, which npm provenance validates against the OIDC-claimed repository.

milestones

FieldTypeDefaultDescription
closeboolClose the milestone on release. Default: false.
fail_on_errorboolFail the pipeline if milestone close fails. Default: false.
name_templatestringMilestone name template (default: "{{ Tag }}").
repoScmRepoConfigRepository owner/name. Auto-detected from git remote if not set.

monorepo

Monorepo configuration.

When configured, tag discovery filters by tag_prefix and the working directory is scoped to dir.

This is DIFFERENT from TagConfig.tag_prefix: - MonorepoConfig.tag_prefix: tags in git already HAVE the prefix (e.g. subproject1/v1.2.3). The prefix is STRIPPED for {{ Tag }} while {{ PrefixedTag }} retains the full tag. - TagConfig.tag_prefix: a prefix to PREPEND when constructing {{ PrefixedTag }} from a plain tag.

When monorepo is configured, it takes precedence over tag.tag_prefix for PrefixedTag / PrefixedPreviousTag behavior.

FieldTypeDefaultDescription
dirstringWorking directory for this subproject.

Used for changelog path filtering (when no explicit changelog.paths or crate.path is configured) and as the default build dir.
tag_prefixstringTag prefix for this subproject (e.g. "subproject1/").

Tags matching this prefix are selected during tag discovery, and the prefix is stripped from {{ Tag }} while {{ PrefixedTag }} retains the full tag.

nightly

FieldTypeDefaultDescription
draftboolOverride release.draft for nightly runs only. None falls through to release.draft; Some(v) overrides it.
keep_single_releaseboolDelete the prior release that points at the same tag before creating the new one. Default: false. Set true to maintain a single rolling nightly release on GitHub.

Back-compat alias for retention: { keep_last: 1 }. When both keep_single_release and retention are set, retention wins. Destructive: deletes a published release via the GitHub Releases API. GitHub-only.
make_latestobjectOverride release.make_latest for nightly runs only. Default: false — a rolling nightly must not displace the newest stable release in the GitHub UI, in releases/latest, or for the install scripts and gh release download invocations that resolve it.

None does not fall through to release.make_latest for the same reason as prerelease: unset there means GitHub's own default, which IS latest.
name_templatestringTemplate for the release name. Default: "{{ ProjectName }}-nightly".
prereleaseboolMark the nightly release as a prerelease. Default: true.

Unlike draft, None does NOT fall through to release.prerelease — that field resolves to false for a nightly (an unset config is false, and prerelease: auto cannot help because the default nightly tag is not a parseable semver tag), so falling through would publish every nightly as a stable release. Set false to opt out.
publish_releaseboolWhether to publish a GitHub Release at all. Default: true. Set false for nightly-only docker pushes / blob uploads.
publish_repostringPublish the nightly release to a DIFFERENT repository than the source repo, in "owner/repo" form (e.g. "nushell/nightly"). Default (None) publishes to the configured release.github repo, unchanged.

When set, the nightly release create, asset upload, AND retention (keep_single_release / retention.keep_last) delete calls all target this repo. The active SCM token is assumed to have write access to publish_repo. GitHub-only (the nushell adoption target).
retentionRetentionConfigRetention policy for nightly releases on GitHub. Generalizes keep_single_release (which is keep_last: 1): keeps the N newest nightly releases matching the nightly tag/name and deletes the rest (releases + the tags anodizer created for them). Operates on publish_repo when set. Default (None): no retention sweep.
tag_namestringTag name used for the nightly release. Default: "nightly". Templates allowed.
version_templatestringTemplate for the rendered version string the nightly run sets on Version / RawVersion. Default: "{{ incpatch(v=Version) }}-{{ ShortCommit }}-nightly" — produces commit-immutable nightly versions (two same-day commits yield two distinct nightly versions).

The {{ NightlyBuild }} template var (a stateless per-base-version build counter derived from git rev-list --count <last-tag>..HEAD) enables nushell-style schemes such as "{{ Base }}-nightly.{{ NightlyBuild }}+{{ ShortCommit }}".

notarize

Top-level notarization configuration supporting both cross-platform (rcodesign) and native macOS (codesign + xcrun notarytool) modes.

FieldTypeDefaultDescription
macoslist of MacOSSignNotarizeConfigCross-platform signing/notarization (rcodesign-based, works on any OS).
macos_nativelist of MacOSNativeSignNotarizeConfigNative signing/notarization (codesign + xcrun, macOS only).
skipStringOrBoolSkip all notarization. Accepts bool or template string.

npms

NPM package registry publisher configuration.

In the default optional-deps mode anodizer emits one thin npm package per built platform (with os/cpu/libc selectors derived from the target triple) plus a metapackage whose optionalDependencies lists every platform package; npm's native resolution installs only the one matching the host. In postinstall mode a single package carries a postinstall script that downloads the matching release archive at npm install time. Each npms[] entry produces one publish.

FieldTypeDefaultDescription
accessstringNPM access level for scoped packages. Accepts "public" / "restricted". Scoped packages on npmjs.org default to restricted unless this is set to public.
amd64_variantAmd64Variantamd64 microarchitecture variant filter (v1 / v2 / v3 / v4). When set, an amd64 artifact is included only when its amd64_variant metadata matches (artifacts without the metadata always pass). Steers which tuned build lands in each platform package. Typed as Amd64Variant, so any value outside v1..v4 is rejected at parse time. Default v1, mirroring the homebrew/winget/krew/nix/aur peers.
arm_variantstringARM version filter (e.g. 6, 7). When set, a 32-bit ARM artifact is included only when its arm_variant metadata matches (artifacts without the metadata always pass). Mirrors the homebrew/winget/krew/nix/aur peers; defaults to 6 when unset.
authNpmAuthModeautoCredential-selection strategy: auto (default) decides per package by probing the registry for the package's existence; token always uses the token; oidc always uses Trusted Publishing with no token fallback. See NpmAuthMode. Absent in existing configs resolves to auto.
authorstringTemplated author field for package.json. Falls back to the project's metadata.maintainers[0], and then to the crate's Cargo.toml [package].authors[0], when unset.
binstringCommand name installed by the metapackage's bin map (optional-deps mode). Falls back to the metapackage basename when unset. Shorthand for a single-command package; superseded by bins when both are set.
binary_versionstringVersion of the native binary the postinstall script downloads, when it differs from the published npm package version. Feeds the {{ Version }} var of the derived (or url_template) download URL, so the npm package can be re-published at a new version while still fetching a pinned binary release. Falls back to the release version when unset. Only consulted in postinstall mode.
binsmapMultiple commands installed by one package, as a map of command name → binary filename to resolve inside the selected per-platform package (optional-deps) or the extracted bin/ directory (postinstall). The package that ships hurl + hurlfmt, for example, sets bins: { hurl: hurl, hurlfmt: hurlfmt } to emit both commands. Each command gets its own launcher shim (<command>.js) and its own entry in the package's bin map. When set, this supersedes the single-command bin: shorthand; when unset, a single command is emitted from bin:.
bugsstringTemplated bug tracker URL. Emitted as bugs.url in package.json.
contributorslist of stringnpm contributors list, emitted verbatim into package.json as contributors (each entry a name or Name <email> (url) string).
descriptionstringTemplated package description. Falls back to the project-level metadata.description when unset.
enginesmapnpm engines constraint map written verbatim into package.json (e.g. { node: ">=18" }). When unset, anodizer emits a sensible default of { node: ">=18" } — the floor every leading native-CLI wrapper (esbuild, biome, swc) declares. Set to an empty map to suppress the field entirely.
extramapFree-form root-level package.json fields. Shallow-merged into the generated package.json (config keys win over generated ones). Useful for mcpName, funding, or other npm metadata fields anodizer does not surface as first-class options.
extra_fileslist of stringAdditional files to include in the published package alongside the generated metadata. Default ["README*", "LICENSE*"] (applied at the Default pass).
fileslist of stringExplicit npm files allowlist written into package.json. When unset, anodizer derives it from what each package actually ships (the per-platform binary, the metapackage shim.js, or the postinstall launcher/script) plus any extra_files basenames. Set to an empty list to suppress the field (npm then falls back to its implicit inclusion rules).
formatstringArchive format the postinstall script downloads (tgz, tar.gz, tar, zip, binary). Default tgz. Only consulted in postinstall mode.
homepagestringTemplated homepage URL. Falls back to metadata.homepage when unset.
idstringUnique identifier for selecting this entry from the CLI (--id=...).
idslist of stringCrate-name filter: only include artifacts whose owning crate_name is in this list. Orthogonal to targets: (both filters apply).
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the NPM publisher entry is skipped. Render failure hard-errors.
keywordslist of stringNPM keywords list.
libc_awarebooltrueIn optional-deps mode, emit separate per-platform packages for linux musl vs glibc (distinguished by the npm libc selector). When false, a single linux package per cpu is emitted with no libc selector. Default true — musl and glibc binaries are not interchangeable, so collapsing them risks installing the wrong one.
licensestringTemplated SPDX license identifier (e.g. MIT, Apache-2.0). Falls back to metadata.license when unset.
manlist of stringnpm man page list, emitted verbatim into package.json as man (a path or array of paths to troff-formatted man pages npm installs).
metapackagestringMetapackage name for optional-deps mode (e.g. biome). This is the package users npm install; it lists every per-platform package under optionalDependencies and ships the bin shim. Falls back to name (or the crate name) when unset.
modeNpmModeoptional-depsBinary-distribution strategy. optional-deps (default) emits npm's native per-platform packages; postinstall emits a download shim.
namestringNPM package name (the metapackage / postinstall package). May be scoped (@org/foo) or unscoped (foo). Falls back to the crate name when unset.
platform_bin_dirstringPer-platform binary subdirectory inside each optional-deps package (e.g. bin). When set, the platform binary lands at <platform_bin_dir>/<binary> rather than the package root, the metapackage shim resolves it at that path, and the package's files allowlist covers it. Required by external shims that hard-code a nested resolve path — for example git-cliff's own wrapper resolves git-cliff-<os>-<arch>/bin/git-cliff, so a skip_metapackage layout must place the binary under bin/. When unset (the default), the binary lands at the package root (<binary>). Ignored in postinstall mode.
platform_name_templatestringOverride the per-platform package naming in optional-deps mode.

The rendered template is the FULL package name for each platform, replacing the default <scope>/<bin>-<os>-<cpu>[-<libc>]. Beyond the standard release context, four platform vars are available per package: NpmOs (npm's os selector: linux/darwin/win32), NpmCpu (x64/arm64/ia32/...), NpmLibc (glibc/musl, empty off-linux), plus anodizer's own Os/Arch target mapping (os windows, not win32). Example: "git-cliff-{{ Os }}-{{ NpmCpu }}" yields git-cliff-linux-x64, git-cliff-darwin-arm64, git-cliff-windows-x64. A rendered name without a leading @ is prefixed with scope when one is set; with this template set, scope is optional and unscoped names are allowed. If the template renders the same name for two platforms (e.g. it omits NpmLibc while libc_aware is true), the publisher fails with a config error naming the colliding packages. The npm os/cpu/libc selector fields inside each package.json always use the npm tokens regardless of this template. Ignored (hard error) in postinstall mode.
provenanceboolnpm publishConfig.provenance flag. When unset, anodizer emits true — the npm supply-chain norm that biome and swc both set, pairing with anodizer's signing story. Set to false to disable.
registrystringOverride the registry endpoint (default https://registry.npmjs.org).
repository_urlstringTemplated repository URL. Emitted as repository.url in package.json with type: git. Falls back to the crate's Cargo.toml [package].repository when unset. Named repository_url to avoid colliding with the {owner, name, token, ...} repository: block every git-based publisher uses; the legacy repository: spelling is accepted via serde alias for back-compat.
requiredboolOverride whether this publisher failing should fail the overall release.

Default: true — NPM is a Manager-group publisher (one-way 72-hour unpublish window), so a failed publish aborts by default to avoid surprising the operator with a half-released version. Set to false to log failures but continue.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
scopestringnpm scope for the per-platform packages emitted in optional-deps mode (e.g. @biomejs). The per-platform packages are named <scope>/<bin>-<os>-<cpu>[-<libc>]. Required for optional-deps mode unless platform_name_template is set (a template can produce unscoped names); ignored in postinstall mode.
shim_envmapEnvironment variables injected into the child process the generated launcher shim spawns (both the optional-deps metapackage shim and the postinstall launcher). Each entry is merged over the inherited process.env before the native binary is exec'd, so a wrapper can set a runtime variable its binary expects (e.g. { BIOME_BINARY_SOURCE: npm }). When unset, the shim spawns with the inherited environment unchanged.
skipStringOrBoolSkip this publisher. Accepts bool or template string. Accepts the legacy disable: spelling via serde alias for back-compat.
skip_metapackageStringOrBoolIn optional-deps mode, emit and publish ONLY the per-platform packages — no metapackage (no optionalDependencies aggregate, no bin shim). Accepts bool or template string, like skip. For projects whose base npm package is hand-written (e.g. a TypeScript library owning the name) while anodizer owns the per-platform binary packages it lists under its own optionalDependencies. Hard error in postinstall mode (there is no metapackage to skip) — but only when it evaluates truthy: skip_metapackage: false (or a template rendering falsey/empty) is inert. Example bool form: skip_metapackage: true. Example templated form: skip_metapackage: "{{ if .Env.EXTERNAL_METAPACKAGE }}true{{ end }}" — skip only when the base package is published elsewhere.
tagstringNPM dist-tag for the publish (default latest). Templated.
targetslist of stringTarget-triple allowlist: restrict the per-platform packages to a subset of the built targets. When unset (the default), every built target that maps to an npm triple becomes a package. When set, only artifacts whose target triple appears in this list are turned into packages; the rest are silently skipped (deliberately out of scope — unlike a target with no npm os/cpu mapping, which is warned about). Orthogonal to ids:: both filters apply (an artifact must pass the ids filter AND, when this is set, be listed here). A listed triple that no selected build produces is a config error, and an explicit empty list (targets: []) is rejected — omit the field to publish every built target. Example: targets: [x86_64-unknown-linux-gnu, aarch64-apple-darwin].
templated_extra_fileslist of NpmTemplatedExtraFileTemplate-rendered file mappings (src may be a glob; rendered contents written to dst).
tokenstringAuth token for the registry. Falls back to the NPM_TOKEN env var when unset. Stored in .npmrc as //<registry>/:_authToken=... at publish time and never passed via argv.
url_templatestringOverride the download URL emitted into the postinstall script (templated). When unset, anodizer derives the URL from the release context. Only consulted in postinstall mode.

on_error

A lifecycle hook block: before:, after:, on_error:, always:, or before_publish:. Each block carries a list of hook commands that run around the entire pipeline (not individual stages); which block a list sits under decides when it fires.

The canonical key is hooks: in every block, matching the conventional spelling. The post: spelling is accepted as a serde alias on hooks for back-compat with the previous anodizer spelling; users with after: { post: [...] } keep working and a deprecation warning is logged when both spellings appear in the same block (see HooksConfig::merge_hook_aliases).

FieldTypeDefaultDescription
hookslist of HookEntryCommands to run when the block fires. The wire format accepts either hooks: (canonical) or the legacy post: spelling; both fold into this field at parse time.
postlist of HookEntryLegacy alias for hooks: (anodizer pre-v0.4). Always None after parsing — merge_hook_aliases collapses it into hooks. Present on the struct only because Deserialize writes through it before the fold step.

partial

FieldTypeDefaultDescription
bystringHow to split builds: "os" (by OS, default) or "target" (by full triple). "os" groups all arch variants for the same OS into one split job. "target" gives each unique target triple its own split job.

The legacy goos spelling is accepted as a back-compat alias for os (folded at parse time, with a deprecation warning); imported configs keep loading.

preflight

Top-level preflight: block.

FieldTypeDefaultDescription
strictboolfalsePromote INDETERMINATE preflight outcomes to hard blockers. An indeterminate outcome is one where a probe could not reach a verdict — a 5xx, a 429 / rate-limit, a transport failure, or a response that hides the permission the publish path needs. By default those degrade to warnings so a transient upstream blip cannot abort a release whose credentials are actually valid; strict: true makes them abort instead (fail-closed). Definitive failures (credentials rejected, target missing) keep their required→blocker / optional→warning severity regardless of this setting. Equivalent to passing the global --strict on every run.

publishers

FieldTypeDefaultDescription
argslist of stringArguments passed to the publish command (supports templates).
artifact_typeslist of stringArtifact type filter: only publish artifacts of these types (e.g., "archive", "binary").
checksumboolInclude checksums in published artifacts.
cmdstringCommand to invoke for publishing.
dirstringWorking directory for the publisher command.
envlist of stringEnvironment variables passed to the publish command.
extra_fileslist of ExtraFileSpecExtra files to include in publishing (glob patterns with optional name override).
idslist of stringBuild IDs filter: only publish artifacts from builds whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the publisher is skipped. Render failure hard-errors. The customization/publishers/ if: field. Distinct from skip: (which expresses "always skip") and provides config-import parity.
metaboolInclude dist/metadata.json in published artifacts. The sibling dist/artifacts.json manifest is never published.
namestringHuman-readable name for this publisher (used in logs).
signatureboolInclude signatures in published artifacts.
skipStringOrBoolTemplate-conditional skip: if rendered result is "true", skip this publisher. Accepts bool or template string (e.g. "{{ if .IsSnapshot }}true{{ endif }}"). Accepts the legacy disable: spelling via serde alias for back-compat.
templated_extra_fileslist of TemplatedExtraFileExtra files whose contents are rendered through the template engine before publishing. Unlike extra_files which copy as-is, template variables like {{ Tag }} are expanded.

pypis

PyPI publisher configuration.

Publishes the project's prebuilt binaries as native Python wheels — one py3-none-<platform> wheel per built target, with the platform tag derived by inspecting each binary (glibc floor for manylinux, Mach-O deployment target for macosx) — and uploads them via PyPI's legacy (twine-protocol) upload API. Optionally also builds and uploads a source distribution via maturin sdist. Each pypis[] entry produces one publish.

pypis:
  - name: my-tool
    requires_python: ">=3.7"
    sdist: true
    sdist_manifest: "pypi/"
FieldTypeDefaultDescription
amd64_variantAmd64Variantx86_64 micro-architecture variant selector — v1 (baseline), v2, v3 (AVX2), or v4. When set, an amd64 binary carrying amd64_variant metadata becomes the win_amd64/manylinux…x86_64 wheel only when its variant matches; a binary with no variant metadata still matches (the baseline build). Default: v1. Typed as Amd64Variant, so any value outside v1..v4 is rejected at parse time.
arm_variantstringARM version selector (e.g. "6", "7"). When set, a 32-bit ARM binary carrying arm_variant metadata becomes the wheel only when its variant matches; a binary with no variant metadata still matches. Does not affect aarch64/arm64 (64-bit ARM has no sub-variant).
authPypiAuthModeautoWhether the upload authenticates with a long-lived API token or with GitHub Actions OIDC (PyPI Trusted Publishing). Default Auto: a token when one is available, otherwise a Trusted-Publishing exchange when an OIDC context is present.

Auto: PypiAuthMode::Auto
authorstringPackage author, emitted as the METADATA Author header.
author_emailstringPackage author email, emitted as the METADATA Author-email header.
classifierslist of stringTrove classifier lines (e.g. "Programming Language :: Rust"), one Classifier: METADATA header each.
descriptionstringTemplated long description written as the METADATA body (rendered on the PyPI project page). Falls back to the summary when unset.
description_content_typestringDescription-Content-Type for the long-description body — how PyPI renders it (text/markdown, text/x-rst, text/plain). When a description is present and this is unset, defaults to text/markdown (the modern norm); without the header PyPI renders the body as raw plaintext. Omitted entirely when there is no description.
homepagestringTemplated homepage URL, emitted as Project-URL: Homepage. Falls back to metadata.homepage (then Cargo.toml [package].homepage) when unset.
idstringUnique identifier for selecting this entry from the CLI (--id=...).
idslist of stringBuild IDs filter: only include binaries whose crate is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the PyPI publisher entry is skipped. Render failure hard-errors.
index_urlstringTemplated twine upload endpoint URL. Default https://upload.pypi.org/legacy/ (the production PyPI upload API). Point it at TestPyPI to rehearse a release:

pypis:
- index_url: "https://test.pypi.org/legacy/"

This is the twine upload target, not a {owner, name} source repository — the name index_url keeps it distinct from the reserved repository meaning every git-based publisher uses. The legacy repository: spelling is still accepted via serde alias.
keywordslist of stringKeywords list, emitted comma-separated in METADATA.
licensestringTemplated license expression (e.g. MIT, Apache-2.0), emitted as the METADATA License field. Falls back to metadata.license (then Cargo.toml [package].license) when unset.
namestringPyPI project name. May use any PEP 508 name form (My.Tool, my_tool); PyPI normalizes it per PEP 503 for index lookups and the wheel filename escapes it per PEP 427. Falls back to the crate name when unset.
platform_tag_overridesmapPer-target-triple wheel platform-tag overrides: <target triple> → explicit wheel platform tag. When a built target has an entry, its tag is used verbatim — binary inspection (the glibc floor for manylinux, the Mach-O deployment target for macosx) is skipped for that target. Every target without an entry keeps the auto-detected tag.

The escape hatch for toolchains whose emitted glibc floor is stricter than the compatibility a project wants to advertise — e.g. pinning aarch64-unknown-linux-gnu to manylinux_2_28 to match a maturin/PyO3 build environment rather than shipping the higher floor the binary's symbols imply.

pypis:
- platform_tag_overrides:
aarch64-unknown-linux-gnu: manylinux_2_28_aarch64
project_urlsmapArbitrary Project-URL label → URL map, one Project-URL: <label>, <url> METADATA header each (the PyPI sidebar links). Emitted in addition to the Homepage link derived from homepage; use this for Repository, Documentation, Changelog, Funding, etc. Rendered in sorted label order for a byte-stable wheel.

pypis:
- project_urls:
Repository: "https://github.com/me/my-tool"
Documentation: "https://docs.example.com"
requiredboolOverride whether this publisher failing should fail the overall release.

Default: true — PyPI is a Manager-group publisher whose uploads are one-way (a published filename can never be re-uploaded, even after deletion), so a failed publish aborts by default to avoid surprising the operator with a half-released version. Set to false to log failures but continue.
requires_pythonstringRequires-Python version specifier written into each wheel's METADATA (e.g. ">=3.7"). Purely declarative for a binary wheel — the shipped executable does not import Python — but pip honors it during resolution. Omitted when unset.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false. (PyPI has no programmatic delete path anyway — rollback is warn-only — but the flag suppresses even that warning.)
sdistboolfalseAlso build and upload a source distribution via maturin sdist. Default false. Requires sdist_manifest to point at the directory containing the project's pyproject.toml, and maturin on PATH.

pypis:
- sdist: true
sdist_manifest: "pypi/"
sdist_manifeststringTemplated directory containing the pyproject.toml that maturin sdist builds from, relative to the project root (e.g. "pypi/"). Required when sdist: true; unused otherwise.
skipStringOrBoolSkip this publisher. Accepts bool or template string. Accepts the legacy disable: spelling via serde alias for back-compat.
skip_existingbooltrueTolerate the index rejecting a file that already exists (the twine --skip-existing semantics). Default true so a re-run of an already-published tag skips previously-uploaded files instead of failing the release. Set to false to make a duplicate upload a hard error.
summarystringTemplated one-line Summary for the package METADATA. Falls back to the project-level metadata.description (and then the crate's Cargo.toml [package].description) when unset.
targetslist of stringTarget-triple allowlist: restrict the wheels to a subset of the built targets. When unset (the default), every built target becomes a wheel. When set, only binaries whose target triple appears in this list are built into wheels; the rest are silently skipped. Orthogonal to ids:: both filters apply (a binary must pass the ids filter AND, when this is set, be listed here). A listed triple that no selected build produces is a config error, and an explicit empty list (targets: []) is rejected — omit the field to publish every built target. A common use is excluding x86_64-pc-windows-gnu so it does not collide with the x86_64-pc-windows-msvc wheel on the shared win_amd64 platform tag. Example: targets: [x86_64-unknown-linux-gnu, x86_64-pc-windows-msvc].
tokenstringAPI token for the upload (templated). Falls back to the PYPI_TOKEN env var, then MATURIN_PYPI_TOKEN, when unset. Sent as HTTP Basic auth with the literal username __token__ and NEVER logged. Unused when auth: oidc (Trusted Publishing mints its own short-lived token).

release

FieldTypeDefaultDescription
discussion_category_namestringGitHub Discussion category name for the release.
draftboolWhen true, create the release as a draft (unpublished).
excludelist of stringGlob patterns matched against each release asset's file name; anodizer drops any asset whose name matches at least one glob before attaching it to THIS GitHub release only (a mirror configured elsewhere is unaffected). Use it to keep heavy sidecars (checksums, signatures, SBOMs) off the GitHub release while archives still attach. Composes with ids: (both filters apply). None/empty keeps everything.

release:
github: { owner: my-org, name: my-repo }
exclude: [".sha256", ".sig", "*.cdx.json"]
extra_fileslist of ExtraFileSpecExtra files to upload to the release beyond build artifacts.

Paths / globs are resolved relative to the project root. .. segments are accepted, so an entry like ../sibling/dist/* will reach outside the project tree — security-conscious users should keep the entries inside the repo or canonicalise them before invoking the release pipeline.
footerContentSourceText appended to the release body (inline string, from_file, or from_url).
giteaScmRepoConfigGitea repository to release to (owner and name).
githubScmRepoConfigGitHub repository to release to (owner and name).
gitlabScmRepoConfigGitLab repository to release to (owner and name).
headerContentSourceText prepended to the release body (inline string, from_file, or from_url).
idslist of stringArtifact IDs filter for uploads. Release-wide artifacts (checksums, source archive, extra files, metadata) always upload regardless of the filter, and derived artifacts (signatures, certificates, SBOMs) inherit the verdict of the artifact they derive from — a signature uploads iff the artifact it signs uploads.
include_metaboolUpload dist/metadata.json as a release asset. The sibling dist/artifacts.json manifest is never uploaded — it stays local to the dist directory.
make_latestobjectMark release as latest: true, false, or "auto" (latest non-prerelease).
modestringRelease mode: "keep-existing", "append", "prepend", or "replace".
name_templatestringRelease title template (supports templates).
on_failureOnFailureConfigIn-process failure policy: what anodizer release does after a release-pipeline failure. hold is the only accepted value, and it describes what the pipeline now does unconditionally — leave everything in place for forensics. Recovery is a re-run (publishers reconcile and self-skip, so an identical command converges on already-published state) or, for deliberate withdrawal, anodizer tag rollback. rollback is rejected at config load (validate_on_failure_not_rollback) — automatic rollback was removed. Because the value drives no branch, nothing reads this field at runtime; it exists so a config carrying the removed policy fails loudly instead of being silently downgraded. Root-level policy — in workspace configs (lockstep or per-crate) the top-level release.on_failure governs the whole run; setting it in a crate-level release: block is rejected at config load (validate_on_failure_root_only).
prereleaseobjectMark release as pre-release: true, false, or "auto" (inferred from tag).
providerForceTokenKindExplicit publish target — the SCM provider whose release.<provider> block the publisher uses. When set, overrides the implicit token-type fallback chain in crate::scm::resolve_token_type.

Use this for cross-platform publishing pattern: source repo on one provider (e.g. GitLab) but releases land on another (e.g. GitHub). Without it, the publish target is inferred from which *_TOKEN env-var is set — fine for single-provider setups but ambiguous when both tokens are available.

release:
provider: github
github:
owner: my-org
name: my-app
replace_existing_artifactsboolWhen true, replace existing release artifacts with the same name.
replace_existing_draftboolWhen true, replace an existing draft release instead of failing.
requiredboolOverride whether this publisher failing should fail the overall release.

Default: true — a failure here aborts the release. Set to false to log failures but continue.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
skipStringOrBoolSkip the release stage. Accepts bool or template string (e.g. "{{ if IsSnapshot }}true{{ endif }}" for conditional skip). Template strings are supported here. Accepts the legacy disable: spelling via serde alias for back-compat with imported configs (the legacy disable: spelling).
skip_uploadStringOrBoolSkip uploading artifacts: true, false, or "auto" (skip for snapshots). Accepts bool or template string.
tagstringOverride the release tag (template string). When set, this tag is used as the tag_name in the GitHub release API instead of the crate's tag_template. Useful in monorepo setups to strip a tag prefix (e.g. "{{ Tag }}" to publish v1.0.0 instead of myapp/v1.0.0). A cross-platform publishing feature provided for free by anodizer.
target_commitishstringTarget branch or SHA for the release tag.
templated_extra_fileslist of TemplatedExtraFileExtra files whose contents are rendered through the template engine before upload. Unlike extra_files which copy as-is, template variables like {{ Tag }} are expanded.

Same path-traversal caveat as extra_files: .. segments reach outside the project tree.
upload_concurrencyintegerMaximum number of asset-upload requests in flight simultaneously. Applies to asset uploads on every release forge (GitHub, GitLab, Gitea).

GitHub's secondary rate-limit is triggered by burst traffic. Keeping this value low avoids tripping the limit even for releases with many artifacts. Default: 4. Override at runtime with ANODIZER_GITHUB_UPLOAD_CONCURRENCY.
upload_paceHumanDurationMinimum interval between successive asset-upload starts (a humantime string, e.g. "200ms", "1s", "0s"). Applies to asset uploads on every release forge (GitHub, GitLab, Gitea).

This is a proactive pace that smooths the initial burst of upload requests, layered on top of upload_concurrency (the concurrency cap) and the reactive secondary-rate-limit backoff. With the concurrency cap alone, the first N uploads fire in the same instant — exactly the burst pattern that trips GitHub's secondary rate limit. Spacing each upload's start by this interval (with ±20% jitter so concurrent releases don't synchronise) makes the burst far less likely to trip the limit in the first place.

Default: "200ms" — at the default concurrency of 4 this caps the initial start rate at ~5/s, which is below the burst threshold yet adds negligible wall-clock to a normal release (upload time is dominated by transfer, not start-spacing). Set to "0s" to disable pacing entirely (rely on the concurrency cap + reactive backoff). Override at runtime with ANODIZER_GITHUB_UPLOAD_PACE_MS (integer milliseconds; 0 disables).
use_existing_draftboolReuse an existing draft release instead of creating a new one.

retry

User-facing retry configuration block (retry: at config root).

All fields are optional in YAML; missing fields fall back to the defaults (10 attempts, 10s base delay, 5m cap).

FieldTypeDefaultDescription
attemptsinteger10Total attempts (including the first). Default 10. Values < 1 are clamped up to 1 by the policy layer.
delayHumanDuration10sInitial delay before the second attempt. Default 10s. Subsequent delays grow exponentially (delay × 2^(n-2)) up to max_delay.
max_delayHumanDuration5mUpper bound on any individual sleep between attempts. Default 5m. Without this cap, an exponential backoff with delay=10s would stretch attempt 9 to ~42 minutes.
max_elapsedHumanDurationCap on TOTAL retry wall-time across all attempts of a single operation. Retrying stops before a backoff sleep would push elapsed time past this budget, so a long transient storm fails cleanly (with the last error, resumable on an idempotent re-run) instead of running the full attempt ladder. Unset (field default None) resolves to a 15-minute budget (crate::retry::DEFAULT_MAX_ELAPSED); set it to raise or lower that ceiling. A publisher honors this budget by threading crate::context::Context::retry_deadline into its retry ladder; those whose surrounding CI job has a hard timeout should keep it below that timeout.

sboms

FieldTypeDefaultDescription
argslist of stringCommand-line arguments (supports templates and $artifact, $document vars).
artifactsstringWhich artifacts to catalog: "source", "archive", "binary", "package", "diskimage", "installer", "any" (default: "archive").
cmdstringCommand to run for SBOM generation (default: "syft").
documentslist of stringOutput document path templates (supports templates).
envlist of stringEnvironment variables to pass to the command, as KEY=VALUE strings. Order is preserved. Values are template-rendered before being set.
idstringUnique identifier for this SBOM config (default: "default").
idslist of stringFilter by artifact IDs (ignored if artifacts="source").
skipStringOrBoolSkip this SBOM config. Accepts bool or template string. Accepts the legacy disable: spelling via serde alias for back-compat.

schemastore

Top-level schemastore: block. Shared fields here are defaults for every entry in schemas; a per-entry field overrides them (cascade).

FieldTypeDefaultDescription
commit_authorCommitAuthorConfigCommit author for the SchemaStore commit (defaults to git config).
ifstringTera condition; when it renders falsy the publisher is skipped.
repositoryRepositoryConfigFork of SchemaStore/schemastore to push branches to and open the PR from.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
schemaslist of SchemaEntry[]The schema entries to register/refresh.
skipStringOrBoolSkip the whole publisher. Alias: disable.
versionedboolDefault for SchemaEntry::versioned.

signs

FieldTypeDefaultDescription
argslist of stringArguments passed to the signing command (supports templates with ${artifact} and ${signature}).
artifactsstringArtifact types to sign: "all", "archive", "binary", "checksum", "package", "sbom" (default: "none").
authenticodeAuthenticodeConfigAuthenticode (Windows PE/MSI) signing backend. When set, this sign config signs Windows artifacts in place via osslsigncode (Linux/cross) or signtool (Windows) instead of producing a detached cosign/gpg signature. The signing command, argv, timestamp URL, and artifact selector are all derived; supply only the cert (a secret).
certificatestringCertificate file to embed in the signature (Cosign bundle signing).
cmdstringSigning command to invoke (default: "cosign" or "gpg").
envlist of stringEnvironment variables passed to the signing command.
idstringUnique identifier for this sign config.
idslist of stringBuild IDs filter: only sign artifacts from builds whose id is in this list.
ifstringTemplate-conditional: skip this sign config if rendered result is "false" or empty.
outputStringOrBoolCapture and log stdout/stderr of the signing command. Accepts bool or template string (e.g., "{{ IsSnapshot }}").
signaturestringSignature output filename template (supports templates).
stdinstringContent written to the signing command's stdin.
stdin_filestringPath to a file whose content is written to the signing command's stdin.
verifySignVerifyConfigPost-sign verification knobs. Verification is ON by default wherever its inputs are derivable (keyed cosign, keyless cosign on GitHub Actions, gpg); set verify: { enabled: false } to disable, or supply the keyless certificate identity / issuer when they cannot be derived from the environment.

snapshot

FieldTypeDefaultDescription
version_templatestringVersion string template for snapshot builds (e.g., "{{ Commit }}-SNAPSHOT"). Accepts the deprecated name_template: alias (renamed to version_template): a non-empty name_template is folded into version_template. A deprecation warning is emitted at config-load time when the alias is hit (see apply_snapshot_legacy_aliases).

source

FieldTypeDefaultDescription
enabledboolWhen true, generate a source code archive for the release.
fileslist of SourceFileEntry[]Extra files to include in the source archive. Accepts strings (glob patterns) or objects with src/dst/info.
formatstringArchive format for the source tarball: tar.gz, tgz, tar, or zip (default: tar.gz).
name_templatestringFilename template for the source archive (supports templates).
prefix_templatestringPrefix prepended to all paths inside the archive (supports templates). Defaults to name_template value. Use this to set a different prefix than the archive name.

srpms

FieldTypeDefaultDescription
binsmapMap of binary name → install path declared in the spec's %files section. Each entry tells the generated .spec which installed file the package owns. When omitted, each binary produced by the build for this crate defaults to %{_bindir}/<name> (i.e. /usr/bin/<name>, the RPM-idiomatic location for a built binary). Provide this only to override the install path or to declare extra owned paths. Stored as a BTreeMap so the emitted %files section iterates in deterministic key order.
build_hoststringOverride the build host recorded in the RPM header. Useful for reproducible builds where the actual hostname leaks build-env detail.
compressionstringCompression algorithm (gzip, xz, zstd, none).
contentslist of NfpmContentAdditional contents to include in the source RPM. Shares the unified NfpmContent type with nFPM contents; SRPM-style source: / destination: / type: keys are accepted via serde aliases.
descriptionstringPackage description.
docslist of stringDocumentation files to include.
enabledboolEnable source RPM generation. Default: false.
epochstringRPM epoch.
file_name_templatestringOutput filename template.
groupstringRPM group.
licensestringLicense identifier.
license_file_namestringLicense file name to include.
maintainerstringPackage maintainer.
package_namestringPackage name (default: project_name).
packagerstringRPM packager field.
posttransstring%posttrans scriptlet — executed after all packages in the transaction have been installed. Path to a script file.
prefixeslist of stringFilesystem prefixes the package may install to (RPM Prefix: tag). Each entry becomes one Prefix: directive — relocatable RPMs need at least one prefix declared.
prereleasestringPrerelease suffix appended to the version (e.g. rc1, beta2). Prerelease component of the package version.
pretransstring%pretrans scriptlet — executed on the package transaction before any package in the transaction is installed. Path to a script file.
sectionstringRPM section.
signatureNfpmSignatureConfigRPM signature configuration. Shares the unified NfpmSignatureConfig type with nFPM.
skipStringOrBoolSkip this config. Accepts bool or template string.
spec_filestringPath to the RPM spec file template.
summarystringSummary line.
urlstringHomepage URL.
vendorstringPackage vendor.
version_metadatastringBuild metadata appended to the version (e.g. git commit hash). Version-metadata component of the package version.

tag

FieldTypeDefaultDescription
branch_historystringBranch history mode for determining the previous tag: "full" or "last".
bump_minor_pre_majorboolWhile the current major version is 0, demote a conventional breaking change (feat!: / BREAKING CHANGE) from a major bump to a minor bump (e.g. 0.5.00.6.0 instead of 1.0.0). Honors the SemVer rule that anything may change in the 0.y.z range. An explicit #major/#minor token, a custom_tag, or a manually-ahead Cargo.toml version always wins over this demotion. No-op once a real tag reaches 1.x. Default false.
bump_patch_for_minor_pre_majorboolWhile the current major version is 0, demote a conventional feature (feat:) from a minor bump to a patch bump (e.g. 0.5.00.5.1 instead of 0.6.0). Independent of bump_minor_pre_major. An explicit token / custom_tag / ahead Cargo.toml always wins. No-op at 1.x. Default false.
custom_tagstringCustom version tag to use instead of auto-incrementing.
default_bumpstringDefault bump when a commit range carries no explicit # token and no conventional-commit marker: "major", "minor", "patch", or "none". Defaults to "none" — a range of only chore/docs/style/refactor/test/ build/ci commits produces no release (the conventional-commit contract). Set "patch"/"minor" to cut a release on every range regardless of type.
force_without_changesboolWhen true, create a new tag even if no commits have changed since the last tag.
force_without_changes_preboolLike force_without_changes but only for pre-release versions.
git_api_taggingboolWhen true, use the GitHub/GitLab API for tagging instead of git CLI.

Mutually exclusive with sign on a pushed tag: the API mints the tag object server-side and cannot apply your local GPG/SSH signature, so anodizer errors rather than shipping a silently-unsigned tag. Use local tagging (drop git_api_tagging) to create signed tags.
initial_versionstringVersion string to use when no previous tag exists (default: "0.1.0").
major_string_tokenstringConventional commit token triggering a major bump (default: "major").
minor_string_tokenstringConventional commit token triggering a minor bump (default: "minor" or "feat").
none_string_tokenstringConventional commit token suppressing a version bump entirely (default: "none").
patch_string_tokenstringConventional commit token triggering a patch bump (default: "patch" or "fix").
prereleaseboolWhen true, apply a pre-release suffix to the generated version.
prerelease_suffixstringSuffix appended to pre-release versions (e.g., "beta").
pushboolWhen true, anodizer tag also pushes the version-sync bump commit to the release branch (atomically with the tag), not just the tag. CLI --push / --no-push override this. Default false preserves the "push the tag, inspect the branch locally before pushing" workflow.
release_brancheslist of stringBranch name patterns (supports wildcards) that trigger releases (default: ["master", "main"]).
signboolWhen true, anodizer creates the version tag with git tag -s (a cryptographically signed annotated tag) instead of the default git tag -a (unsigned annotated tag). The signing key and method are taken entirely from the user's git configuration (user.signingkey, and gpg.format to select GPG vs SSH signing) — anodizer adds no key field of its own, so both GPG and SSH signing work with no anodizer-specific setup. Applies in every workspace mode: single-crate, lockstep, and per-crate — every tag anodizer cuts is signed when this is enabled. The CLI --sign / --no-sign flags override this per invocation. Default (unset or false) leaves the existing unsigned annotated-tag behavior unchanged.

Mutually exclusive with git_api_tagging on a pushed tag: the GitHub API creates the tag object on the remote and cannot apply a local signature, so combining the two on a push is a hard error. Signing works with local tagging and with --push-tags-only (both cut the tag locally first).
skip_ci_on_bumpboolAppend [skip ci] to the version-sync bump commit subject.

Off by default. Only enable with a workflow_run-triggered release workflow: [skip ci] on the bump commit (which becomes the tag target) ALSO suppresses an on: push: tags: release trigger, so enabling this with a tag-push-triggered release silently skips the release. Leave off for the tag-push pattern; enable for the workflow_run pattern to skip the (already crate-gated, harmless) redundant CI re-run.
tag_contextstringSource for determining the previous tag: "repo" (default) or "branch".
tag_post_hookslist of HookEntryCommands to run after anodizer tag successfully creates the tag (and, when a push was requested, pushes it). Env and template vars same as tag_pre_hooks.
tag_pre_hookslist of HookEntryCommands to run before anodizer tag creates the tag. Useful for updating lockfiles or committing sibling changes that must be part of the tagged commit. Env: ANODIZER_CURRENT_TAG, ANODIZER_PREVIOUS_TAG are set; template vars {{ Tag }}, {{ PreviousTag }}, {{ Version }}, {{ PrefixedTag }} are available.
tag_prefixstringPrefix prepended to version tags (e.g., "v" produces "v1.2.3").
verboseboolWhen true, print verbose tag calculation output.

template_files

Configuration for a template file that is rendered through the template engine and placed in the dist directory as a release artifact.

All rendered template files are uploaded to the release by default. Both src and dst paths support template rendering.

FieldTypeDefaultDescription
dststringDestination filename, prefixed with the dist directory. Templates: allowed.
idstringIdentifier for this template file entry (default: "default").
modestringFile permissions in octal notation as a string, e.g. "0755" (default: "0655"). Parsed at runtime via parse_octal_mode() to avoid YAML interpreting as decimal.
skipStringOrBoolSkip this entry when truthy. Accepts a literal bool or a Tera template that renders to "true"/"false" (e.g. '{{ if eq .Os "windows" }}true{{ end }}'). Mirrors the per-entry skip: pattern used by ChangelogConfig, ChecksumConfig, and the publishers.
srcstringSource template file path. The file contents are rendered through the template engine. Templates: allowed (in path itself).

uploads

FieldTypeDefaultDescription
checksumboolInclude checksums in uploaded artifacts.
checksum_headerstringHeader name for the SHA256 checksum of the artifact.
client_x509_certstringPath to PEM-encoded client X.509 certificate for mTLS.
client_x509_keystringPath to PEM-encoded client X.509 key for mTLS.
custom_artifact_nameboolWhen true, use the artifact name as-is (don't append to target URL).
custom_headersmapCustom HTTP headers (each value is template-expanded).
excludelist of stringGlob patterns matched against each artifact's file name; anodizer drops any artifact whose name matches at least one glob from THIS upload target only. Use it to keep heavy sidecars (checksums, signatures, SBOMs) off a given endpoint while archives still upload. Composes with ids: and exts: (all filters apply). None/empty keeps everything.

uploads:
- name: mirror
target: "https://mirror.example.com/{{ .ArtifactName }}"
exclude: [".sha256", ".sig", "*.cdx.json"]
extra_fileslist of ExtraFileSpecExtra files to include in uploading.
extra_files_onlyboolUpload only extra files, skip normal artifacts.
extslist of stringFile extension filter: only upload artifacts with these extensions.
idslist of stringBuild IDs filter: only upload artifacts whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the upload is skipped. Render failure hard-errors. The uploads[].if: conditional gate.
metaboolInclude dist/metadata.json in uploaded artifacts. The sibling dist/artifacts.json manifest is never uploaded.
methodstringHTTP method: PUT or POST (default: PUT).
modestringUpload mode: "archive" (default) or "binary".
namestringHuman-readable name for this upload config.
overwriteboolRe-upload an artifact even when an identical one already exists at the target path (default: false).

With the default, a re-run that finds the same version's artifact already uploaded with a matching SHA-256 records an idempotent SKIP rather than re-PUTting it — so re-running a partially-failed release is safe. A path that already holds a different artifact for the same version still hard-errors (immutable-version drift) unless overwrite is set. With overwrite: true, every artifact is PUT unconditionally.
passwordstringPassword for HTTP basic auth.

Strongly prefer {{ Env.UPLOAD_PASSWORD }} (or any other env-var template) over an in-config literal — plaintext values here are NOT redacted from dry-run output and will land in dist/config.yaml when the pipeline runs with --dry-run / --snapshot. Resolution order: rendered password template → env UPLOAD_{NAME}_SECRET. Password-resolution cascade.
requiredboolOverride whether this upload failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this upload's artifacts in place rather than issuing a server-side DELETE. Default false.
signatureboolInclude signatures in uploaded artifacts.
skipStringOrBoolSkip condition template (if rendered to "true", skip this upload).
targetstringTarget URL template (supports template variables like {{ ProjectName }}, {{ Version }}).
trusted_certificatesstringPath to PEM-encoded trusted CA certificates.
usernamestringUsername for HTTP basic auth. Resolution order: rendered username template → env UPLOAD_{NAME}_USERNAME. Set this to a literal value or a {{ Env.X }} template.

upx

FieldTypeDefaultDescription
argslist of string[]Extra arguments passed to UPX (e.g., ["-9", "--brute"]).
binarystringupxUPX executable path or name (default: "upx").
bruteboolUse brute-force compression (--brute flag). Very slow but produces smallest output.
compressstringUPX compression level string (e.g., "1"-"9", "best"). Maps to --compress flag.
enabledStringOrBoolWhether to compress binaries with UPX. Accepts a bool or a template string that evaluates to a bool.
idstringUnique identifier for this UPX config.
idslist of stringBuild IDs filter: only compress binaries from builds whose id is in this list.
lzmaboolUse LZMA compression (--lzma flag).
requiredboolfalseWhen true, fail the build if UPX is not found.
targetslist of stringTarget triples to compress binaries for (empty means all targets).

verify_release

Top-level verify_release: block.

See the module-level docs for the verification lifecycle. The gate is a no-op unless enabled: true.

FieldTypeDefaultDescription
assert_assetsbooltrueAssert that every produced artifact has a matching uploaded asset on the published release, and that every signature / certificate / SBOM asset the resolved signs: / sboms: config demands exists there too (derived from config + the artifact set, so a sign or SBOM stage that silently produced nothing still fails the gate with the exact missing names; intentional skips — if: falsy, skip: truthy, --skip=sign — create no expectations). Default true (no extra config: anodizer already knows the produced set and can fetch the release's asset list). Independent of Docker and the network smoke-test.
assert_landingbooltrueAssert that every publisher that succeeded this run actually LANDED: each published crate version is visible on the crates.io sparse index, each npm package version is visible on its registry, each uploaded blob object exists in its bucket, and each uploaded snap is live in the Snap Store's channel map (catching a manual-review hold that parked the revision outside every channel). Default true (no extra config: the run's own publish report already carries every coordinate the probes need). Publishers that did not run — or did not succeed — are skipped.
enabledboolfalseWhether to run the post-release verification gate at all. Default false — the gate is opt-in because it needs the published release to already exist (it runs after publish) and, for install-smoke, a Docker daemon.
glibc_ceilingstringglibc version ceiling, e.g. "2.36". When any glibc-linked .deb requires a glibc NEWER than this floor, the gate reports it and exits non-zero. None (the default) disables the libc check entirely. musl binaries have no glibc requirement and are skipped.
install_smokeInstallSmokeConfigPer-package install smoke-test images. When None, smoke-testing is off. When present, each package type that produced an artifact is installed in its (configured or default) container and <bin> --version is run.

workspaces

A workspace represents an independent project root within a monorepo. Each workspace has its own crates, changelog, and release configuration, allowing independently-versioned components that aren't Cargo workspace members.

FieldTypeDefaultDescription
afterHooksConfigHooks run after this workspace's pipeline completes.
beforeHooksConfigHooks run before this workspace's pipeline starts.
binary_signslist of SignConfig[]Binary-specific signing configs (same shape as signs but only for binary artifacts). The artifacts field on each entry is constrained at parse time to binary / none (or omitted) — a broader filter on binary_signs would silently match nothing because the loop only iterates Binary artifacts. Constraint lives in deserialize_binary_signs.
changelogChangelogConfigChangelog configuration for this workspace.
crateslist of CrateConfig[]Crates belonging to this workspace.
envlist of stringEnvironment variables scoped to this workspace.

List of KEY=VALUE strings. Order is preserved. Values are template-rendered at pipeline startup.
namestringWorkspace identifier used in logs and template variables.
signslist of SignConfig[]Signing configurations for binaries, archives, and checksums.
skiplist of string[]Pipeline stages to skip when releasing this workspace. Stage names match the CLI --skip flag (e.g., announce, publish).

crates[].dockers_v2

Docker V2 configuration — the canonical Docker build API.

Notable surface: - images + tags (cleaner separation than a single image_templates list) - annotations map for OCI annotations (--annotation) - build_args map for build-time variables - skip as a StringOrBool template for conditional opt-out - sbom as a StringOrBool — when truthy, adds --sbom=true to buildx - flags for arbitrary extra docker build flags - platforms is the only target selector — no per-arch field overrides

FieldTypeDefaultDescription
annotationsmapOCI annotations to apply via --annotation key=value flags.
build_argsmapBuild arguments passed as --build-arg KEY=VALUE.

Each value is template-expanded and forwarded verbatim to buildx (one argv token per pair, no shell tokenization). Prefer {{ Env.VAR }} over raw user-config strings for secrets — buildx records build-args in image history by default, so plaintext values here propagate into the image metadata.
dockerfilestringPath to the Dockerfile relative to the project root.
extra_fileslist of stringExtra files to copy into the Docker build context.
flagslist of stringArbitrary extra flags passed to the docker build command.
hooksBuildHooksConfigPre/post hooks for this dockers_v2 config. Each hook accepts the same cmd/dir/env/output shape as build/archive hooks. pre hooks run after the staging directory is prepared but before docker buildx build; post hooks run after the image digest is captured. Hook commands, working directories, and env values are template-expanded; in addition to the standard template surface, hooks see:

- {{ Images }} — list of image:tag references for this build. Iterate via {% for img in Images %}{{ img }}{% endfor %} to mirror a list exposure of the same field; {{ Images | join(sep=",") }} reproduces a flat comma-separated string for legacy templates. - {{ Dockerfile }} — path to the rendered Dockerfile - {{ ContextDir }} — path to the buildx context staging directory - {{ Digest }} — image manifest digest (post hooks only) - {{ BaseImage }} / {{ BaseImageDigest }} — final-stage base image (the BaseImage / BaseImageDigest overlay)
idstringUnique identifier for this Docker V2 config.
idslist of stringBuild IDs filter: only include binary artifacts whose metadata id is in this list.
imageslist of string[]Base image names (e.g., ["ghcr.io/owner/app"]). Combined with tags to form full references.
labelsmapOCI labels to apply to the image via --label key=value flags.
oci_labelsStringOrBoolAuto-inject the standard predefined org.opencontainers.image.* labels (created, source, revision, version, title, description, licenses, url, documentation, vendor), derived from project/git/Cargo context. Default ON; set oci_labels: false to opt out. Each auto-label is emitted only when its value is derivable, and any key the user also supplies in labels: wins (the auto value never clobbers an explicit user label). created is derived from SOURCE_DATE_EPOCH for byte-reproducibility (never wall-clock) and is omitted when no reproducible source date is resolvable.
platformslist of stringTarget platforms for multi-arch builds (e.g., ["linux/amd64", "linux/arm64"]).
retryDockerRetryConfigRetry configuration for docker push operations.
sbomStringOrBoolWhen truthy, adds --sbom=true to buildx. Supports templates.
skipStringOrBoolWhen truthy, skip this docker build entirely. Supports templates. Accepts the legacy disable: spelling via serde alias for back-compat.
tagslist of string[]Tag suffixes (e.g., ["latest", "{{ Version }}"]). Each image is tagged with each tag.
usestringDocker backend for build commands: "buildx" (default) or "podman".

The default "buildx" invokes docker buildx build with the full set of BuildKit features (multi-platform, attestations, --rewrite-timestamp, SBOM, OCI exporter). Setting use: podman swaps the binary to podman build and disables every buildx-only flag — anodizer rejects configs that mix use: podman with sbom: true, --rewrite-timestamp, --provenance, --attest, --cache-from, --cache-to, --output, or --sbom because plain podman does not recognise them.

Linux-only. The podman backend is restricted to Linux hosts. Configs setting use: podman on macOS or Windows fail at config-validation time with a clear error rather than blowing up later when podman is not on PATH.

crates[].docker_manifests

Deprecated: prefer dockers_v2 (which produces multi-arch manifests via the platforms: field automatically). DockerManifestConfig is retained for back-compat with imported configs and for the niche case of stitching together manifest lists from images that were not built by dockers_v2 in the same run.

The v1 docker / docker manifest pipes deprecated in favour of the v2 buildx flow. The rustdoc here is the load-bearing surface for the deprecation: it flows into the schemars-generated JSON Schema (consumed by IDEs / editor tooling) and rustdoc HTML, both of which are how downstream config authors discover that the v2 pipe is the preferred entry point.

FieldTypeDefaultDescription
create_flagslist of stringExtra flags for docker manifest create.
idstringUnique identifier for this manifest config.
image_templateslist of string[]Image references to include in the manifest.
name_templatestringTemplate for the manifest name, e.g. "ghcr.io/owner/app:{{ Version }}".
push_flagslist of stringExtra flags for docker manifest push.
retryDockerRetryConfigRetry configuration for manifest push (handles transient registry errors).
skip_pushobjectSkip push: true, false, or "auto" (skip for prereleases).
usestringDocker backend for manifest commands: "docker" (default) or "podman". The "podman" backend is Linux-only (per Pro): configs on macOS or Windows fail at config-validation time with a clear error rather than blowing up later when podman is not on PATH.

crates[].docker_digest

Controls docker image digest file creation.

After each docker image push, a digest file (containing the sha256 digest) is written to the dist directory. This config controls whether that happens and how the files are named.

FieldTypeDefaultDescription
name_templatestringTemplate for the digest artifact filename. Default: tag-based naming (e.g., "ghcr.io_owner_app_v1.0.0.digest").
skipStringOrBoolWhen truthy, disable docker digest artifact creation. Accepts the legacy disable: spelling via serde alias for back-compat.

crates[].nfpms

FieldTypeDefaultDescription
amd64_variantlist of Amd64Variantamd64 microarchitecture variant filter (["v1"], ["v2", "v3"], etc.), set via the amd64_variant: key. When set, only amd64 binaries with amd64_variant matching one of the listed values are included. The legacy goamd64: spelling is accepted via serde alias for back-compat with imported configs. When unset, all amd64 variants are included (no filtering). Each entry is typed as Amd64Variant, so any value outside v1..v4 is rejected when the config is parsed.
apkNfpmApkConfigAPK-specific configuration.
archlinuxNfpmArchlinuxConfigArchlinux-specific configuration.
bin_aliasstringRename the installed binary inside the package only.

When set, the auto-emitted binary content entry is installed under this name (in bindir) instead of the built file's name; the archive/build output is untouched. Use this to resolve Debian/RPM name clashes — e.g. fd ships its binary as fdfind in the Debian package while the tarball keeps fd. Templated.
bindirstringInstallation directory for binaries (default: /usr/bin).
changelogstringPath to a YAML-format changelog file for deb/rpm packages.
conflictslist of stringPackages this package conflicts with.
contentslist of NfpmContentFiles to include in the package beyond the main binary.
debNfpmDebConfigDeb-specific configuration.
dependenciesmapRuntime package dependencies keyed by format (e.g., {"deb": ["libc6"], "rpm": ["glibc"]}).
descriptionstringPackage description (multiline supported).
epochstringPackage epoch for versioning (integer as string).
file_name_templatestringPackage filename template (supports templates).
formatslist of string[]Package formats to produce: deb, rpm, apk, archlinux, termux.deb, ipk, msix (at least one required).
homepagestringProject homepage URL.
idstringUnique identifier for cross-referencing this nFPM config.
idslist of stringBuild IDs filter: only include artifacts from builds whose id is in this list. Accepts the deprecated builds: spelling via serde alias for back-compat with imported configs (the legacy builds key marked deprecated, aliasing ids).
ifstringTemplate-conditional: skip this nfpm config if rendered result is "false" or empty. Conditional-skip gate.
ipkNfpmIpkConfigIPK-specific configuration (OpenWrt packages).
libdirsNfpmLibdirsCGo library installation directories (header, carchive, cshared).
licensestringSPDX license identifier (e.g., "MIT", "Apache-2.0").
maintainerstringPackage maintainer in Name <email> format.
metaboolWhether this is a meta-package (no files, only dependencies).
msixNfpmMsixConfigMSIX-specific configuration (Windows app packages).

Only consumed when formats includes msix. nfpm requires publisher, properties.logo, and at least one applications entry; everything else has derived defaults.

msix:
publisher: "CN=My Company, O=My Company, C=US"
properties:
logo: assets/logo.png
applications:
- id: MyApp
executable: myapp.exe
mtimestringDefault modification time for files in the package.
overridesmapPer-format setting overrides (e.g., {"deb": {compression: "xz"}}).
package_namestringPackage name (defaults to crate name).
prereleasestringPrerelease version suffix.
prioritystringPackage priority (e.g. "optional", "required").
provideslist of stringVirtual packages provided by this package.
recommendslist of stringPackages recommended (soft dependency) by this package.
releasestringPackage release number.
replaceslist of stringPackages this package replaces (for upgrade paths from old package names).
rpmNfpmRpmConfigRPM-specific configuration.
scriptsNfpmScriptsPackage lifecycle scripts (preinstall, postinstall, preremove, postremove).
sectionstringPackage section (e.g. "utils", "devel").
suggestslist of stringPackages suggested (weaker than recommends) by this package.
templated_contentslist of NfpmContentExtra file contents whose source files are Tera-rendered before packaging. Each entry mirrors contents; the difference is that at stage time the file at src is read, rendered through the template engine, written to a temp file, and then included in the package at dst using the temp file as the real source. Useful for shipping config files with templated values (version, commit, maintainer, etc.).
templated_scriptsNfpmScriptsLifecycle scripts whose script-file bodies are Tera-rendered before packaging Each path is read, rendered through the template engine, written to a temp file, and used as the real script. If a field is set on both scripts and templated_scripts, the templated version wins.
umaskintegerFile permission umask. Accepts a YAML int (18), an octal-prefixed string ("0o022"), or a leading-zero octal string ("022").
vendorstringPackage vendor name — the distributing entity recorded in the rpm/deb Vendor field. When unset, derived from the crate's first Cargo.toml [package].authors entry with any <email> suffix stripped (e.g. "Ada Lovelace <ada@x>""Ada Lovelace").
version_metadatastringVersion metadata (e.g. git commit hash).

crates[].publish

FieldTypeDefaultDescription
aurAurConfigAUR (Arch User Repository) binary package publishing configuration.
aur_sourceAurSourceConfigAUR source package publishing configuration (source-only PKGBUILD, not -bin).
cargoCargoPublishConfigPublish to crates.io. Presence opts in; use cargo: { skip: true } to opt out.
chocolateyChocolateyConfigChocolatey package publishing configuration.
homebrewHomebrewConfigHomebrew formula publishing configuration.
homebrew_caskHomebrewCaskConfigHomebrew Cask publishing configuration (macOS .app bundles).

Uses the unified HomebrewCaskConfig which carries all fields from both the per-crate cask config and the top-level homebrew_casks: config.
krewKrewConfigKrew (kubectl plugin manager) manifest publishing configuration.
nixNixConfigNix derivation publishing configuration.
on_errorlist of HookEntryHooks that fire once per FAILED publisher. Each entry is a standard hook (cmd / dir / env / output); the template surface adds {{ .Publisher }}, {{ .Error }}, {{ .Version }}, {{ .Tag }}, {{ .Group }} (Assets/Manager/Submitter), {{ .Required }}, {{ .RolledBack }} — always false during a release, which never withdraws anything on its own; withdrawal is anodizer tag rollback — and {{ .RunReport }}, the path of this run's already-written dist/run-<id>/report.json (per-publisher outcomes including rollback results; empty in snapshot/dry-run or when the report could not be persisted). The same values are also exported to the hook process as environment variables: ANODIZER_PUBLISHER, ANODIZER_ERROR, ANODIZER_VERSION, ANODIZER_TAG, ANODIZER_GROUP, ANODIZER_REQUIRED, ANODIZER_ROLLED_BACK, ANODIZER_RUN_REPORT. A hook's own failure is logged as a warning and never changes the release outcome.

Security: the rendered cmd string is parsed by sh -c, and {{ .Error }} carries untrusted remote text (HTTP error bodies, git stderr) — interpolating it into cmd lets crafted error content break quoting and execute. Read untrusted values from the env vars instead ($ANODIZER_ERROR), and pass anodizer notify --raw so the text is sent literally rather than Tera-rendered. The outbound notification body is secret-redacted by default, so a secret reference smuggled into the error body is masked (sent as $NAME) even without --raw; --raw stays recommended because it avoids re-rendering already-final text and keeps untrusted content out of the shell-parsed cmd string:

publish:
on_error:
- cmd: 'anodizer notify --raw "anodizer: $ANODIZER_PUBLISHER failed @ $ANODIZER_VERSION: $ANODIZER_ERROR"'
on_rollbacklist of HookEntryHooks that fire once per publisher anodizer tag rollback REVERTED — including a publisher that itself Succeeded and is being withdrawn because the whole release is (the case on_error, which fires solely for a failed publisher, never reaches). A publisher whose rollback was attempted but could not complete fires this too, with {{ .RollbackFailed }} set to true so the hook can escalate the orphaned-artifact case. Each entry is a standard hook (cmd / dir / env / output); the template surface adds {{ .Publisher }}, {{ .Version }}, {{ .Tag }}, {{ .Group }} (Assets/Manager/Submitter), {{ .Required }}, {{ .RollbackFailed }} (true when the revert itself failed), {{ .Error }} (the rollback failure message, empty on a clean revert), and {{ .Reason }} (the trigger cause, distinct from {{ .Error }} — empty here, because the unwind replays state a prior process persisted). The same values are exported to the hook process as ANODIZER_PUBLISHER, ANODIZER_VERSION, ANODIZER_TAG, ANODIZER_GROUP, ANODIZER_REQUIRED, ANODIZER_ROLLBACK_FAILED, ANODIZER_ERROR, and ANODIZER_ROLLBACK_REASON. A hook's own failure is logged as a warning and never changes the release outcome or aborts the remaining rollbacks. It is independent of on_error: a publisher that both failed and was rolled back fires both.

publish:
on_rollback:
- cmd: 'anodizer notify --raw "anodizer: $ANODIZER_PUBLISHER reverted @ $ANODIZER_VERSION (rollback_failed=$ANODIZER_ROLLBACK_FAILED)"'
scoopScoopConfigScoop manifest publishing configuration.
wingetWingetConfigWinGet manifest publishing configuration.

crates[].publish.cargo

cargo publish flag surface.

Presence under publish: opts the crate in; use skip: true (or a truthy template) to opt out. There is no enabled field — presence is the on-switch.

Fields intentionally omitted because anodizer owns them: - --package / --workspace / --exclude: the top-level crates[] axis owns crate selection. - --dry-run: pipeline-level CLI ergonomics (anodizer release --dry-run). - -v / -q / --color: CLI ergonomics, not config. - --config / -Z: cargo CLI escape hatches; out of scope.

FieldTypeDefaultDescription
all_featuresboolActivate every feature, including default (--all-features).
allow_dirtyboolAllow publishing with an uncommitted working tree (--allow-dirty).
authCargoAuthModeWhether the publish authenticates with a long-lived API token (CARGO_REGISTRY_TOKEN) or with GitHub Actions OIDC (crates.io Trusted Publishing). Default Auto: a token when one is present, otherwise a Trusted-Publishing exchange when an OIDC context is available.

oidc mints a short-lived crates.io token from a GitHub Actions id-token — no stored CARGO_REGISTRY_TOKEN is needed — and revokes it after the publish loop. The mint is workspace-scoped: one token authorizes every crate whose Trusted-Publisher config matches this repository/workflow, so a lockstep workspace mints once and reuses it for all crates.

When omitted, resolves to Auto. Optional (rather than a bare enum with #[serde(default)]) so a defaults.publish.cargo.auth value is inherited by a per-crate publish.cargo block that omits auth: a bare enum always serializes to a concrete value, and the defaults deep-merge (fill-by-missing-key) never overwrites a present scalar, so a strict oidc default would silently degrade to auto. Read through CargoPublishConfig::resolved_auth so every call site agrees on the NoneAuto collapse.

Auto: CargoAuthMode::Auto
featureslist of stringCrate features to activate (--features).
frozenboolBoth --locked and --offline (--frozen).
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the cargo publisher is skipped. Render failure hard-errors. Config key: the publisher's if:.
indexstringRegistry index URL (--index).
index_timeoutintegerSeconds to wait for the crates.io sparse index to publish a crate before its dependents are pushed (anodizer-original — no cargo publish equivalent).
jobsintegerNumber of parallel compile jobs for verification (--jobs).
keep_goingboolContinue on errors when verifying multiple crates (--keep-going).
lockedboolRequire an up-to-date Cargo.lock matching the resolver (--locked).
manifest_pathstringPath to the crate's Cargo.toml (--manifest-path).
no_default_featuresboolDisable the default feature set (--no-default-features).
no_verifyboolSkip the local cargo build --release verification step (--no-verify).
offlineboolRequire offline resolution; never hit the network (--offline).
registrystringAlternate registry name from ~/.cargo/config.toml (--registry).
requiredboolOverride whether this publisher failing should fail the overall release.

Default: true — a failure here aborts the release. Set to false to log failures but continue.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
skipStringOrBoolSkip this publisher; supports template strings or bool. Truthy renders disable the publisher without removing the block.
targetstringBuild target triple for the verification step (--target).
target_dirstringOverride the cargo target directory (--target-dir).
wait_for_workspace_depsWaitForWorkspaceDepsConfigPre-publish gate that polls crates.io for every workspace-internal dep of the crate being published, blocking until each is queryable at its expected version. Required for multi-tag-multi-crate workspaces (e.g. cfgd) where per-crate tags fire independent Release.yml runs that would otherwise race the sparse-index propagation.

Single-crate workspaces and lockstep-bumped monorepos (anodizer itself) leave this off — there is no inter-tag race to gate on.

crates[].publish.homebrew

FieldTypeDefaultDescription
amd64_variantAmd64Variantamd64 microarchitecture variant filter (v1 / v2 / v3 / v4). Only artifacts matching this variant are included. Default: v1. Typed as Amd64Variant, so any value outside v1..v4 is rejected when the config is parsed.
arm_variantstringARM version filter (e.g. "6", "7"). Only artifacts matching this variant are included.
caskHomebrewCaskConfigHomebrew Cask configuration (macOS .app bundles).
caveatsstringPost-install user-facing notes shown by brew info.
commit_authorCommitAuthorConfigCommit author with optional signing.
commit_msg_templatestringCustom commit message template. Rendered via Tera with the standard release template variables (ProjectName, Tag, Version, etc.). Default: "Brew formula update for {{ ProjectName }} version {{ Tag }}" (set in crates/stage-publish/src/homebrew/commit_msg.rs).
completionsHomebrewCaskCompletionsPrebuilt shell-completion file paths to install. When set, the formula emits bash_completion.install "<path>" / zsh_completion.install / fish_completion.install in its install block — the form used when the archive ships ready-made completion files.
conflictslist of HomebrewConflictConflicting formula names with optional reason.
custom_blockstringCustom Ruby code block inserted into the formula class body.
custom_requirestringRuby require statement for custom download strategies.
dependencieslist of HomebrewDependencyPackage dependencies (e.g. openssl, libgit2).
descriptionstringShort description of the formula (shown in brew info).
directorystringFormula directory in the tap (e.g. "Formula").
download_strategystringCustom download strategy class name (e.g. :using => GitHubPrivateRepositoryReleaseDownloadStrategy).
extra_installstringAdditional install commands appended after the main install block.
generate_completions_from_executableHomebrewCaskGeneratedCompletionsGenerate completions by running the installed binary at install time. Renders the modern homebrew-core idiom generate_completions_from_executable(bin/"<exe>", ...) in the install block. Preferred over completions when the binary can emit its own completions; the two are independent and may both be set.
homepagestringProject homepage URL. Falls back to the GitHub release URL when unset.
idslist of stringBuild IDs filter: only include artifacts whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the Homebrew publisher is skipped. Render failure hard-errors. Config key: brews[].if:.
installstringRuby install block content for the formula.
licensestringSPDX license identifier (e.g., "MIT", "Apache-2.0").
livecheckHomebrewLivechecklivecheck stanza configuration for the formula. When unset, a binary tap formula emits livecheck { skip "Auto-generated on release." } to match the cask (the archive URL/sha are rewritten on every release, so brew livecheck cannot meaningfully poll). Set strategy: / regex:/url: to opt into active version detection instead.
manpageslist of stringManpage file paths to install into the formula's man1 (e.g. ["mytool.1"]). Each entry renders a man1.install "<path>" line in the install block, mirroring real Rust-CLI formulae (ripgrep, fd, bat). A path ending in .N (where N is 1–8) routes to the matching manN section; anything else defaults to man1.
namestringOverride the formula name (default: crate name).
pliststringLaunchd plist content for brew services.
post_installstringPost-install commands (separate def post_install block in formula).
repositoryRepositoryConfigUnified repository config with branch, token, PR, git SSH support. (Replaces the legacy tap: TapConfig owner/name-only form.)
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
servicestringHomebrew service block content (alternative to plist).
skip_uploadStringOrBoolSkip publishing the formula. "true" always skips; "auto" skips for prerelease versions. Accepts bool or template string.
teststringRuby test block content for the formula (run by brew test).
url_headerslist of stringHTTP headers to include in download requests (e.g. for private repos).
url_templatestringCustom URL template for download URLs (overrides release URL).

crates[].publish.homebrew_cask

Unified Homebrew Cask configuration.

Used at both call-sites: - homebrew_casks: — top-level array; carries repository, commit_author, directory, ids, url, structured uninstall/zap, etc. - crates[].publish.homebrew_cask: — per-crate override; same shape, with url_template as the simpler URL alternative.

Fields from both original types are present; any field may be None at either call-site. The union avoids a two-type bifurcation while keeping both axes.

FieldTypeDefaultDescription
alternative_nameslist of stringAlternative cask names (aliases).
appstringmacOS .app bundle name (e.g. "MyApp.app").
binarieslist of HomebrewCaskBinaryBinary stubs to create in /usr/local/bin.

Each entry is either a bare string ("my-cli" → emits binary "my-cli") or a structured { name, target } object ({ name: "my-cli", target: "mycli" } → emits binary "my-cli", target: "mycli"). The target: form mirrors the Homebrew Ruby cask DSL for binary renames — without it, a wrapped binary installs at the wrong path. Cask binary entry.
binarystringDeprecated singular spelling of binaries. The upstream replaced binary: foo with binaries: [foo]; this field captures the legacy spelling so imported configs keep parsing. apply_homebrew_cask_legacy_singulars folds the value into binaries at config-load time and emits a one-time deprecation warning per occurrence. The field is excluded from serialization so a round-tripped config emits only the canonical plural form.
caveatsstringCustom caveats shown after install.
commit_authorCommitAuthorConfigCommit author with optional signing.
commit_msg_templatestringCustom commit message template. Default: "Brew cask update for {{ ProjectName }} version {{ Tag }}"
completionsHomebrewCaskCompletionsShell completion definitions.
conflictslist of HomebrewCaskConflictEntryConflicting casks or formulae.
custom_blockstringArbitrary Ruby code inserted into the cask block.
dependencieslist of HomebrewCaskDependencyEntryCask dependencies (other casks or formulae).
descriptionstringCask description.
directorystringSubdirectory in the tap repo for cask placement (default: "Casks").
generate_completions_from_executableHomebrewCaskGeneratedCompletionsAuto-generate shell completions from an executable.
homepagestringProject homepage URL.
hooksHomebrewCaskHooksPre/post install/uninstall hooks.
idslist of stringBuild IDs filter: only include artifacts from builds whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the Homebrew Cask config is skipped. Render failure hard-errors. Config key: homebrew_casks[].if:.
licensestringLicense identifier (SPDX).
livecheckHomebrewLivechecklivecheck stanza configuration for the cask. When unset, the cask emits livecheck do\n skip "Auto-generated on release."\nend (a binary cask's download URL/sha256 are rewritten on every release, so brew livecheck has nothing stable to poll). Set strategy: / url: / regex: (with skip: false) to opt into active version detection — the same shape a Homebrew cask livecheck do … end block accepts. Reuses the formula livecheck config type.
manpagestringDeprecated singular spelling of manpages. The upstream replaced manpage: foo.1 with manpages: [foo.1]; this field captures the legacy spelling so imported configs keep parsing. apply_homebrew_cask_legacy_singulars folds the value into manpages at config-load time and emits a one-time deprecation warning per occurrence. The field is excluded from serialization so a round-tripped config emits only the canonical plural form.
manpageslist of stringManual page references to install.
namestringCask name (default: crate / project name).
repositoryRepositoryConfigUnified repository config for the Homebrew tap.
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
servicestringHomebrew service definition.
skip_uploadStringOrBoolSkip publishing the cask. "true" always skips; "auto" skips for prerelease versions. Accepts bool or template string.
uninstallHomebrewCaskUninstallStructured uninstall stanza configuration.
update_existing_prStringOrBoolWhen true, force-push the updated cask file to the existing PR branch when a PR for the same head branch already exists. The PR content is updated in place rather than creating a duplicate. When false (default), the push is skipped and a warning is emitted so the operator sees that the publisher did not update the PR.
urlHomebrewCaskURLStructured download URL configuration (top-level axis).
url_templatestringSimple URL template for the .dmg/.zip download (per-crate shorthand).

Cannot be combined with url.template: — set one or the other. If both are present, config validation rejects the config at parse time. Use url: for the structured form (verified domain, custom headers, etc.) or url_template: for a bare string shorthand — never both simultaneously.
zapHomebrewCaskUninstallDeep uninstall (zap) stanza configuration.

crates[].publish.scoop

FieldTypeDefaultDescription
amd64_variantAmd64Variantamd64 microarchitecture variant filter (v1 / v2 / v3 / v4). Only artifacts matching this variant are included. Default: v1. Typed as Amd64Variant, so any value outside v1..v4 is rejected when the config is parsed.
checkverstringScoop checkver strategy used by bucket maintainers to detect new releases. Defaults to "github" (derived from the configured GitHub repo) — ScoopInstaller/Main requires checkver for automated-update PRs. Override with a homepage regex when GitHub release detection is not appropriate.

Example: checkver: "github" or checkver: "v([\\d.]+)".
commit_authorCommitAuthorConfigCommit author with optional signing.
commit_msg_templatestringCustom commit message template.
dependslist of stringApplication dependencies (other Scoop packages).
descriptionstringShort description of the package (shown in scoop info).
directorystringSubdirectory in the bucket repo for manifest placement. Defaults to bucket — scoop resolves manifests only from bucket/ when that directory exists (root otherwise), so bucket/ is correct for both layouts. Set to "" to target the repo root. A stale same-named root-level manifest is removed when publishing into a subdirectory.
homepagestringProject homepage URL. Falls back to the GitHub-derived URL when unset.
idslist of stringBuild IDs filter: only include artifacts whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the Scoop publisher is skipped. Render failure hard-errors. Config key: scoop[].if:.
licensestringSPDX license identifier (e.g., "MIT", "Apache-2.0").
namestringOverride the manifest name (default: crate name).
persistlist of stringData paths persisted between Scoop updates.
post_installlist of stringCommands to run after installation.
pre_installlist of stringCommands to run before installation.
repositoryRepositoryConfigUnified repository config with branch, token, PR, git SSH support. (Replaces the legacy bucket: BucketConfig owner/name-only form.)
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
shortcutslist of list of stringStart menu shortcuts as [executable, label] pairs.
skip_uploadStringOrBoolSkip publishing the manifest. "true" always skips; "auto" skips for prerelease versions. Accepts bool or template string.
url_templatestringCustom URL template for download URLs (overrides release URL).
usestringArtifact selection: "archive" (default), "msi", or "nsis".

crates[].publish.chocolatey

FieldTypeDefaultDescription
amd64_variantAmd64Variantamd64 microarchitecture variant filter (v1 / v2 / v3 / v4). Only artifacts matching this variant are included. Default: v1. Typed as Amd64Variant, so any value outside v1..v4 is rejected when the config is parsed.
api_keystringChocolatey API key for choco push. Falls back to CHOCOLATEY_API_KEY env var.
authorsstringPackage author(s) displayed in the Chocolatey gallery.
bug_tracker_urlstringBug tracker URL (<bugTrackerUrl>). Defaults to {repository}/issues when unset.
copyrightstringCopyright notice.
dependencieslist of ChocolateyDependencyPackage dependencies with optional version constraints.
descriptionstringPackage description (supports markdown).
docs_urlstringDocumentation URL.
icon_urlstringURL to the package icon image shown in the Chocolatey gallery.
idslist of stringBuild IDs filter: only include artifacts whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the Chocolatey publisher is skipped. Render failure hard-errors. Config key: chocolateys[].if:.
licensestringSPDX license expression (e.g. "MIT", "Apache-2.0", "MIT OR Apache-2.0"). Not emitted as a nuspec element — Chocolatey CLI does not support the NuGet <license> element (it warns CHCU0002: "use <licenseUrl> instead") — it gates the <licenseUrl> derivation: a single identifier derives a LICENSE blob URL; a compound expression has no single canonical file, so set license_url explicitly.
license_urlstringOptional explicit <licenseUrl> — Chocolatey's only supported license metadata. When unset, anodizer derives a real GitHub …/blob/<tag>/LICENSE URL from repository (what ripgrep / fd / gh ship); when no repository is known or license is a compound SPDX expression, no <licenseUrl> is emitted. anodizer never synthesizes an opensource.org/licenses/<spdx> URL — it 404s for compound SPDX and gets the package rejected at moderation.
namestringOverride the package name (default: crate name).
ownersstringPackage owners (Chocolatey gallery user).
package_source_urlstringURL shown as the package source in the Chocolatey gallery.
post_publish_pollPostPublishPollConfigPost-publish moderation-queue polling settings. Polling is disabled by default — Chocolatey's community moderation queue routinely takes hours to days, and blocking a CI workflow on that wait is wrong. Opt in per-publisher with post_publish_poll: { enabled: true } when running locally and willing to wait, or disable globally via --no-post-publish-poll.
project_source_urlstringSource code project URL (<projectSourceUrl>). Defaults to the derived repository URL when unset.
project_urlstringProject homepage URL.
release_notesstringRelease notes for this version.
repositoryRepositoryConfigUnified project repo config (owner/name). Used to derive <projectUrl> (the Chocolatey gallery link) and download URLs. <projectUrl> resolves through project_url: (if set) → derived https://github.com/{repository.owner}/{repository.name}.
republish_in_moderationStringOrBoolWhen true, re-push the nupkg even when a version is already in the community moderation queue (PackageStatus=Submitted). Chocolatey's API accepts re-pushes of in-moderation versions; the new nupkg replaces the queued one. When false (default), the push is skipped and a warning is emitted so the operator sees that the publisher did not push.
require_license_acceptanceboolRequire license acceptance before install.
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
skipStringOrBoolSkip pushing to the Chocolatey community repository. Bool, string, or template expression (e.g. "{{ IsSnapshot }}"). Accepts the legacy skip_publish: spelling for back-compat with configs; canonical name is skip: to align with every other publisher.
source_repostringPush source URL (default: https://push.chocolatey.org/).
summarystringShort summary of the package.
tagslist of stringTags for the Chocolatey gallery (joined with single spaces in the emitted nuspec). Always a typed list — the legacy space-separated-string form was dropped now for IDE-completion friendliness and to remove whitespace ambiguity.
titlestringPackage title (default: project name).
url_templatestringCustom URL template for download URLs (overrides release URL).
usestringArtifact selection: "archive" (default), "msi", or "nsis".

crates[].publish.winget

FieldTypeDefaultDescription
amd64_variantAmd64Variantamd64 microarchitecture variant filter (v1 / v2 / v3 / v4). Only artifacts matching this variant are included. Default: v1. Typed as Amd64Variant, so any value outside v1..v4 is rejected when the config is parsed.
authorstringAuthor name.
commit_authorCommitAuthorConfigCommit author with optional signing.
commit_msg_templatestringCustom commit message template.
copyrightstringCopyright notice.
copyright_urlstringCopyright URL.
default_localestringLocale stamped into the WinGet manifests: the version manifest's DefaultLocale, the installer manifest's InstallerLocale, the locale manifest's PackageLocale, and the locale manifest's .locale.<locale>.yaml file name. Supports templates. Default: en-US.

winget:
default_locale: "pt-BR"
dependencieslist of WingetDependencyPackage dependencies.
descriptionstringFull package description displayed in the WinGet gallery.
documentationslist of WingetDocumentationDocumentation links rendered as the Documentations[] block on the locale manifest. Each entry is a { label, url } pair surfaced in the winget gallery (real ripgrep emits a FAQ and a User Guide entry). Omitted entirely when empty.

Example:

documentations:
- label: "User Guide"
url: "https://github.com/owner/repo/blob/master/GUIDE.md"
homepagestringProject homepage URL.
idslist of stringBuild IDs filter: only include artifacts whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the WinGet publisher is skipped. Render failure hard-errors. Config key: winget[].if:.
installation_notesstringPost-install notes shown to the user.
licensestringLicense identifier (required, e.g. "MIT").
license_urlstringLicense URL.
monikerstringShort invoke alias shown as the package Moniker (e.g. rg for ripgrep, fd for fd). This is the command users type, NOT the package/crate name. When unset, anodizer derives it from the single published binary name; with multiple binaries and no override the Moniker is omitted (winget treats it as optional).

Example: moniker: "rg".
namestringOverride the package name (default: crate name).
package_identifierstringWinGet package identifier (e.g. "Publisher.AppName"). Auto-generated if empty.
package_namestringPackage name as displayed (default: same as name).
pathstringManifest file path (auto-generated if empty from publisher/name/version).
post_publish_pollPostPublishPollConfigPost-publish PR-validation polling settings. Polling is disabled by default — winget-pkgs PR validation routinely takes hours to days, and blocking a CI workflow on that wait is wrong. Opt in per-publisher with post_publish_poll: { enabled: true } when running locally and willing to wait, or disable globally via --no-post-publish-poll.
privacy_urlstringPrivacy policy URL.
product_codestringProduct code for the installer (used in Add/Remove Programs).
publisherstringPublisher name (required).
publisher_support_urlstringPublisher support URL.
publisher_urlstringPublisher homepage URL shown in the WinGet manifest.
release_notesstringRelease notes for this version.
release_notes_urlstringURL to full release notes.
repositoryRepositoryConfigUnified repository config with branch, token, PR, git SSH support. (Replaces the legacy manifests_repo: WingetManifestsRepoConfig.)
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
short_descriptionstringShort description (required, max 256 chars).
silent_switchstringSilent-install switch string emitted as InstallerSwitches.Silent for actual installers (wix/msi/exe/nsis). When unset, anodizer derives the switch from the installer type (/quiet for msi, /S for exe/nsis). Never emitted for zip/portable artifacts.

Example: silent_switch: "/qn".
skip_uploadStringOrBoolSkip publishing. "true" always skips; "auto" skips for prereleases. Accepts bool or template string.
tagslist of stringTags for package discovery (lowercased, spaces→hyphens).
update_existing_prStringOrBoolWhen true, force-push the updated manifest to the existing PR branch when a PR for the same head branch already exists. The PR content is updated in place rather than creating a duplicate. When false (default), the push is skipped and a warning is emitted so the operator sees that the publisher did not update the PR.
upgrade_behaviorstringInstaller UpgradeBehavior for every installer entry. winget accepts install, uninstallPrevious, and deny. Defaults to install — the correct behavior for portable-zip CLI tools (uninstallPrevious forces a clobbering reinstall).

Example: upgrade_behavior: "uninstallPrevious".
url_templatestringCustom URL template for download URLs (overrides release URL).
usestringArtifact selection: "archive" (default), "msi", or "nsis".

crates[].publish.aur

FieldTypeDefaultDescription
amd64_variantAmd64Variantamd64 microarchitecture variant filter (v1 / v2 / v3 / v4). Only artifacts matching this variant are included. Default: v1. Typed as Amd64Variant, so any value outside v1..v4 is rejected when the config is parsed.
backuplist of stringList of config files to preserve on upgrade (relative to /).
commit_authorCommitAuthorConfigCommit author with optional signing.
commit_msg_templatestringCustom commit message template. Default: "Update to {{ version }}".
conflictslist of stringPackages this PKGBUILD conflicts with.
contributorslist of stringContributors listed in PKGBUILD comments.
dependslist of stringRuntime dependencies required by this package.
descriptionstringShort description of the package for PKGBUILD.
directorystringSubdirectory in the git repo for committed files.
git_ssh_commandstringCustom SSH command for git operations.
git_urlstringAUR SSH git URL override. Defaults to ssh://aur@aur.archlinux.org/<package>.git, derived from the resolved package name; set this only for a non-standard endpoint.
homepagestringProject homepage URL.
idslist of stringBuild IDs filter: only include artifacts whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the AUR publisher is skipped. Render failure hard-errors. The aurs[].if: conditional gate.
installstringContent for a .install file (post-install/pre-remove scripts).
licensestringSPDX license identifier (e.g., "MIT", "Apache-2.0").
maintainerslist of stringPKGBUILD maintainer entries (e.g., "Name email@example.com").
namestringOverride the package name (default: crate name + "-bin").
optdependslist of stringOptional dependencies with descriptions (e.g., "fzf: fuzzy finder support").
packagestringCustom PKGBUILD package() function body.
private_keystringPath to SSH private key file.
provideslist of stringPackages this PKGBUILD provides (virtual package names).
relstringPackage release number (default: "1").
replaceslist of stringPackages this PKGBUILD replaces (for upgrade paths from old package names).
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
skipStringOrBoolSkip this AUR config. Accepts bool or template string (e.g. "{{ if .IsSnapshot }}true{{ endif }}" for conditional skip). Accepts the legacy disable: spelling via serde alias for back-compat.
skip_uploadStringOrBoolSkip publishing. "true" always skips; "auto" skips for prereleases. Accepts bool or template string.
url_templatestringCustom URL template for download URLs (overrides release URL).

crates[].publish.aur_source

FieldTypeDefaultDescription
amd64_variantAmd64Variantx86_64 micro-architecture variant — v1 (baseline), v2, v3 (AVX2), or v4. Constrained to a typed enum because AUR source pkgs build from the upstream tarball (no binary artifacts to filter), so the value's only role is as the Amd64 template var consumed by prepare: / build: / package: script bodies — typos must fail at parse time, not silently render an invalid string into the PKGBUILD. When unset, defaults to v1 at template-render time.
archeslist of stringExplicit architecture list (default: auto-detect from artifacts).
backuplist of stringBackup files to preserve on upgrade.
buildstringCustom build() function body for PKGBUILD.
commit_authorCommitAuthorConfigCommit author with optional signing.
commit_msg_templatestringCustom commit message template.
conflictslist of stringPackages this PKGBUILD conflicts with.
contributorslist of stringContributors listed in PKGBUILD comments.
dependslist of stringRuntime dependencies.
descriptionstringShort description of the package.
directorystringSubdirectory in the git repo for committed files.
git_ssh_commandstringCustom SSH command for git operations.
git_urlstringAUR SSH git URL override. Defaults to ssh://aur@aur.archlinux.org/<package>.git, derived from the resolved package name; set this only for a non-standard endpoint.
homepagestringProject homepage URL.
idslist of stringBuild IDs filter.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the AUR source config is skipped. Render failure hard-errors. The aur_sources[].if:.
installstringContent for a .install file (post-install/pre-remove scripts).
licensestringSPDX license identifier.
maintainerslist of stringPKGBUILD maintainer entries.
makedependslist of stringBuild-time dependencies (source packages need these).
namestringOverride the package name (default: crate name, no -bin suffix).
optdependslist of stringOptional dependencies.
packagestringCustom package() function body for PKGBUILD.
preparestringCustom prepare() function body for PKGBUILD.
private_keystringPath to SSH private key file.
provideslist of stringPackages this PKGBUILD provides.
relstringPackage release number (default: "1").
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
skipStringOrBoolSkip this config. Accepts the legacy disable: spelling via serde alias for back-compat.
skip_uploadStringOrBoolSkip publishing. "true" always skips; "auto" skips for prereleases.
url_templatestringCustom URL template for download URLs.

crates[].publish.krew

FieldTypeDefaultDescription
amd64_variantAmd64Variantamd64 microarchitecture variant filter (v1 / v2 / v3 / v4). Only artifacts matching this variant are included. Default: v1. Typed as Amd64Variant, so any value outside v1..v4 is rejected when the config is parsed.
arm_variantstringARM version filter (e.g. "6", "7"). Only artifacts matching this variant are included.
caveatsstringPost-install message shown to the user.
commit_authorCommitAuthorConfigCommit author with optional signing.
commit_msg_templatestringCustom commit message template.
descriptionstringFull description of the kubectl plugin.
homepagestringProject homepage URL for the plugin.
idslist of stringBuild IDs filter: only include artifacts whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the Krew publisher is skipped. Render failure hard-errors. Config key: krews[].if:.
modeKrewModeWhich krew-index submission path to take.

- auto (default): probe whether the plugin already exists in kubernetes-sigs/krew-index. Already present → bot (the hosted krew-release-bot opens the version-bump PR server-side); definitively absent → pr-direct (anodizer opens the initial fork PR). A probe that can't reach a definitive answer (rate-limit, network error) hard-errors rather than guessing, so a transient blip never routes an existing plugin into a maintainer-hostile fork PR. - bot: always POST to the krew-release-bot webhook. Use when the plugin is known to be in krew-index and you want to skip the membership probe entirely. - pr-direct: always open a fork PR against krew-index. Use for the initial submission, or a self-hosted krew-index mirror the hosted bot can't reach.
namestringOverride the plugin name (default: crate name).
repositoryRepositoryConfigUnified repository config with branch, token, PR, git SSH support. (Replaces the legacy manifests_repo: / upstream_repo: form.) The upstream PR target is derived from repository.pull_request.base when set, falling back to the canonical kubernetes-sigs/krew-index.
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
short_descriptionstringOne-line summary of the kubectl plugin (max 255 chars).
skipStringOrBoolSkip this Krew config. Accepts bool or template string (e.g. "{{ if .IsSnapshot }}true{{ endif }}" for conditional skip). Distinct from skip_upload so users can opt out of generating the manifest entirely (common when a project is not a kubectl plugin and has no krew channel).
skip_uploadStringOrBoolSkip publishing. "true" always skips; "auto" skips for prereleases. Accepts bool or template string.
update_existing_prStringOrBoolWhen true, force-push the updated plugin manifest to the existing PR branch when a PR for the same head branch already exists. The PR content is updated in place rather than creating a duplicate. When false (default), the push is skipped and a warning is emitted so the operator sees that the publisher did not update the PR.
url_templatestringCustom URL template for download URLs (overrides release URL).

crates[].publish.nix

FieldTypeDefaultDescription
amd64_variantAmd64Variantamd64 microarchitecture variant filter (v1 / v2 / v3 / v4). Only artifacts matching this variant are included. Default: v1. Typed as Amd64Variant, so any value outside v1..v4 is rejected when the config is parsed.
changelogstringURL for meta.changelog. When unset, anodizer derives <host>/<owner>/<repo>/releases/tag/<tag> from the crate's release repository and the release tag (matching what ripgrep/fd set in nixpkgs). Set this to override (e.g. a …/blob/<tag>/CHANGELOG.md URL). Templated. Omitted only when no release repo is configured and no explicit value is given.
commit_authorCommitAuthorConfigCommit author with optional signing.
commit_msg_templatestringCustom commit message template.
dependencieslist of NixDependencyNix package dependencies with optional OS filtering.
descriptionstringShort description of the Nix derivation.
extra_installstringAdditional install commands appended after the main install.
formatterstringNix formatter to run on the generated file: "alejandra" or "nixfmt".
homepagestringProject homepage URL.
idslist of stringBuild IDs filter: only include artifacts whose id is in this list.
ifstringTemplate-conditional gate: when the rendered result is falsy ("false" / "0" / "no" / empty), the Nix publisher is skipped. Render failure hard-errors. Config key: nix[].if:.
installstringCustom install commands (replaces auto-generated binary install).
licensestringLicense for the derivation's meta.license. Accepts a nix lib.licenses attribute (e.g. mit, asl20) or an SPDX expression (e.g. MIT, Apache-2.0, MIT OR Apache-2.0). A known single id maps to lib.licenses.<attr>; an OR/AND list of known ids maps to with lib.licenses; [ … ]. An unknown id or an unparseable compound (e.g. a WITH exception) degrades to a quoted-string license in meta — never rejected, never an invalid attr-path. When unset, the license is derived from the crate's Cargo.toml [package].license.
long_descriptionstringLong-form description for meta.longDescription, rendered as a multi-line longDescription = '' … ''; block. Optional; omitted when unset. Templated.
main_programstringValue for meta.mainProgram in the generated Nix derivation. When set, the rendered derivation includes mainProgram = "<value>"; inside the meta block, telling Nix which binary nix run should execute when the derivation contains multiple executables. Templated: supports {{ Version }} etc. Omitted when unset.
maintainerslist of stringnixpkgs maintainer handles (from lib.maintainers) rendered as maintainers = with lib.maintainers; [ alice bob ]; in the derivation's meta. These are nixpkgs handles (e.g. globin, zowoq), NOT Name <email> author strings — a nixpkgs review rejects a derivation whose meta.maintainers is absent. When unset the derivation still emits maintainers = [ ]; (an empty-but-present list is valid and clears the "field absent" rejection); a user fills in their handle. Each entry is rendered verbatim as a Nix identifier, so values must be valid lib.maintainers attribute names.
namestringOverride the derivation name (default: crate name).
pathstringPath for the .nix file in the repository (default: pkgs/<name>/default.nix).
post_installstringPost-install commands (postInstall phase).
repositoryRepositoryConfigUnified repository config with branch, token, PR, git SSH support.
requiredboolOverride whether this publisher failing should fail the overall release.

Default: false — a failure here is logged but does not abort the release. Set to true to fail the release on any error.
retain_on_rollbackboolWhen true, a triggered rollback leaves this publisher's work in place rather than attempting to undo it. Default false.
skipStringOrBoolSkip this Nix config. Accepts bool or template string (e.g. "{{ if .IsSnapshot }}true{{ endif }}" for conditional skip). Distinct from skip_upload so users can model both intents — disable means "don't generate at all", skip_upload means "generate but don't push". Without this field, nix: { skip: true } was silently dropped by the serde unknown-field default.
skip_uploadStringOrBoolSkip publishing. "true" always skips; "auto" skips for prereleases. Accepts bool or template string.
url_templatestringCustom URL template for download URLs (overrides release URL).