mise (mise-en-place)
mise is a fast, Rust-based development environment tool that consolidates version management, environment variable handling, and task automation into a single unified interface. Pronounced “MEEZ ahn plahs,” mise serves as a modern, faster alternative to tools like asdf, nvm, pyenv, and rbenv.
Core Capabilities
1. Dev Tools Version Management
Manages versions of programming language runtimes and tools:
- Node.js, Python, Java, Go, Rust, Ruby
- Terraform, AWS CLI, Kubectl
- 100+ tools via asdf plugin ecosystem
2. Environment Variable Management
Replaces direnv for managing per-project environment variables:
- Global configuration via
~/.config/mise/config.toml - Project-level
mise.tomloverrides - Automatic activation entering/exiting directories
- Support for
.envfiles
3. Task Runner
Built-in task automation replacing make, npm scripts, just, etc.:
- Define tasks in
mise.toml - Automatic tool version and environment variable inheritance
- Task dependencies and parallel execution
- Multi-line command support
Performance & Architecture
Rust-Based Speed
- Written entirely in Rust (not shell scripts)
- ~5ms prompt load overhead vs. ~120ms with asdf
- Direct PATH modification instead of shims
- Minimal shell startup latency
Compatibility
- Drop-in replacement for asdf: Reads
.tool-versionsfiles natively - Windows support: Unlike asdf, mise supports Windows (for non-asdf backends)
- Leverages asdf plugins: Works with existing asdf plugin ecosystem
- Zero-config migration: Move from asdf with no configuration changes
Installation
Quick Install
curl https://mise.run | sh Activation (choose your shell)
Bash:
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc Zsh:
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc Fish:
echo '~/.local/bin/mise activate fish | source' >> ~/.config/fish/config.fish PowerShell:
echo '~/.local/bin/mise activate pwsh | Out-String | Invoke-Expression' >> ~/.config/powershell/Microsoft.PowerShell_profile.ps1 Usage Examples
Install & Use Tools
# Install specific version globally
mise use --global node@24
mise use --global python@3.11
# Install multiple tools
mise use --global node@24 go@1 terraform@1.5
# Execute one-off command with specific version
mise exec node@24 -- node -v Environment Variables
# mise.toml
[env]
NODE_ENV = "production"
AWS_REGION = "us-west-2"
DATABASE_URL = "postgres://..." Task Definition
# mise.toml
[tasks.build]
description = "Build the project"
run = "npm run build"
[tasks.deploy]
description = "Deploy infrastructure"
depends = ["validate", "plan"]
run = """
terraform apply -auto-approve
notify-team
"""
dir = "{{config_root}}" Configuration
mise.toml Structure
[tools]
node = "24"
python = "3.11"
terraform = "1.5"
[env]
NODE_ENV = "production"
AWS_REGION = "us-west-2"
[tasks.build]
description = "Build the project"
run = "npm run build"
[tasks.test]
description = "Run tests"
depends = ["build"]
run = "npm test" Version Specifications
Simple versions:
node = "24"
python = "3.11" Prefix matching:
python = "prefix:3.11" # Latest 3.11.x Reference to commit:
custom-tool = "ref:abc123def456" # Git commit reference Path to custom installation:
my-tool = "path:/usr/local/bin/my-tool" # System-installed Sub-versions:
node = "sub-1:latest" # Use version before latest Key Commands
| Command | Purpose |
|---|---|
mise install | Install all configured tools and plugins |
mise use <tool>@<version> | Install and set tool version |
mise exec <tool>@<version> -- <cmd> | Run command with specific tool version |
mise run <task> | Execute a defined task |
mise activate <shell> | Hook mise into shell |
mise doctor | Verify installation and configuration |
mise set VAR=value | Set environment variable |
Comparison to ASDF
| Feature | ASDF | mise |
|---|---|---|
| Language | Bash | Rust |
| Performance Overhead | ~120ms | ~5ms |
| Configuration | .tool-versions | mise.toml (also supports .tool-versions) |
| Windows Support | No | Yes |
| Task Runner | No | Yes (built-in) |
| Environment Vars | No | Yes (built-in) |
| Learning Curve | Steep | Low |
| Example: Install node 20 | asdf plugin add node, asdf install node latest:20, asdf local node latest:20 | mise use node@20 |
Advanced Features
Hierarchical Configuration
- Global defaults at
~/.config/mise/config.toml - Project-level overrides in
mise.toml - Automatic merging with most specific taking precedence
Multiple Tool Versions
Install and manage multiple versions of same tool simultaneously
Shims
Lightweight symlinks to mise binary for environment variable management
- Works in CI/CD pipelines
- Functions in IDEs
- Less feature-complete than
mise activate
Fuzzy Matching
Forgiving command structure with intelligent matching
Task Dependencies
Define which tasks must run before others
- Automatic dependency resolution
- Parallel execution where possible
Backends
Multiple installation sources for tools:
- asdf: Traditional asdf plugins
- npm: npm packages as tools
- pipx: Python packages
- github: Tools directly from GitHub releases
- aqua: Aqua registry support
- core: Built-in tool support
Use Cases
Perfect for:
- Polyglot development environments (Node.js, Python, Go, Rust simultaneously)
- Team onboarding (automatic version consistency)
- CI/CD pipelines (environment standardization)
- Project-specific tool versions
- Replacing multiple version managers with one tool
- Organizations using multiple programming languages
Real-World Example
# mise.toml for infrastructure project
[tools]
terraform = "1.5"
aws-cli = "2"
node = "24"
[env]
TF_WORKSPACE = "development"
AWS_REGION = "us-west-2"
AWS_PROFILE = "dev"
[tasks.validate]
description = "Validate AWS credentials and terraform config"
run = """
aws sts get-caller-identity
terraform validate
"""
[tasks.plan]
description = "Run terraform plan with configured workspace"
run = """
terraform init
terraform workspace select $TF_WORKSPACE
terraform plan
"""
[tasks.deploy]
description = "Deploy infrastructure after validation"
depends = ["validate", "plan"]
run = "terraform apply -auto-approve" Community Reception
- Widely praised for simplicity and speed
- Strong adoption from developers transitioning from asdf
- Recommended for both development and build automation
- 23k+ stars on GitHub
- Active community on Discord
Strengths
✅ Speed: Rust implementation is significantly faster than bash-based tools
✅ Unified interface: One tool replaces many (asdf, nvm, pyenv, rbenv, direnv, make)
✅ Easy migration: Works with existing .tool-versions files
✅ Developer experience: Intuitive commands and clear error messages
✅ Windows support: Unlike asdf, works on Windows
✅ Comprehensive: Includes task runner and environment management
✅ Plugin ecosystem: Leverages 100+ asdf plugins
Limitations
⚠️ Requires tool reinstallation when migrating from asdf (not reusing asdf directories)
⚠️ Some edge cases with IDE integration (VS Code pathing)
⚠️ Maintainer-driven project (fewer community contributions)
Installation Methods
- Curl script:
curl https://mise.run | sh - Homebrew:
brew install mise - Apt (Debian/Ubuntu):
apt install mise - DNF (Fedora 41+):
dnf install mise - Nix: nix package
- Snap: beta available
Related Concepts
- asdf - Tool version manager (predecessor)
- nvm - Node version manager
- pyenv - Python version manager
- direnv - Environment management
- Task Runners - Build automation tools
- Development Environments
Last updated: January 2025
Confidence: High (official documentation)
Status: Active development, v2026.1.6
Creator: @jdx
GitHub: https://github.com/jdx/mise
Discord: https://discord.gg/mABnUDvP57
Stars: 23.3k+
License: MIT