v2026.9.6
jdx/misev2026.9.6Sep 12, 2026by mise-en-dev
Upgrading?
AI Summary
This release introduces experimental project daemons managed by Pitchfork, a `mise doctor project` command for custom diagnostics, and vfox backend tool discovery. It also improves performance for lockfile generation and OCI builds, along with various fixes for shells, monorepos, and bootstrap processes.
Key Highlights
- New `[daemons]` section allows managing background processes like PostgreSQL and Redis via Pitchfork.
- `mise doctor project` enables projects to declare custom environment checks.
- vfox backend plugins now contribute tools to `mise search` and `mise use`.
- HTTP tools now extract to their own directory by default, improving cleanup via `uninstall` and `prune`.
- Performance improvements skip needless lockfile rewrites for warm `lockfile_mode = "generate"` installs.
Breaking Changes
- HTTP tools now extract into their own install directory by default. To revert to the previous deduplicated symlink layout, set `shared_extraction = true`.
- PostgreSQL, Redis, and MongoDB registry backends now prefer the `conda:` backend instead of vfox/asdf.
New Features
- Project daemons with configuration for auto-start/stop on shell entry.
- `mise doctor project` command with custom checks defined in `[doctor.checks.<name>]`.
- vfox backend integration for tool discovery in `mise search` and shell completion.
- New `settings.truncate` option and `--no-truncate` flag for terminal output.
- [bootstrap.macos.dock] support for pinning application paths with the `apps` list.
- OCI build support for `--no-cache` and local tool-layer caching.
- Dotfile variant entries can omit `source` when `target` is set.
- Automatic sorting of lists with no inherent order in `mise fmt`.
Full Release Notes
This release adds experimental project daemons backed by pitchfork, a `mise doctor project` command for project-declared diagnostic checks, and tool discovery from vfox backend plugins in `mise search`. It also changes the HTTP backend's default install layout so uninstall and prune reclaim disk space, speeds up warm `lockfile_mode = "generate"` installs and repeated OCI builds, and fixes a batch of nushell, monorepo, lockfile, brew, and Windows bootstrap issues.
## Highlights
- **Services next to tools:** `[daemons]` declares background processes and PostgreSQL/Redis presets in `mise.toml`, managed through `mise daemons` and optionally started when you enter the project. `[doctor.checks.<name>]` lets projects declare their own environment probes for `mise doctor project`.
- **Discovery and output:** `mise search`, shell completion, and interactive `mise use` now include tools published by installed vfox backend plugins, and `settings.truncate` / `--no-truncate` disable terminal-width truncation (automatically when a coding agent is detected).
- **Storage and speed:** HTTP tools now extract into their own install directory by default (opt back into deduplication with `shared_extraction = true`), warm generate-mode installs skip needless lockfile rewrites, and OCI builds share a local tool-layer cache.
## Added
- **daemons:** New experimental `[daemons]` section and `mise daemons` command family (`start`, `stop`, `restart`, `ls`, `status`, `logs`, `tui`) manage project background processes with pitchfork. PostgreSQL and Redis presets install the database as a tool (participating in lockfiles), supply connection environment variables and readiness checks, and keep project data across stop/start. Daemons with `auto = ["start", "stop"]` start when entering the project from an activated Bash, Zsh, or Fish shell and are released when the last shell session leaves. Requires `experimental = true` and pitchfork 2.25.0 or later; database presets are Unix-only and PostgreSQL uses loopback trust authentication intended for local development. ([#13085](https://github.com/jdx/mise/pull/13085) by @jdx)
```toml
[settings]
experimental = true
[daemons]
postgres = "18"
redis = "8"
[daemons.web]
run = "npm run dev"
port = 3000
auto = ["start", "stop"]
```
- **doctor:** `mise doctor project` runs checks declared in `[doctor.checks.<name>]` with the project's environment and installed tools, reporting PASS/FAIL/error/skipped per check in text or `--json`. Checks support `description`, `hint`, `timeout` (default `10s`), `dir`, `shell`, and `os` selectors, run concurrently under the `jobs` limit, and exit nonzero when any check fails. Ordinary `mise doctor` does not run them, and hints are never executed. A follow-up aligned `dir` resolution with task conventions (config root for project configs including `~/mise.toml`, `~/` expansion), fixed head-of-line blocking when one probe hangs, and kept `nohup mise doctor project` alive on SIGHUP. ([#13062](https://github.com/jdx/mise/pull/13062), [#13089](https://github.com/jdx/mise/pull/13089) by @jdx)
```toml
[doctor.checks.openssl]
description = "OpenSSL development files are discoverable"
run = "pkg-config --exists openssl"
hint = "Run `mise bootstrap packages apply` to install the declared build dependencies."
timeout = "5s"
os = ["linux", "macos"]
```
- **vfox:** Tools provided by installed vfox backend plugins now appear in `mise search`, shell completion, and interactive `mise use`, namespaced as `<plugin>:<tool>`. Plugins can implement `BackendListTools` for a finite catalog and/or `BackendSearchTools` for query-driven discovery in large ecosystems; a prefixed query like `npm:eslint` is routed only to that plugin. Results are cached, slow plugins fall back to stale cache, and existing plugins need no changes. `mise registry` remains registry-only. ([#13111](https://github.com/jdx/mise/pull/13111) by @jdx)
- **cli:** New `settings.truncate` (and `MISE_TRUNCATE`, default `true`) controls terminal-width shortening of table cells and task metadata. `mise ls`, `mise config ls`, and `mise bootstrap dotfiles status` gain `--truncate` / `--no-truncate`, and output is kept complete automatically when a known coding agent is detected. ([#13112](https://github.com/jdx/mise/pull/13112) by @jdx)
```sh
mise bootstrap dotfiles status --no-truncate
```
- **bootstrap:** `[bootstrap.macos.dock]` gains `apps`, an ordered list of pinned application paths. Status compares identity and order (ignoring Dock-added metadata), apply adds, removes, and reorders application tiles while preserving other tiles and `persistent-others`, and an empty list removes all application tiles. Paths must be absolute or home-relative `.app` bundles. ([#13075](https://github.com/jdx/mise/pull/13075) by @azohra)
```toml
[bootstrap.macos.dock]
apps = [
"/System/Applications/Utilities/Terminal.app",
"/Applications/Firefox.app",
]
```
- **bootstrap:** `mise bootstrap packages where brew:<formula>` prints an installed formula's stable `opt` root (for example `/opt/homebrew/opt/unzip`), so scripts can put keg-only executables on PATH without hardcoding the Homebrew prefix or Cellar version. Missing installs exit nonzero with empty stdout. ([#13083](https://github.com/jdx/mise/pull/13083) by @himkt)
- **dotfiles:** Destination `variants` can omit `source` when every variant sets a `target`; the entry key is then resolved as a relative path under `settings.dotfiles.root` instead of next to `mise.toml`. Parent traversal is rejected. ([#13087](https://github.com/jdx/mise/pull/13087) by @jdx)
```toml
[dotfiles."vscode/settings.json"]
mode = "copy"
variants = [
{ os = "macos", target = "~/Library/Application Support/Code/User/settings.json" },
{ os = "linux", target = "~/.config/Code/User/settings.json" },
]
```
- **fmt:** `mise fmt` now sorts lists whose order has no meaning: `redactions` lexically, and task `sources`/`outputs`, `task_templates` sources/outputs, `task_config.global_inputs`, and `input_groups` by reach (`@group:` references, then globs, then literal paths). Lists containing `!` exclusions, entries starting with template syntax, or comments are left untouched, and precedence-sensitive lists such as `env_file`, `tools.*`, `includes`, and `depends` are never sorted. ([#13058](https://github.com/jdx/mise/pull/13058) by @jrandolf)
- **oci:** `mise oci build` gains `--no-cache` to bypass the new local tool-layer cache; entries live under each tool's cache directory and are removed by `mise cache clear TOOL`. ([#13056](https://github.com/jdx/mise/pull/13056) by @jdx)
## Changed
- **http:** New `http:` installations extract directly into their own install directory, so `mise uninstall` and `mise prune` now remove their files instead of leaving payloads in `$MISE_DATA_DIR/http-tarballs/`. Set `shared_extraction = true` on a tool to keep the previous deduplicated symlink layout. Existing symlinked installs keep working; `mise install --force <tool>` migrates one to independent files without disturbing other installs that share the content. Legacy `http-tarballs` entries are not reclaimed automatically. Shared raw and compressed binary caches now also include the executable filename in their key, so differently named tools no longer reuse the wrong filename. ([#13059](https://github.com/jdx/mise/pull/13059) by @jdx)
- **oci:** `mise oci push --no-cache` now bypasses both the remote registry cache and the local tool-layer cache. ([#13056](https://github.com/jdx/mise/pull/13056) by @jdx)
- **registry:** `postgres`, `redis`, and `mongodb` now prefer `conda:` backends, installing prebuilt conda-forge binaries in seconds instead of compiling through vfox; vfox and asdf remain as fallbacks. `conda:redis-server` covers Linux and macOS only. ([#13061](https://github.com/jdx/mise/pull/13061) by @jdx)
## Performance
- **lockfile:** Warm `mise install` runs in `lockfile_mode = "generate"` skip scheduling work for tools whose artifact metadata is already reusable, and skip rebuilding, serializing, and staging the lockfile entirely when nothing was installed and the on-disk lock already matches (preserving comments in the file). Explicit `mise lock`, forced provenance verification, upgrades, and new platforms still regenerate. ([#13101](https://github.com/jdx/mise/pull/13101), [#13103](https://github.com/jdx/mise/pull/13103) by @jdx)
- **oci:** `mise oci push --from BASE` no longer downloads base layers when the base and target live in the same repository, and `oci build`, `oci run`, and `oci push` share a local cache of packaged tool layers keyed on file contents, so repeated builds with overlapping tools skip tar and gzip work. ([#13055](https://github.com/jdx/mise/pull/13055), [#13056](https://github.com/jdx/mise/pull/13056) by @jdx)
## Fixed
- **nushell:** `mise activate nu` no longer throws `env_variable_not_found` on every prompt or `cd` when a variable to hide is absent from the current scope; `hide-env` is now wrapped in `try`, matching the no-op behavior of other shells. ([#13071](https://github.com/jdx/mise/pull/13071) by @i-api)
- **task:** Task-level tools are now auto-installed for tasks referenced from `run` entries, including names rendered at runtime, right before they execute; `--skip-tools` is honored and install failures are reported as task failures without blocking siblings. ([#13086](https://github.com/jdx/mise/pull/13086) by @jdx)
- **config:** `[monorepo]` settings are now merged across same-directory config layers (base plus `mise.<env>.toml` overlays): omitted fields are inherited, an overlay's `config_roots` replaces the base list, and `monorepo_root = false` in an overlay disables the root and its descendant trust. ([#13084](https://github.com/jdx/mise/pull/13084) by @jdx)
- **lockfile:** Runtime tool requests such as `mise which hk --tool hk@latest` now use the lockfile belonging to the config that effectively defines the tool, instead of merging project and global pins and reporting a false "multiple resolutions" ambiguity or selecting an overridden pin. `mise which --tool` warns when a lower-precedence config has a matching pin the effective config lacks. ([#13042](https://github.com/jdx/mise/pull/13042) by @nettlesh)
- **lockfile:** Complete lockfile generation for Packslip tools skips platforms with no published artifact while still writing supported targets, and a verified Packslip signer may now replace legacy `github-attestations` metadata on upgrade instead of being rejected as a provenance downgrade. ([#13102](https://github.com/jdx/mise/pull/13102), [#13105](https://github.com/jdx/mise/pull/13105) by @jdx)
- **upgrade:** `mise upgrade` now detects updates between letter-suffixed versions such as tmux `3.7b` to `3.7c`; `sub-N` aliases keep resolving numeric components as before. ([#13119](https://github.com/jdx/mise/pull/13119) by @jdx)
- **brew:** Formulae that are keg-only solely because macOS ships them (such as `brew:zip` and `brew:unzip`) are now linked into `<prefix>/bin` on Linux, matching Homebrew. Kegs installed by earlier mise versions stay unlinked until the next `mise bootstrap packages upgrade` or a reinstall. ([#13108](https://github.com/jdx/mise/pull/13108) by @lil-lon)
- **brew-cask:** Tap casks with `preflight_steps` or `postflight_steps` no longer fail during metadata extraction; declarative `run` steps are captured as structured steps and executed by mise, with support for `must_succeed = false`. ([#13060](https://github.com/jdx/mise/pull/13060) by @jdx)
- **bootstrap:** `mise bootstrap remote` on Windows now finds `ssh.exe` and `tar.exe` on PATH instead of failing with `required command 'ssh' not found`. ([#13117](https://github.com/jdx/mise/pull/13117) by @JamBalaya56562)
- **bootstrap:** macOS defaults status explains type mismatches, showing for example `2 (real; expected integer)` instead of two identical-looking values marked `differs`. ([#13096](https://github.com/jdx/mise/pull/13096) by @jdx)
- **dotfiles:** `mise bootstrap dotfiles track` honors the global `yes` setting for confirmations, and warns when tracking a symlink whose resolved source is not itself tracked, suggesting the command to enroll it. ([#13072](https://github.com/jdx/mise/pull/13072) by @nettlesh, [#13095](https://github.com/jdx/mise/pull/13095) by @jdx)
- **schema:** The JSON schema now models Git directory `manifest` dotfile entries, restricting explicit modes to `copy` or `symlink-each` and rejecting combinations with inline content or file-edit fields. ([#12741](https://github.com/jdx/mise/pull/12741) by @risu729)
- **asdf:** `mise asdf install` and `mise asdf reshim` no longer re-enter the full CLI dispatch, avoiding stack overflows on small-stack Linux environments; `asdf install` now follows the same implicit config trust as `mise install`. Bash completions are regenerated for the updated usage-rs word-break handling. ([#13114](https://github.com/jdx/mise/pull/13114) by @jdx)
## Registry
- Added `mpv` (`conda:mpv`, Linux and macOS) ([#13049](https://github.com/jdx/mise/pull/13049) by @i-api), `agent-browser` (`aqua:vercel-labs/agent-browser`) ([#13088](https://github.com/jdx/mise/pull/13088) by @3w36zj6), and `himalaya` (`github:pimalaya/himalaya`) ([#13091](https://github.com/jdx/mise/pull/13091) by @i-api).
- `editorconfig-checker` installs again after 4.0.1 renamed its assets and executable; the shorthand now uses the GitHub backend. ([#13098](https://github.com/jdx/mise/pull/13098) by @jdx)
- `mc` installs from MinIO's GitHub releases instead of the retired Aqua download URL that returned HTTP 410. ([#13113](https://github.com/jdx/mise/pull/13113) by @jdx)
## Documentation
- The docs landing page gains interactive diagrams for project environment switching, bootstrap machine resources, tool configuration precedence, artifact cache execution, and tracked dotfile synchronization. ([#13065](https://github.com/jdx/mise/pull/13065), [#13066](https://github.com/jdx/mise/pull/13066), [#13067](https://github.com/jdx/mise/pull/13067), [#13068](https://github.com/jdx/mise/pull/13068), [#13069](https://github.com/jdx/mise/pull/13069) by @jdx)
- The task-running guide is reorganized around finding and running tasks, passing arguments, then controlling execution. ([#13077](https://github.com/jdx/mise/pull/13077) by @azohra)
## New Contributors
- @lil-lon made their first contribution in [#13108](https://github.com/jdx/mise/pull/13108)
**Full Changelog**: https://github.com/jdx/mise/compare/v2026.9.5...v2026.9.6
## 💚 Sponsor mise
mise is built and maintained by [@jdx](https://github.com/jdx), an open source developer at [**entire.io**](https://entire.io/), the title sponsor of his open source work.
If mise saves you or your team time, please consider becoming an [individual or company sponsor](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.
Related Repositories
A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io
An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.
Build smaller, faster, and more secure desktop and mobile applications with a web frontend.
π RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.
Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one