release.toml reference

For publishers writing the release.toml that packslip create --manifest (-m) reads: every key, its flag, and what create does when a key is absent. To write your first one, follow Describe your artifacts.

release.toml only configures packslip create. It is neither signed nor published, and consumers never read it: flags and release.toml produce the same signed release statement.

Layout

Top-level keys come first, then the tables. A table header such as [artifact.extensions."example.com"] belongs to the [[artifact]] entry above it, so place it right after that entry's keys.

project = "github.com/owner/mytool"
version = "1.2.3"
url_base = "https://github.com/owner/mytool/releases/download/v1.2.3"
bin = ["mytool"]

[source]
repo = "https://github.com/owner/mytool"
tag = "v1.2.3"

[extensions."example.com"]
build_id = "20260901.3"

[[artifact]]
path = "dist/mytool-1.2.3-linux-x64.tar.gz"
requires = { glibc_min = "2.31" }

[artifact.extensions."example.com"]
runner = "ubuntu-22.04"

[[artifact]]
path = "dist/mytool-1.2.3-darwin-arm64.tar.gz"

[[resource]]
kind = "man"
artifact = "mytool-1.2.3-linux-x64.tar.gz"
archive = "mytool-1.2.3/share/man/man1/mytool.1"

Keys in release.toml

Every flag is listed in packslip create.

Top-level keys

KeyFlagMeaning
project--projectThe project name, such as github.com/owner/mytool. Required here or as the flag.
version--versionThe semver version, such as 1.2.3. Required here or as the flag.
url_base--url-baseDownload URL prefix. Each artifact and asset that sets no url gets url_base/FILENAME.
notes_url--notes-urlURL of the release notes.
published_at--published-atRFC 3339 publish time, recorded in UTC (2026-09-01T14:00:00+02:00 becomes 2026-09-01T12:00:00Z). Defaults to now.
bin--binExecutables inside every artifact that lists none of its own: each a path, a plain name, or { name = "mytool", path = "bin/mytool-x86_64" }. See Name the executables.
requires--require (commands only)Default host requirements for every artifact that states none of its own; see Requirement keys.
extensions--extensionRelease-level extensions, as [extensions."NAME"] tables.

The [source] table

KeyFlagMeaning
repo--source-repoSource repository URL, such as https://github.com/owner/mytool. Required when the table is present.
commit--commitThe commit the release was built from. A repo resource requires it.
tag--tagThe release tag, such as v1.2.3. For a GitHub project, create warns when the tag does not name the version; see Tags.

--commit and --tag need a repository from --source-repo or this table.

[[artifact]] tables

KeyFlagMeaning
pathThe artifact argumentThe local file. Required.
os, arch, libcPATH:OS/ARCH[/LIBC]The platform, when the file name gives the wrong one or none.
portablePATH:anytrue for a build that runs everywhere: leaves out os, arch, and libc, whatever the file name says.
variantPATH@VARIANTMarks a distinct build that shares a platform with another artifact, such as fips.
format--format FILENAME=FORMATThe format, when the file name does not give the right one: a vocabulary format, raw for a bare executable, or a type of your own, which only a consumer that handles it selects.
url--url FILENAME=URLThe download URL, when it is not url_base/FILENAME.
binNoneThis artifact's executables, replacing the top-level bin. bin = [] declares none.
requiresNoneThis artifact's host requirements, replacing the top-level requires.
provenance--provenance FILENAME=URLURLs of build provenance statements for this artifact.
extensionsNoneArtifact-level extensions, as an [artifact.extensions."NAME"] table.

Each explicit os, arch, libc, variant, and format value is a lowercase word: a letter or digit, then letters, digits, ., _, or -. Platform values follow these rules:

Override the inferred platform shows the platform keys beside their argument forms.

Artifact argument suffixes

An artifact argument takes the suffixes in the Flag column above, with @VARIANT after the path or after a : suffix.

[[resource]] tables

Each [[resource]] table needs a kind and exactly one source key: archive, asset, repo, or exec.

KeyIn --resourceMeaning
kindKINDcompletion, man, cli-spec, skill, sbom, desktop, icon, app, or a kind of your own. Required.
archivearchive:PATHA path inside the artifact.
assetasset:PATHA separate release file, by local path, digested into subject under its file name.
reporepo:PATHA path in the source repository.
execexec:COMMANDA command whose standard output is the file, as a list such as ["mytool", "completion", "{shell}"].
envLeading NAME=value words in the exec: valueEnvironment variables for an exec command.
artifactNoneLimits the entry to one artifact, by its exact file name.
os, arch, libc@OS[/ARCH[/LIBC]]Limits the entry to artifacts of that platform.
shell, shells, bin, format, nameThe qualifiers after KINDshell is completion/SHELL; shells is completion/SHELL,SHELL, every shell an exec command generates; bin is /BIN, the executable the entry is for; format is cli-spec/FORMAT or sbom/FORMAT; name is skill/NAME, or KIND/NAME for a kind of your own.
urlNone; use --url FILENAME=URLAn asset's download URL, when it is not url_base/FILENAME.
extensionsNoneResource-level extensions, as a [resource.extensions."NAME"] table.

