CLI tool
jdx/mise avatar
jdx/mise

mise: One Rust CLI to Replace Your Version Manager, Env Loader, and Task Runner

dev tools, env vars, task runner. mise prepares your development environment before each command runs.

36,149 stars1,536 forksRustMIT

At a glance

What is it?
mise is a single Rust binary that installs dev tools, loads per-project environment variables, and runs tasks from one mise.toml file. It targets developers who want a unified workflow, but its breadth comes with a learning curve.
Who is it for?
Adopt mise if you manage multiple projects with differing tool versions and env vars, and you want a single config file that CI and local shells both read. Skip it if you already have a stable combination of asdf, direnv, and Make and don't want to migrate.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Rust, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • jdx/mise36,149 ★ · +4,925
Star history
Repository2026-07-282026-11-14
jdx/mise31.2k36.1k

4,925 Stars in the last 109 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

The problem mise solves: three tools, one config file

Most developers juggle a version manager like nvm or asdf, a directory-based env loader like direnv, and a task runner like Make or npm scripts. Each has its own config format, its own shell hook, and its own quirks. mise collapses all three into a single mise.toml file. The README states that it "prepares your development environment before each command runs," which means every new shell, fresh checkout, or CI job starts from the same setup. The target user is someone who is tired of synchronizing three separate configs and wants a single source of truth. The project is written in Rust.

How mise works: real paths, not shims

The core mechanism is the shell hook. You add a line to your shell config, like eval "$(~/.local/bin/mise activate bash)", and mise updates PATH and project environment variables whenever you change directories. The README also points to shims for IDE and CI use. When you run mise exec node@24 -- node --version, mise installs the specified version if needed, then executes the command with that version's bin directory prepended to PATH. The mise.toml file defines tools, env vars, and tasks. For tools, mise installs them on demand; for env, it sets variables in the current shell; for tasks, it runs shell commands with the configured environment.

Getting started: install, hook, and configure

The quickstart is simple. Install with curl -fsSL https://mise.run | sh, which puts the binary at ~/.local/bin/mise. Then add a shell hook. The README gives exact lines for bash, zsh, and fish, and points to Shell setup for PowerShell and others. For bash it is eval "$(~/.local/bin/mise activate bash)" appended to ~/.bashrc. After that, you can install tools globally with mise use --global node@24. To set env vars, create a mise.toml with an [env] section and use mise set NODE_ENV=development to set one. Tasks go in the same file under [tasks.build] with a run key. The README's example project selects Node.js 24, sets NODE_ENV and adds a hello task, which you run with mise run hello. Commit mise.toml so teammates and CI get the same setup when they run mise install or mise run.

The trade-off: one config means one way to do things

mise's strength is also its limitation. By merging tools, env, and tasks into one file, it forces a specific structure. If you have complex shell logic in your Makefile or you rely on direnv's ability to run arbitrary shell commands, mise's [env] section may not cover all cases. The recent release titles mention editing tasks from the CLI, container daemons and dotfile groups, which suggest the tool is still evolving. If you need a stable, long-term tool, this rapid pace might be a concern.

Alternatives: asdf, direnv, and Make, separately

The most direct alternative is to use asdf for tool versions, direnv for environment variables, and Make or a script runner for tasks. direnv can run arbitrary shell code on directory change, which is more flexible than mise's declarative env section. Make is a battle-tested task runner with pattern rules and parallel execution, while mise tasks support dependencies, parallel execution and file watching. The difference is that with asdf+direnv+Make, you have three configs (.tool-versions, .envrc, Makefile) and three tools to learn, but each is mature and has a large community. mise offers a single binary and a single config, but you trade that for a younger project. If you already use .tool-versions files, the README says mise can keep reading them as they are. The choice is between integration and maturity.

Maintenance and licensing: MIT with a fast release cadence

mise is licensed under MIT, which is permissive and allows commercial use without restriction. The repository shows recent releases about daily, like v2026.10.25 on 2026-10-31, v2026.10.24 on 2026-10-30 and v2026.10.23 on 2026-10-29. That is a rapid cadence, which means you get fixes quickly but also need to track updates. For an engineer adopting mise, the cost is learning the config format and staying current with releases. The Rust implementation means a single binary, but you still need to update it.

Editorial conclusion

Adopt mise if you manage multiple projects with differing tool versions and env vars, and you want a single config file that CI and local shells both read. Skip it if you already have a stable combination of asdf, direnv, and Make and don't want to migrate. Before adopting, verify that the tools you need exist in the mise registry, check how your shell hook behaves with your existing prompt, and test the task dependency behavior on your CI runner. If you need a mature, battle-tested ecosystem, asdf remains a safer bet; if you want a modern, integrated approach, mise is worth a trial on a non-critical project.

Frequently asked questions

What is mise used for?

mise manages development tools, environment variables and project tasks. You declare them in mise.toml, commit the file, and get the same setup in your shell, your editor and CI: tools with different versions per project, project env vars and .env loading, tasks that run with the tools and environment they need, and bootstrap for system packages, dotfiles and services.

What does Mise toml do?

It is the file you commit to declare a project's tools, environment and tasks. A minimal one sets node = "24" under [tools], sets NODE_ENV under [env], and defines a named task with a run line, after which `mise run hello` installs the tool if needed, loads the variable and runs the command.

How do I activate Mise?

Activation is optional and per shell. For an install from mise.run you add one line to the matching config, for example eval "$(~/.local/bin/mise activate bash)" in ~/.bashrc, then restart the shell.

Can I install mise globally?

`mise use --global` sets personal defaults, as against `mise use` from a project directory, which adds the tool to that project's configuration. On macOS and Linux the install itself is `curl https://mise.run | sh`, and on Windows it is `winget install jdx.mise`.

what is jdx mise

jdx is Jeff Dickey, the author named in Cargo.toml, and mise is the Rust CLI he maintains for dev tools, env vars and tasks, MIT licensed with its documentation at mise.jdx.dev. The workspace is split into member crates including mise-shim, mise-bootstrap, mise-cache-core, mise-sigstore and vfox.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/jdx-mise.svg)](https://hysenlabs.com/projects/jdx-mise)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/jdx-mise.svg)](https://hysenlabs.com/projects/jdx-mise)

Was this useful?