Skip to content
Back to skills

Mise

BSecurity

Manages per-project tool versions (Node.js, Python, Go, Rust, Ruby and hundreds more), environment variables and tasks from one mise.toml file, as a single binary that replaces nvm, pyenv, rbenv and asdf. Use when a user asks to pin Node.js/Python/Go versions per project, replace nvm/pyenv/asdf, share tool requirements with a team or CI, lock resolved versions, or define project tasks.

  • 142 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 6, 2026
databasespythonrustgorubyshellbashsqlnodegitapi

Works with

  • terminal
  • cli
  • api

Security analysis

B75/100
  • criticalModifies startup scripts or system services for persistence
  • criticalModifies startup scripts or system services for persistence

Pro scans all 2 files and shows the line behind each finding

Scanned October 4, 2026

npx -y skills add TerminalSkills/skills --skill mise --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Mise?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Mise
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/terminalskills-mise/badge)](https://www.skillsdirectory.com/skills/terminalskills-mise)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: mise
description: >-
  Manages per-project tool versions (Node.js, Python, Go, Rust, Ruby and hundreds more), environment variables and tasks from one mise.toml file, as a single binary that replaces nvm, pyenv, rbenv and asdf. Use when a user asks to pin Node.js/Python/Go versions per project, replace nvm/pyenv/asdf, share tool requirements with a team or CI, lock resolved versions, or define project tasks.
license: Apache-2.0
compatibility: "Linux (glibc 2.18+ or musl), macOS, Windows, WSL. Installs from Homebrew, apt, dnf, pacman, apk, Scoop, winget, cargo or a release binary."
metadata:
  author: terminal-skills
  version: "1.1.0"
  category: development
  tags:
    - mise
    - version-manager
    - asdf
    - nvm
    - polyglot
  repository: https://github.com/jdx/mise
---

# mise

## Overview

mise (pronounced "meez", formerly rtx) is one command-line tool for three jobs: install and switch language and CLI tool versions per project (replacing nvm, pyenv, rbenv and asdf), set project environment variables, and run named tasks (replacing many Makefile and `package.json` script uses). Everything for a project lives in `mise.toml`. Releases are date-versioned (checked against 2026.10). It is written in Rust and ships as a single binary.

## Instructions

### Step 1: Install

Prefer your system package manager, so mise updates with everything else:

```bash
brew install mise                                   # macOS, Linux
sudo apt install -y extrepo && sudo extrepo enable mise \
  && sudo apt update && sudo apt install -y mise    # Debian 11+, Ubuntu 22.04+
sudo dnf copr enable jdxcode/mise && sudo dnf install mise   # Fedora 41+
sudo pacman -S mise                                 # Arch
apk add mise                                        # Alpine
scoop install mise                                  # Windows (or: winget install jdx.mise)
cargo binstall mise                                 # any platform with Rust
```

The official installer (`mise.run`) also exists, but do not pipe it into a shell: the docs describe downloading `install.sh.sig` and checking it with `gpg` against the release key first. Check with `mise --version`.

### Step 2: Try a tool without changing anything

```bash
mise exec node@24 -- node --version     # downloads Node.js 24 if needed, runs the command
```

### Step 3: Set up a project

```bash
cd ~/work/orders-api
mise use node@24 python@3.12           # installs both and writes them to mise.toml
```

```toml
# mise.toml
[tools]
node = "24"            # "24" means the newest 24.x, not an exact pin
python = "3.12"
go = "1.24"

[env]
DATABASE_URL = "postgresql://localhost:5432/orders"
NODE_ENV = "development"

[tasks.dev]
description = "Start the API in watch mode"
run = "npm run dev"

[tasks.test]
description = "Run unit tests"
depends = ["lint"]
run = ["npm test", "./scripts/test-e2e.sh"]   # an array runs in series

[tasks.lint]
run = "npm run lint"
```

```bash
mise install            # install everything declared (what a teammate runs after cloning)
mise run test           # runs lint first, then the test commands
mise tasks ls           # list tasks
mise ls --current       # which versions are active here
mise config ls          # which config files are in effect
```

`mise use --global node@24` writes a personal default to the global config instead. Project config overrides global.

### Step 4: Activate in your shell (optional)

Activation puts the selected tools on `PATH` whenever you `cd`. Add the line once, then restart the shell:

```bash
echo 'eval "$(mise activate bash)"' >> ~/.bashrc    # zsh: mise activate zsh >> ~/.zshrc
mise doctor                                          # verify the setup
```

For installs made with the standalone binary, use the full path `~/.local/bin/mise` inside the line. Editors and IDEs that do not read shell config can use shims (`mise activate --shims`). Without any activation, `mise exec -- cmd` and `mise run task` still load the project environment, which is the right choice in CI and scripts.

### Step 5: Lock versions for the team

```bash
mise lock               # record resolved versions and checksums in mise.lock
mise install --locked   # install exactly what the lockfile says
mise lock --bump node   # move one tool forward within its range
```

Commit `mise.toml` and `mise.lock`. Keep `package-lock.json` or `uv.lock` too; mise locks tools, not application dependencies.

### File tasks and existing version files

A script in `mise-tasks/` (or `.mise/tasks/`), made executable with `chmod +x`, becomes a task named after the file; metadata goes in comments such as `#MISE description="Build the CLI"`.

`.tool-versions` (asdf format) is read as before. Idiomatic files such as `.node-version`, `.python-version` and `.nvmrc` are off by default and enabled per tool:

```bash
mise settings add idiomatic_version_file_enable_tools node
mise settings add idiomatic_version_file_enable_tools python
```

## Examples

### Example 1: Replace nvm in an existing Node.js repository

Request: "This repo has an .nvmrc with 22; switch us from nvm to mise."

```bash
brew install mise
cd ~/work/storefront
mise use node@22          # writes [tools] node = "22" to mise.toml
mise exec -- node --version
```

Output ends with a `v22.x.y` line, and `mise.toml` appears in the repo. Remove the nvm lines from the shell rc file, add the `mise activate` line from step 4, and commit `mise.toml`. Teammates run `mise install` once.

### Example 2: A reproducible CI job

Request: "CI should use the same Go and Node versions as local development."

```bash
mise lock
git add mise.toml mise.lock && git commit -m "Pin tool versions"
```

In the pipeline, after installing mise from the runner's package manager:

```bash
mise install --locked
mise run test
```

`mise run` installs missing tools and loads `[env]` before running each task, so the job needs no separate setup steps. If `mise install --locked` fails with a missing entry, run `mise lock` locally and commit the updated file.

## Guidelines

- Review a project's `mise.toml` before trusting it: tasks, hooks and some `[env]` directives execute code. `mise trust` marks a reviewed config as trusted; in normal mode `mise install`, `exec` and `run` trust the active config automatically, while paranoid mode requires explicit trust.
- Put mise flags before the task name (`mise run --silent build`); flags after it go to the task.
- `node = "24"` follows new 24.x releases; use an exact version or `mise.lock` when builds must be reproducible.
- Keep mise itself current. Upstream registries change, and old releases lose working tool sources. `mise self-update` works for standalone installs; package-manager installs update through the package manager.
- Remove nvm, pyenv and asdf hooks from your shell rc file after switching, so two version managers do not compete for `PATH`.
- Tasks replace simple Makefile or `package.json` scripts, but for a large build graph a dedicated build tool is still the better choice.

Files in this skill

  • SKILL.md1.2 KB
  • _scores.json2 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…