Back to Mise

Packslip Backend

docs/dev-tools/backends/packslip.md

2026.9.218.1 KB
Original Source

Packslip Backend

The Packslip backend installs tools using signed release manifests published by their maintainers. mise verifies the release, selects the build for your platform, and installs its executables. Releases can also include shell completions and agent skills.

Packslip is the preferred Tier 1 backend for tools whose publishers provide these manifests. For other tools, use aqua, GitHub, or another supported backend. You do not need to install the Packslip CLI.

For the background and examples of version-matched completions and agent skills, read Introducing packslip.

Quick start {#usage}

Install hk, a git hook and lint manager, in your project:

sh
mise use packslip:github.com/jdx/hk
mise exec -- hk --version

This records hk in the project's mise.toml. The equivalent configuration is:

toml
[tools]
"packslip:github.com/jdx/hk" = "latest"

Run mise install after adding that configuration manually. To make hk available outside a project, use mise use -g packslip:github.com/jdx/hk. The registry shorthand mise use hk also selects Packslip by default.

Supported project identifiers {#project-names-and-discovery}

Use packslip: followed by the project's host and path, without https://. For GitHub, you can omit the host: packslip:jdx/hk is equivalent to packslip:github.com/jdx/hk.

IdentifierSource
packslip:github.com/owner/repoA GitHub repository's releases.
packslip:github.com/owner/repo/tools/mytoolOne tool in a GitHub monorepo.
packslip:tool.example.comA signed release list hosted by the publisher.
packslip:example.com/tools/mytoolOne tool on a publisher's domain.

The project must publish Packslip manifests; this backend does not infer installation instructions from arbitrary release filenames. GitHub projects have built-in release discovery and signer identity rules. Other hosts need a signed release list and an explicit signer configuration.

For bundle filenames, discovery URLs, and monorepo identity rules, see project discovery.

Versions

List available versions or select a specific release:

sh
mise ls-remote packslip:github.com/jdx/hk
mise use packslip:github.com/jdx/[email protected]

Only releases with Packslip manifests are available through this backend. The registry shorthand selects Aqua for hk versions before 1.58.1, so mise use [email protected] continues to work. You can also select Aqua explicitly with mise use aqua:jdx/hk@VERSION.

Packslip uses semantic versions, including compatible date versions such as 2026.9.1. Prereleases are excluded unless you enable the prerelease tool option. mise also applies minimum_release_age, which defaults to 24 hours. A recently published release may therefore be absent from the list until it reaches that age.

How latest is selected {#latest}

latest follows the publisher's recommendation when it is eligible:

  1. The publisher's latest pointer in a signed release list.
  2. GitHub's latest release, if there is no signed pointer.
  3. The highest eligible semantic version, if there is no eligible recommendation.

A publisher can recommend an older supported release even when a newer major version exists. Prefix and channel requests keep their normal matching rules. Every candidate must satisfy the configured verification and installation policies.

Offline, version listing and latest use cached results, or return no versions if the cache is empty. Installation still performs verification. See version resolution for signed lists, withdrawals, and fallback behavior.

Reproduce an installation

A latest request can resolve differently after the publisher recommends a new release. Keep the request in mise.toml and commit a generated lockfile when your team needs to install the same version:

sh
mise install
git add mise.toml mise.lock

The first installation records the version, signer, and artifact commitments in mise.lock; commit that file with mise.toml. Teammates and CI can then enforce those commitments after checking out the project:

sh
mise install --locked

mise lock can resolve the Packslip version without installing it, but it cannot record the selected artifact's commitments before the first installation. Installation still needs the artifacts or usable cached copies and must satisfy current verification policy. See mise.lock for target platforms and updates.

Completions and skills {#completions}

With mise activated, installing hk also makes its completions available:

sh
mise use packslip:github.com/jdx/hk

Type hk and press Tab. mise loads the completion script declared by hk's release and follows the hk version active in each project. No separate completion installation or usage dependency is needed. Bash, zsh, fish, and PowerShell are supported. See Packslip completions for details and manual setup without shell activation.

<span id="skills"></span>

Tools can also publish agent skills. Use mise skills ls to see the skills provided by active tools and mise skills sync --dir .agents/skills to link them into your agent's directory. A tool must declare a skill for it to appear.

<span id="resource-selection-and-command-execution"></span>

See Packslip completions and skills for setup, automatic skill synchronization, and when resource generation runs a publisher's executable.

Verification {#what-is-verified}

mise verifies the publisher's signature, the requested project and version, and the selected download's digest and size before unpacking it. The signer must match the expected repository identity or your configured public key. mise also checks any existing signer pin, lockfile commitments, and applicable release-age or stamper policy.

A manifest describes the release. A bundle contains the manifest and its signature evidence. An artifact is a downloadable build named by the manifest. mise retains the verified manifest as .mise-packslip.json in the install directory.

Verification authenticates the publisher and downloaded bytes. It does not establish that the software is safe. mise records whether build provenance links are present, but does not fetch and verify that linked provenance. See verification details.

Signer changes {#pinned-signers}

mise remembers previously accepted signers in its local state. mise.lock can also record the project's signer and artifact checksums, carrying those commitments to another machine.

If a release changes signer, inspect the remembered identity:

sh
mise packslip pins
mise packslip pins --json

After confirming the publisher's announced signing-key or workflow change, reset the local pin for that project:

sh
mise packslip forget github.com/jdx/hk

This also resets the remembered vendor release-list continuity. It does not change explicit signer options, erase stamper-list state, or remove a signer commitment from mise.lock. Configure the new signer policy first; if a lockfile entry conflicts, remove that entry and regenerate it with mise install. Review and commit the resulting lockfile change. See signer continuity for the changes that require this review.

Tool options

These tool options apply to one entry in [tools]. The settings packslip.exec, packslip.stampers, and skills.* belong under [settings] instead.

OptionDefaultPurpose
variantNo variantSelect a publisher-declared alternative build.
pubkeyUnsetPin a minisign-format public key or public-key file.
identity, identity_prefix, issuerDerived from a recognized forgeSet the expected keyless signer and OIDC issuer.
list_identity_prefixRelease signer policyPin a different workflow for the vendor release list.
prereleasefalseInclude prerelease versions.
trustApply configured stampersUse "vendor" to exempt this tool from stamp requirements.
allow_unloggedfalseAccept key-signed bundles without transparency-log evidence.
ignore_requirementsfalseInstall despite confirmed host requirement failures.

variant

Select a named alternative build, such as fips or baseline. Without this option, mise considers only artifacts with no variant. The publisher must provide the requested variant.

toml
[tools]
"packslip:github.com/example/tool" = { version = "latest", variant = "fips" }

pubkey

For a key-signed project, obtain the publisher's public key through a trusted channel. Set pubkey to the minisign-format public-key line or the path to its .pub file. The release list and bundles must verify against that key.

toml
[tools]
"packslip:tool.example.com" = { version = "latest", pubkey = "/path/to/vendor.pub" }

identity, identity_prefix, issuer {#identity-identity-prefix-issuer}

For keyless signing, specify an exact certificate identity or an identity_prefix, plus its OIDC issuer. These options override the policy derived from the forge name. Keep the trailing slash in a repository prefix. For example, a domain project signed by a GitHub workflow could use:

toml
[tools]
"packslip:tool.example.com" = { version = "latest", identity_prefix = "https://github.com/example/tool/", issuer = "https://token.actions.githubusercontent.com" }

Replace the example identity with the publisher's verified identity. Recognizing the signing issuer does not add release discovery: the domain still needs a signed release list.

list_identity_prefix {#list-identity-prefix}

When a different workflow signs the vendor's release list, pin its certificate identity prefix separately. It replaces identity and identity_prefix only for the vendor's list; release bundles still require their original signer. The OIDC issuer is shared (including an issuer derived from a forge project). Without this option, the list uses the same policy as release bundles.

The value must be a non-empty string and requires an issuer. It cannot be combined with pubkey. It does not affect configured stampers, whose lists use their own pins.

prerelease

Include prereleases when listing or selecting versions:

toml
[tools]
"packslip:github.com/jdx/hk" = { version = "latest", prerelease = true }

trust

Use trust = "vendor" to exempt one tool from configured stampers. Vendor signature verification still applies, and mise records this choice in the lockfile options.

toml
[tools]
"packslip:github.com/jdx/hk" = { version = "latest", trust = "vendor" }

allow_unlogged {#allow-unlogged}

Set to true only when your policy accepts key-signed bundles without transparency-log evidence. Signature and artifact verification still apply.

ignore_requirements {#ignore-requirements}

Set to true to install despite confirmed host requirement failures. This does not supply missing libraries or make an incompatible executable run. Other verification checks still apply.

Advanced policies

Signed release lists

Publishers can use signed lists to recommend or withdraw versions and provide bundle locations. For domain projects, a list is required; for GitHub, it supplements release discovery. See signed release lists.

<span id="release-list-continuity-and-minimum-age"></span>

Accepted lists must remain available and current. See list continuity and release age for expiry, rollback protection, and timestamp checks.

Stamps

Stampers are services you configure to approve releases in addition to the publisher's signature. No stamps are required by default. See stamper configuration and mirrors.

Artifact selection and host requirements {#artifact-selection}

<span id="host-requirements"></span>

mise selects a build using the signed OS, architecture, libc, and variant metadata, then checks its declared host requirements. An ambiguous build or a confirmed incompatible host can prevent installation. See artifact selection and host requirements.

Troubleshooting

Start with debug output for the failing command, for example:

sh
MISE_DEBUG=1 mise install packslip:github.com/jdx/hk
SymptomNext step
No versions or bundle foundCheck the project identifier and mise ls-remote. Confirm that the release has a Packslip manifest and is old enough for minimum_release_age. The publisher must supply missing manifests.
Nothing pins the signerConfigure pubkey, or a certificate identity/prefix and issuer, using details confirmed with the publisher.
Signer change or trust downgrade refusedInspect mise packslip pins, explicit tool options, and mise.lock. Follow signer changes after confirming the publisher's change.
No eligible artifactCheck your platform and requested variant. The publisher must provide a matching build.
Ambiguous artifactsThe publisher must distinguish the builds in the manifest; changing local options cannot fix identical metadata.
Host requirements failedInstall the reported dependency or use a compatible host. See host requirements before overriding a failure.
Signed list expired, rolled back, or missingAsk the list's publisher for a current valid list. Removing an accepted list does not reset its policy.
Version excluded by stamp policyCheck your configured stampers. A trusted stamper must approve the version, and the vendor must not have withdrawn it.
Digest or size mismatchReport the affected release and artifact to the publisher; the download must match the signed manifest.

For completion and skill errors, see resource troubleshooting.

Publishing tools for mise {#why-publish-one}

A Packslip manifest lets mise install your releases without a new registry shorthand or a separate filename-matching recipe. You can keep your existing release layout and add versioned completions, CLI specifications, or agent skills.

To support mise:

  1. Publish installable artifacts with accurate platform metadata and executable paths.
  2. Sign a manifest containing their digests and publish its bundle with the release.
  3. For domain hosting, publish a signed release list and tell users how to pin your signer.
  4. Optionally declare completions and skills.

For GitHub Actions, follow the Packslip publishing guide for the action version, permissions, inputs, and monorepo setup. Run the action after building and uploading the final artifacts. For domain hosting, see signed release lists.

The Packslip specification defines the format. For mise's implementation details, see src/backend/packslip.rs.