Write a resource entry explains each kind and which qualifiers it takes.

Requirement keys

A requires table, top-level or per artifact, takes these keys; Declare host requirements explains each one.

KeyMeaning
os_minMinimum OS version in the OS's own numbering, such as "12" for macOS or "10.0.17763" for Windows.
glibc_minMinimum glibc for a gnu Linux build, such as "2.31".
libsShared libraries the executables load from the host. create reads them; write them only for an artifact it cannot read.
binCommands the executables need on PATH, such as [{ name = "java", min = "17" }].

Misspelled and repeated keys

A release.toml is refused when it:

Warning: Inside a requires table or a { name, path } entry of bin, packslip create ignores keys it does not know, so a misspelling such as glibc_mn is dropped without an error.

Flags with no key

Pass these next to --manifest: --key, --sign, --no-log, --out, --attested-by, --evidence, --no-sha512, --no-libs, and --no-pin-workflow.

How paths are resolved

FieldRelative toExample
Artifact pathThe directory where packslip create runs, not the directory that holds release.toml.dist/mytool-linux-x64.tar.gz
Resource asset (TOML, or asset: in --resource)The same directory.dist/mytool.cdx.json
Executable path or resource archiveThe archive's root as stored, so it includes any top-level directory (as tar -tzf lists them, minus any leading ./).mytool-1.2.3/bin/mytool
Resource repoThe source repository at source.commit.skills/mytool
Resource artifactAn exact artifact file name in the statement, with no local directory.mytool-linux-x64.tar.gz

How release.toml and flags combine

Under the GitHub Action, its inputs replace project, version, url_base, notes_url, and [source]; see How inputs reach packslip create.

How packslip create reads file names

create reads the OS, architecture, and format from the file name, ignoring case, for each one that release.toml, an argument suffix, or --format does not set. A portable artifact still takes its format from the name.

Operating system

The first row that matches wins.

In the file nameRecorded as
android or androideabi as the word right after linux (aarch64-linux-android), or as a word anywhere in a name without linuxandroid
ios as the word right after apple (aarch64-apple-ios), or as a word anywhere in a name without apple, darwin, or macosios
linux, or a .deb, .rpm, or .AppImage filelinux
darwin, macos, apple, or a .dmg or .pkg filedarwin
windows, win32, win64, or a .exe, .exe.gz, .exe.zip, .msi, or .msix filewindows
freebsd, netbsd, openbsd, illumosThe same word

A name with no OS records no os; Select platforms and variants lists this and other results create accepts without a warning.

Format

The format comes from the extension: .tar.xz, .tar.gz, .tar.zst, .tar.bz2, .tgz, .tar, .zip, .7z, .gz, .xz, .zst, .bz2, .deb, .rpm, .dmg, .pkg, .msix, .msi, .exe, or .AppImage. Vocabularies says how consumers install each one.

Architecture

In the file nameRecorded as
x86_64, x86-64, x64, amd64, or win64 when nothing else names onex86_64
aarch64, arm64aarch64
armv7, armhfarmv7
armv6, or a plain arm (the goreleaser and Rust default)armv6
i686, i386, x86, 386, ia32i686
ppc64le, ppc64el, powerpc64lepowerpc64le
loongarch64, loong64loongarch64
mipsel, mipslemipsel
mips64el, mips64lemips64el
ppc64, powerpc64powerpc64
riscv64, s390x, mips, mips64The same word

An artifact for an OS other than macOS or Windows is refused when its name gives no architecture, since it would fit every host of that OS. Name one, or set any (PATH:linux/any, arch = "any") for a build that runs on every architecture. .noarch.rpm and _all.deb packages are exempt. A macOS or Windows artifact without one records no arch.

C library

The C library is the first of these that applies:

  1. The explicit value: libc, or the third part of PATH:OS/ARCH/LIBC. any leaves the field out; set it for a Linux build that loads no C library, such as an archive of shell scripts.
  2. No libc for an artifact whose OS is not Linux.
  3. The file name: musl records musl; a word that is gnu or starts with gnueabi, gnuabi, gnux32, or glibc records gnu.
  4. The listed executables, when every one is an ELF binary. A statically linked build, such as a Go binary built with CGO_ENABLED=0, records no libc and fits both glibc and musl hosts. A build that uses musl's loader records musl. Any other records gnu.
  5. gnu, which does not fit a musl host. This happens when no executables are listed, an executable is a script, the format cannot be opened, or --no-libs is set.