GitHub Backend
You may install GitHub release assets directly using the github backend. This backend downloads release assets from GitHub repositories and is ideal for tools that distribute pre-built binaries through GitHub releases.
The code for this is inside of the mise repository at ./src/backend/github.rs.
Usage
The following installs the latest version of ripgrep from GitHub releases and sets it as the active version on PATH:
$ mise use -g github:BurntSushi/ripgrep
$ rg --version
ripgrep 14.1.1The version will be set in ~/.config/mise/config.toml with the following format:
[tools]
"github:BurntSushi/ripgrep" = "latest"Tool Options
The following tool-options are available for the github backend—these go in [tools] in mise.toml.
Asset Autodetection
When no asset_pattern is specified, mise automatically selects the best asset for your platform. The system scores assets based on:
- OS compatibility (linux, macos, windows)
- Architecture compatibility (x64, arm64, x86, arm)
- Libc variant (gnu or musl for Linux, msvc for Windows)
- Archive format preference (tar.gz, zip, etc.)
- Build type (avoids debug/test builds)
For most tools, you can simply install without specifying patterns:
mise install github:user/repoTIP
The autodetection logic is implemented in src/backend/asset_matcher.rs, which is shared by both the GitHub and GitLab backends.
asset_pattern
Specifies the pattern to match against release asset names. This is useful when there are multiple assets for your OS/arch combination or when you need to override autodetection.
[tools]
"github:cli/cli" = { version = "latest", asset_pattern = "gh_*_linux_x64.tar.gz" }version_prefix
Specifies a custom version prefix for release tags. By default, mise handles the common v prefix (e.g., v1.0.0), but some repositories use different prefixes like release-, version-, or no prefix at all.
When version_prefix is configured, mise will:
- Filter available versions with the prefix and strip it
- Add the prefix when searching for releases
- Try both prefixed and non-prefixed versions during installation
[tools]
"github:user/repo" = { version = "latest", version_prefix = "release-" }Examples:
- With
version_prefix = "release-":- User specifies
1.0.0→ mise searches forrelease-1.0.0tag - Available versions show as
1.0.0(prefix stripped)
- User specifies
- With
version_prefix = ""(empty string):- User specifies
1.0.0→ mise searches for1.0.0tag (no prefix) - Useful for repositories that don't use any prefix
- User specifies
Platform-specific Asset Patterns
For different asset patterns per platform:
[tools."github:cli/cli"]
version = "latest"
[tools."github:cli/cli".platforms]
linux-x64 = { asset_pattern = "gh_*_linux_x64.tar.gz" }
macos-arm64 = { asset_pattern = "gh_*_macOS_arm64.tar.gz" }checksum
Verify the downloaded file with a checksum:
[tools."github:owner/repo"]
version = "1.0.0"
asset_pattern = "tool-1.0.0-x64.tar.gz"
checksum = "sha256:a1b2c3d4e5f6789..."Instead of specifying the checksum here, you can use mise.lock to manage checksums.
Platform-specific Checksums
[tools."github:cli/cli"]
version = "latest"
[tools."github:cli/cli".platforms]
linux-x64 = {
asset_pattern = "gh_*_linux_x64.tar.gz",
checksum = "sha256:a1b2c3d4e5f6789...",
}
macos-arm64 = {
asset_pattern = "gh_*_macOS_arm64.tar.gz",
checksum = "sha256:b2c3d4e5f6789...",
}size
Verify the downloaded asset size:
[tools]
"github:cli/cli" = { version = "latest", size = "12345678" }strip_components
Number of directory components to strip when extracting archives:
[tools]
"github:cli/cli" = { version = "latest", strip_components = 1 }INFO
If strip_components is not explicitly set, mise will automatically detect when to apply strip_components = 1. This happens when the extracted archive contains exactly one directory at the root level and no files. This is common with tools like ripgrep that package their binaries in a versioned directory (e.g., ripgrep-14.1.0-x86_64-unknown-linux-musl/rg). The auto-detection ensures the binary is placed directly in the install path where mise expects it.
bin
Rename the downloaded binary to a specific name. This is useful when downloading single binaries that have platform-specific names:
[tools."github:docker/compose"]
version = "2.29.1"
bin = "docker-compose" # Rename the downloaded binary to docker-composeINFO
When downloading single binaries (not archives), mise automatically removes OS/arch suffixes from the filename. For example, docker-compose-linux-x86_64 becomes docker-compose automatically. Use the bin option only when you need a specific custom name.
rename_exe
Rename the executable after extraction from an archive. This is useful when the archive contains a binary with a platform-specific name that you want to rename:
[tools."github:yt-dlp/yt-dlp"]
version = "latest"
asset_pattern = "yt-dlp_linux.zip"
rename_exe = "yt-dlp" # Rename the extracted binary to yt-dlpTIP
Use rename_exe for archives where the binary inside has a different name than desired. Use bin for single binary downloads (non-archives).
no_app
Skip macOS .app bundle assets during autodetection and prefer standalone CLI binaries instead. This is useful when a repository provides both a macOS .app bundle (often an Xcode extension or GUI application) and a standalone command-line tool:
[tools."github:nicklockwood/SwiftFormat"]
version = "latest"
rename_exe = "swiftformat"
no_app = true # Skip SwiftFormat.for.Xcode.app.zip, use swiftformat.zip insteadWhen no_app = true:
- Assets containing
.app.(e.g.,Tool.app.zip,Tool.for.Xcode.app.zip) are penalized during autodetection - Standalone archives (e.g.,
tool.zip,tool-macos.tar.gz) are preferred - Only affects macOS; has no effect on Linux/Windows
INFO
Without this option, mise's autodetection might select .app bundles on macOS, which can be problematic if the bundle contains a GUI application or Xcode extension rather than a standalone CLI tool.
bin_path
Specify the directory containing binaries within the extracted archive, or where to place the downloaded file. This supports Tera templating with variables like {{ version }}, {{ os }}, {{ arch }}, and arch aliases ({{ darwin_os }}, {{ amd64_arch }}, {{ x86_64_arch }}, {{ gnu_arch }}):
[tools."github:cli/cli"]
version = "latest"
bin_path = "cli-{{ version }}/bin" # expands to cli-1.0.0/binBinary path lookup order:
- If
bin_pathis specified, use that directory - If
bin_pathis not set, look for abin/directory in the install path - If the install path root contains an executable file, use the install path root
- If no
bin/directory exists, search subdirectories forbin/directories - If no
bin/directories are found, searches immediate subdirectories for any executable files. If an executable is found directly within a subdirectory, that entire subdirectory is considered a binary path. - If no executables are found, use the root of the extracted directory
filter_bins
Comma-separated list of binaries to symlink into a filtered .mise-bins directory. This is useful when the tool comes with extra binaries that you do not want to expose on PATH.
[tools]
"github:jgm/pandoc" = { version = "latest", filter_bins = "pandoc" }When enabled:
- A
.mise-binssubdirectory is created with symlinks only to the specified binaries - Other binaries (like
pandoc-luaorpandoc-server) are not exposed on PATH
api_url
For GitHub Enterprise or self-hosted GitHub instances, specify the API URL:
[tools]
"github:myorg/mytool" = { version = "latest", api_url = "https://github.mycompany.com/api/v3" }Self-hosted GitHub
If you are using a self-hosted GitHub instance, set the api_url tool option. For authentication, see GitHub Tokens.
Supported GitHub Syntax
- GitHub shorthand for latest release version:
github:cli/cli - GitHub shorthand for specific release version:
github:cli/cli@2.40.1
Settings
github.credential_command
- Type:
string - Env:
MISE_GITHUB_CREDENTIAL_COMMAND - Default:
When set, mise executes this command via sh -c and reads the token
from stdout. The hostname is passed as $1, making the command
host-aware for GitHub Enterprise environments. This replaces the
git credential fill fallback and does not require
github.use_git_credentials to be enabled.
The command should print a single token to stdout. Trailing whitespace is trimmed. Results are cached per host per session.
Example: op read "op://Private/GitHub Token/credential"
github.gh_cli_tokens
- Type:
boolean - Env:
MISE_GITHUB_GH_CLI_TOKENS - Default:
true
When enabled, mise will read OAuth tokens from the gh CLI config file
(~/.config/gh/hosts.yml or $GH_CONFIG_DIR/hosts.yml) as a fallback
when no GITHUB_TOKEN or MISE_GITHUB_TOKEN environment variable is set.
This supports multiple GitHub Enterprise instances since the gh CLI stores per-host tokens.
Set to false to disable this behavior.
github.github_attestations
- Type:
boolean - Env:
MISE_GITHUB_GITHUB_ATTESTATIONS - Default:
true
Enable/disable GitHub Artifact Attestations verification for github backend tools. When enabled, mise will verify the authenticity and integrity of downloaded tools using GitHub's artifact attestation system.
github.slsa
- Type:
boolean - Env:
MISE_GITHUB_SLSA - Default:
true
Enable/disable SLSA provenance verification for github backend tools. When enabled, mise will verify the supply-chain integrity of downloaded tools using SLSA provenance attestations.
github.use_git_credentials
- Type:
boolean - Env:
MISE_GITHUB_USE_GIT_CREDENTIALS - Default:
false
When enabled, mise will run git credential fill to obtain GitHub tokens
using the credential helpers configured in your .gitconfig.
This covers tokens stored in system keyrings (macOS Keychain, Windows Credential Manager), and any other git credential helper.
Used as a last resort — after environment variables, github_tokens.toml,
and gh CLI tokens are checked. Results are cached per host for the
duration of the session.
Set to true to enable this behavior.