mise-en-place
The front-end to your dev env Pronounced "MEEZ ahn plahs"
- site: https://mise.jdx.dev/
The dotfiles history watcher no longer records files as deleted when a checkpoint and a sync compose snapshots at the same time, mise dot track --encrypt enrolls a file with encrypted history from its first checkpoint, mise bootstrap --adopt --replace-history discards unrelated local history in one shot, and pypi: tools gain lock-aware with, expose, and dependency_prereleases options. Also fixed: packslip: installs from private GitHub repositories, stale history watchers after upgrading, global npm tools being reinstalled under lockfile = true, and the -- separator in activated PowerShell sessions.
Added
-
dotfiles:
mise dot track --encryptwritesencrypt = trueinto the tracked declaration and encrypts the initial baseline checkpoint, for files that must never have plaintext history.[history.encryption].recipientsmust be configured first; if the encrypted baseline cannot be saved, enrollment fails closed and rolls back the declaration without committing history metadata. Run it as a standalone command rather than insidemise dot capture. Enabling encryption on a file that already has plaintext history does not rewrite that history. (#13180 by @jdx)mise dot track ~/.config/app/credentials --encrypt -
bootstrap: Fresh
mise bootstrap --adoptnow compares existing live files against the incoming setup before creating any local history, so identical files adopt the origin's history instead of being rejected as an unrelated root (for example right after the history store was removed). Differences still pause for an explicit decision. For machines that genuinely hold unrelated local history,--replace-historydiscards it and adopts the setup repository's branch in one shot;--dry-runpreviews the local and origin commits, and a failed replacement restores the previous branch and sync state. Ordinary sync never replaces divergent history and there is no persistent force setting. (#13182 by @jdx)mise bootstrap --adopt <url> --replace-history --yes -
pypi: Three new tool options express common uv install behavior without opaque
uvx_args, and unlike free-form arguments they participate in dependency graph locking:withinstalls extra requirements,exposeinstalls extra requirements and links their executables (requires uv 0.8.5 or newer), anddependency_prereleasessets uv's prerelease policy (disallow,allow,if-necessary,explicit). Setting any of them selects uv as the installer.uvx_argsandpipx_argsremain available as version-only escape hatches. The Ansible and Azure CLI registry entries now use these options by default; if you force pipx for one of them, clear the default with an empty list, e.g."pypi:ansible" = { version = "latest", uvx = false, expose = [], pipx_args = "--include-deps" }. (#13181 by @jdx)[tools] "pypi:azure-cli" = { version = "latest", with = ["pip"], dependency_prereleases = "allow" } "pypi:ansible" = { version = "latest", expose = ["ansible-core"] } -
registry: Added
nubr(npm:@nubjs/runner), the Nub project's TypeScript runner for a file,package.jsonscript, or installed bin on plain Node. (#13191 by @colinhacks)
Fixed
- dotfiles: With
history.sync = "sync"and a running watcher, a checkpoint could record a sorted prefix of tracked files as deleted even though they were untouched on disk; those deletions then synced to other machines and removed their copies. Two compositions in one process (the watcher's checkpoint and the sync it started) shared a single scratch git index, and one resetting it mid-flight truncated the other's tree. Each composition now uses its own scratch index, and indexes left by killed processes are swept. Files recorded as falsely deleted are still in history and can be restored from an earlier checkpoint. (#13195 by @jdx) - dotfiles: A history watcher started before mise 2026.9.5 (which moved history locks into
$MISE_STATE_DIR/history/), or started with a differentMISE_STATE_DIRthan the shell, kept running the old process without watching the current store, whilemise bootstrap services applyconsidered the unchanged service converged and skipped it.services applynow restarts ahistory-watchservice whose process is not watching this store, andmise doctorandmise dot statusreport "running but not watching this store" instead of "not running" (service-not-watchinginmise dot status --json). Users already in this state are recovered by runningmise bootstrap services apply. (#13190 by @jdx) - npm: With
lockfile = truein effect, an npm tool pinned in the global config was resolved with a graph-specific install identity that no automatic flow could persist, so everymise exectreated the installed tool as unsatisfied, re-ran an install pass, and warned that it was missing. Global requests now stay version-only unless resolved from an explicitly generated revision 2 global lockfile; opt in withmise lock --global. (#13186 by @jdx) - packslip: Installing from a private GitHub repository failed with
404 Not Foundon the manifest because GitHub only serves private release assets through its API, not thereleases/download/URLs a packslip records. mise now falls back to the API asset endpoint using the same credentials as thegithub:backend (MISE_GITHUB_TOKEN,GITHUB_API_TOKEN, orGITHUB_TOKEN) with no configuration changes; signature, identity, digest, and size verification are unchanged. Tags containing/(such as@biomejs/biome@2.5.2or monorepotool/v1.0.0tags) and#are also resolved correctly now. Non-GitHub hosts and GitHub Enterprise are not covered. (#13188 by @jdx) - activate: In a shell activated with
mise activate pwsh,mise exec -- pnpm --versionfailed withunexpected argument '--version'because PowerShell's parameter binder removes the first bare--before themisewrapper function sees its arguments. The wrapper now recovers the separator from the raw invocation line, fixingmise exec/mise x,mise tasks add,mise dotfiles capture,mise oci run,mise generate git-pre-commit, andmise bootstrap;mise runwas not affected. Open sessions pick up the fix the next timemise activate pwshruns (normally at shell start). The doubledmise exec -- -- cmdworkaround now fails in an activated shell, as it always did without activation, so drop back to a single--. (#13202 by @jdx) - registry: The
dbt-fusioninstall test now expectsdbt <version>, matching whatdbt --versionactually prints. (873c400 by @jdx)
Documentation
- The GitHub star count on mise.jdx.dev now also appears in the nav overflow menu at medium viewport widths. (#13193 by @jdx)
Full Changelog: https://github.com/jdx/mise/compare/v2026.9.8...v2026.9.9
💚 Sponsor mise
mise is built and maintained by @jdx, an open source developer at 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. Your support funds ongoing development and helps keep mise fast, free, and independent.