| name | mise |
| description | Guide for using mise to manage development tools and runtime versions. Use when configuring project tooling, managing environment variables, or defining project tasks. |
mise - Development Environment Management
This skill activates when working with mise for managing tool versions, environment variables, and project tasks.
When to Use This Skill
Activate when:
- Setting up development environments
- Managing tool and runtime versions (Node.js, Python, Ruby, Go, etc.)
- Configuring environment variables and secrets
- Defining and running project tasks
- Creating reproducible development setups
- Working with monorepos or multiple projects
What is mise?
Current stable: v2026.3.15
mise is a polyglot runtime manager and development environment tool that combines:
- Tool version management - Install and manage multiple versions of dev tools
- Environment configuration - Set environment variables per project
- Task automation - Define and run project tasks
- Cross-platform - Works on macOS, Linux, and Windows
Install with curl https://mise.run | sh (or brew install mise), then activate in the shell: eval "$(mise activate zsh)". Full install matrix, shims, IDE and CI/CD integration: references/setup-and-troubleshooting.md.
Tool Backends
mise uses different backends (package managers) to install tools:
- asdf - Traditional asdf plugins (default for many tools)
- github - GitHub release-asset installer (replaces deprecated ubi backend)
- cargo - Rust packages (requires Rust installed)
- npm - Node.js packages (requires Node installed)
- go - Go packages (requires Go installed)
- aqua - Package manager
- pipx - Python packages (requires Python installed)
- gem - Ruby packages (requires Ruby installed)
- gitlab - Direct from GitLab repositories
- http - Direct HTTP downloads
Prefer registry short names (ripgrep) over backend-prefixed forms (cargo:ripgrep) when the tool is in the mise registry (mise registry | grep <tool-name>). Fall back to an explicit backend prefix when the registry has no entry.
Per-backend detail — github backend options (exe, asset_pattern, extract_all, rename_exe), multi-arch platform keys, cargo prerequisites and git installs, upgrades and aliases: references/backends.md.
Verify Before Pinning — ls-remote
mise ls-remote <backend>:<target> returns all available versions for any backend. Run this BEFORE pinning a version in mise.toml to confirm the backend can actually see the tool:
mise ls-remote node
mise ls-remote github:sharkdp/fd
mise registry | grep <tool-name>
Failure mode — the tool lives in a different repo than you expect. Sometimes the CLI binary is released from a different repository than the documentation or project homepage:
$ mise ls-remote github:juxt/allium | head -5
(no output)
$ mise ls-remote github:juxt/allium-tools | head -5
0.1.0
If ls-remote returns nothing, check whether the project publishes releases to a separate repository (e.g., a -tools, -cli, or -releases repo). Don't pin a version you haven't verified ls-remote can see. Per-backend ls-remote output examples: references/backends.md.
Installing and Using Tools
Key difference: mise install only installs tools; mise use installs AND adds the tool to your configuration file. mise use is the primary way to add tools to projects.
mise install
mise install node@20.10.0
mise use node@20
mise use --pin node@20.10.0
mise use node@latest
mise use cargo:ripgrep@latest
mise use --remove node
mise use --force node@20
mise use --dry-run node@20
Version pinning: fuzzy (node@20) auto-updates within the major version; --pin locks the exact version; latest always updates. Best Practice: Use fuzzy versions for flexibility, mise.lock for reproducibility.
Configuration file selection
mise use writes to configuration files in this priority order:
--global flag: ~/.config/mise/config.toml
--path <file> flag: Specified file path
--env <env> flag: .mise.<env>.toml
- Default:
mise.toml in current directory
.mise.toml Schema
[tools]
node = "20.10.0"
python = "3.12"
terraform = "latest"
"cargo:ripgrep" = "latest"
"github:sharkdp/fd" = "latest"
"npm:typescript" = "latest"
"github:nushell/nushell" = "latest"
node = { version = "lts", resolve = "latest-lts" }
mise reads configuration from multiple locations (in order):
.mise.toml - Project local config
.mise/config.toml - Project local config (alternative)
~/.config/mise/config.toml - Global config
- Environment variables -
MISE_*
Environment Variables
[env]
DATABASE_URL = "postgresql://localhost/myapp"
NODE_ENV = "development"
APP_ROOT = "{{ config_root }}"
PATH = ["{{ config_root }}/bin", "$PATH"]
_.file = ".env"
_.path = ["/custom/bin"]
Secrets via mise set:
mise set SECRET_KEY sops://path/to/secret
mise set API_TOKEN age://path/to/secret
mise set BUILD_ID "$(git rev-parse HEAD)"
Tasks
[tasks.build]
description = "Build the project"
run = "npm run build"
sources = ["src/**/*.ts"]
outputs = ["dist/**/*"]
dir = "frontend"
env = { NODE_ENV = "production" }
[tasks.test]
description = "Run tests"
run = "npm test"
[tasks.lint]
description = "Run linter"
run = "npm run lint"
depends = ["build"]
[tasks.ci]
description = "Run CI pipeline"
depends = ["lint", "test"]
[tasks.watch]
run = "npm run watch"
raw = true
mise run build
mise build
mise run lint test
mise tasks
mise run script -- arg1
Define a ci task that aggregates the project's format, lint, and test checks — mise run ci is the local quality gate other skills and agents in this workspace invoke before commit. File-based tasks (.mise/tasks/) and complete Node/Python/monorepo/multi-tool project setups: references/tasks-and-workflows.md.
Sandboxing
mise sandboxing restricts filesystem, network, and env access for mise exec / mise run using OS-level primitives (Landlock/seccomp on Linux, Seatbelt on macOS; Windows unsupported). Gotcha: mise settings experimental=true is required first — without it, deny/allow flags are silently no-ops.
mise x --deny-all --allow-read=. --allow-write=./dist --allow-net=registry.npmjs.org -- npm install
Full flag reference, platform support matrix, task-level config, and limitations: references/sandboxing.md. Runnable examples: templates/sandboxing.md.
Lock Files
mise lock
mise install --locked
[settings]
lockfile = true
Templates
The templates/ directory contains reusable configuration snippets for common mise patterns:
templates/multi-arch.md — platform-specific asset patterns for GitHub-release tools (pattern detail in references/backends.md)
templates/sandboxing.md — runnable sandbox invocations
Best Practices
- Use .mise.toml for projects: Better than .tool-versions (more features)
- Pin versions in projects: Ensure consistency across team
- Use tasks for common operations: Document and standardize workflows
- Lock files in production: Use
mise lock for reproducibility
- Global tools for dev: Set global defaults, override per project
- Environment per project: Keep secrets and config in .mise.toml
- Commit .mise.toml: Share config with team
- Don't commit .mise.lock: Let mise generate per environment
- Zero setup for team: Clone and
mise install to get started
References
references/backends.md — per-backend ls-remote examples, github backend options, multi-arch asset patterns, cargo backend, upgrades and aliases
references/tasks-and-workflows.md — file-based tasks and complete project workflow examples (Node.js, Python, monorepo, multi-tool)
references/sandboxing.md — sandbox flag reference, platform support matrix, task-level config, limitations
references/setup-and-troubleshooting.md — installation matrix, shims, IDE integration, CI/CD integration (GitHub Actions, GitLab CI), troubleshooting, .tool-versions migration
references/transitive-runtime-deps.md — mise exec does NOT auto-install transitive deps (Elixir-needs-Erlang failure mode); prefer portable secret-generation commands (openssl, python3, /dev/urandom)