2.3.1 (2026-06-11)
- fs: implement rmrf natively via libuv (#2098) (8838e7a)
- nuget: also support .cmd shims on Windows (#2102) (16ba83b)
2.3.0 (2026-05-22)
- add support for socket.dev firewall client (#2088) (24e77d5)
- add the infrastructure to support "system" packages (#2085) (8e921c2)
- npm: add
install_argssetting (#1581) (8fdc4b0) - registry: add registry_cache setting for controlling cache behaviour (#2089) (cbf8d28)
- actually emit the receipt in uninstall event payloads (#2071) (b03fb0f)
- powershell: conform to single quotes (#1740) (12ddd18)
- pypi: add python 3.13 and 3.14 to list of fallbacks (#2081) (e54f5bf)
- spawn: handle cases where PATH env on Windows is not set (#2080) (cb8445f)
2.2.1 (2026-01-07)
2.2.0 (2026-01-07)
- installer: attempt to recover from known fs error while finalizing installation on some file systems (#1933) (198f075)
- installer: update cwd after uv_fs_rename() was successful (#2033) (57e5a8a)
2.1.0 (2025-09-30)
- process: close check handles (#1995) (a1fbecc)
- pypi: add support for "compatible release" (~=) PEP440 expressions (#2000) (9e25c98)
- spawn: always expand executable path on Windows (#2021) (a83eabd)
- ui: only set border to none if
'winborder'doesn't exist (#1984) (3671ab0)
2.0.1 (2025-07-25)
- fetch: add busybox wget support (#1829) (8024d64)
- pypi: pass --no-user flag (#1958) (1aceba8)
- registry: ensure there's no duplicate registry entries (#1957) (3501b0f)
- spawn: fix calling vim.fn when inside fast event loop on Windows (#1950) (888d6ee)
- spawn: fix locating exepath on Windows systems using a Unix
'shell'(#1991) (edd8f7b)
2.0.0 (2025-05-06)
This release has been an ongoing effort for quite some time now and is now ready for release. Most users should not
experience any breaking changes. If you use any of the Lua APIs that Mason provides you'll find an outline of the
changes below, breaking changes are marked with Breaking Change.
The repository has been transferred to the mason-org organization. The new URL is
https://github.com/mason-org/mason.nvim. The previous URL will continue to function as a redirect to the new URL but
users are recommended to update to the new location.
- Symlinks now uses relative paths instead of absolute paths.
- Uninstalled packages now display their available version in the
:MasonUI. - Packages in the
:MasonUI now display the sourcepurl. - Official support for custom registries.
- Make registry installations run concurrently.
- Add support for
'winborder'. - Display current
mason.nvimversion in the:MasonUI header.
- Only attempt unlinking package if the receipt is found.
- Expand executable paths on Windows before passing to uv_spawn.
- Fix initializing UI state when using multiple registries.
- Fix the display of outdated packages in the Mason UI under certain conditions.
Breaking ChangeMinimum Neovim requirement changed from 0.7.0 to 0.10.0.Breaking ChangeAPIs related to custom packages written in Lua has been removed.- All
require("mason-core.installer.managers")modules have been removed. - The package structure of Lua packages has changed, refer to custom registries for information on how to continue using custom packages in Lua.
- All
Breaking Changeinstall:successnow provides the receipt as payload argument.Breaking Changeinstall:failednow provides the error as payload argument.Breaking Changeuninstall:successnow provides the receipt of the uninstalled package as payload argument.uninstall:failedis now emitted when package uninstallation fails.
Breaking Changepackage:install:successnow provides the receipt as payload argument.Breaking Changepackage:install:failednow provides the error as payload argument.Breaking Changepackage:uninstall:successnow provides the receipt of the uninstalled package as payload argument.package:uninstall:failedis now emitted when package uninstallation fails.Breaking Changeupdateis no longer emitted when registry is updated. It's replaced by the following events:update:startwhen the registry starts updatingupdate:successwhen the registry is successfully updatedupdate:failedwhen the registry failed to updateupdate:progressis emitted when the registry update process makes progress when multiple registries are used
Breaking Change
This method has been removed to prepare for future changes.
If you're using this method to access an executable, please consider simply using the canonical name of the executable
as Mason adds these to your PATH by default. If you're using the method to access other files inside the package,
please consider accessing the $MASON/share directory instead.
Example:
Clarification: The $MASON environment variable has been available since v1.0.0.
-- 1a. There's no need to reach into the package directory via Package:get_install_path() to access the executable
print(vim.fn.exepath("kotlin-debug-adapter"))
-- /Users/william/.local/share/nvim/mason/bin/kotlin-debug-adapter
-- 1b. Alternatively if you've configured Mason to not modify PATH
print(vim.fn.expand("$MASON/bin/kotlin-debug-adapter"))
-- /Users/william/.local/share/nvim/mason/bin/kotlin-debug-adapter
-- 2. To access other files inside the package directory, consider accessing them via the share/ directory
vim.print(vim.fn.globpath("$MASON/share/java-debug-adapter", "*.jar", true, true))
-- { "/Users/william/.local/share/nvim/mason/share/java-debug-adapter/com.microsoft.java.debug.plugin-0.53.1.jar", "/Users/william/.local/share/nvim/mason/share/java-debug-adapter/com.microsoft.java.debug.plugin.jar" }
-- 3. If you absolutely need to access the package directory (please consider raising an issue/PR in the registry if possible)
print(vim.fn.expand("$MASON/packages/kotlin-debug-adapter/adapter/bin/kotlin-debug-adapter"))
-- /Users/william/.local/share/nvim/mason/packages/kotlin-debug-adapter/adapter/bin/kotlin-debug-adapterNote
Why was this method removed? The contents of the package directory is not a stable interface and its structure may
change without prior notice, for example to host multiple versions of a package. The only stable interfaces on the
file system are files available in bin/, share/ and opt/ - these directories are only subject to breaking
changes done by the underlying package itself.
Breaking Change
This method now provides an asynchronous interface and accepts two new optional arguments opts and callback. opts
currently doesn't have any valid values other than an empty Lua table {}. callback is called when the package is
uninstalled, successfully or not. While the uninstall mechanism under the hood remains synchronous for the time being it
is not a guarantee going forward and users are recommended to always use the asynchronous version.
Example:
local registry = require("mason-registry")
local pkg = registry.get_package("lua-language-server")
pkg:uninstall({}, function (success, result)
if success then
-- Do something on success.
else
-- Do something on error.
end
end)Breaking Change
Package:check_new_version() is replaced by Package:get_latest_version(). Package:get_latest_version() is a
synchronous API.
Note
Similarly to before, this function returns the package version provided by the currently installed registry version.
Example:
local registry = require("mason-registry")
local pkg = registry.get_package("lua-language-server")
local latest_version = pkg:get_latest_version()Breaking Change
This function no longer accepts a callback.
Example:
local registry = require("mason-registry")
local pkg = registry.get_package("lua-language-server")
if pkg:is_installed() then
local installed_version = pkg:get_installed_version()
endBreaking Change
Use the new Package:is_installing() method to check whether an installation is already running.
Breaking Change
Use the new Package:is_installed() method to check whether the package is installed.
This optional callback is called by Mason when package installation finishes, successfully or not.
Example:
local registry = require("mason-registry")
local pkg = registry.get_package("lua-language-server")
pkg:install({}, function (success, result)
if success then
-- Do something on success.
else
-- Do something on error.
end
end)v2.0.0 introduces official support for custom registries. Currently supported registry protocols are github:, file:,
and lua:. Lua-based registries have been reworked, please see https://github.com/mason-org/registry-examples for examples.
Thanks to all sponsors who continue to help finance monthly costs and all 181 contributors of mason.nvim and 246 contributors of the core registry!
1.11.0 (2025-02-15)
- pypi: improve resolving suitable python version (#1725) (0950b15)
- ui: add backdrop (#1759) (0a3a85f)
- avoid calling vim.fn in fast event (#1878) (3a444cb)
- avoid calling vim.fn.has inside fast event (#1705) (1b3d604)
- fix usage of deprecated Neovim APIs (#1703) (0f1cb65)
- fs: fall back to
fs_statif entry type is not returned byfs_readdir(#1783) (1114b23) - health: support multidigit luarocks version numbers (#1648) (751b1fc)
- pypi: allow access to system site packages by default (#1584) (2be2600)
- pypi: exclude python3.12 from candidate list (#1722) (f8ce876)
- pypi: prefer stock python3 if it satisfies version requirement (#1736) (f96a318)
- registry: exhaust streaming parser when loading "file:" registries (#1708) (49ff59a)
- replace deprecated calls to vim.validate (#1876) (5664dd5)
- ui: fix rendering JSON schemas (#1757) (e2f7f90)
- ui: reposition window if border is different than "none" (#1859) (f9f3b46)
1.10.0 (2024-01-29)
- don't use vim.g.python3_host_prog as a candidate for python (#1606) (bce96d2)
- pypi: attempt more python3 candidates (#1608) (dcd0ea3)
- golang: fix fetching package versions for packages containing subpath specifier (#1607) (9c94168)
- pypi: fix variable shadowing (#1610) (aa550fb)
- ui: don't indent empty lines (#1597) (c7e6705)
1.9.0 (2024-01-06)
1.8.3 (2023-11-08)
1.8.2 (2023-10-31)
1.8.1 (2023-10-10)
1.8.0 (2023-09-04)
- registry: reset registries state when setting registries (#1474) (c811fbf)
- registry: schedule vim.fn calls in FileRegistrySource (#1471) (1c77412)
1.7.0 (2023-08-25)
- cargo: support fetching versions for git crates hosted on github (#1459) (e9eb004)
- registry: add file: source protocol (#1457) (8544039)
- std: use gtar if available (#1433) (a51c2d0)
- ui: properly reset new package version state (#1454) (68e6a15)
1.6.2 (2023-08-09)
1.6.1 (2023-07-21)
1.6.0 (2023-07-04)
- ui: display package deprecation message (#1391) (b728115)
- ui: don't use diagnostic messages for displaying deprecated, uninstalled, packages (#1393) (c290d0e)
1.5.1 (2023-06-28)
- linker: ensure exec wrapper target is executable (#1380) (10da1a3)
- purl: percent-encoding is case insensitive (#1382) (b68d3be)
1.5.0 (2023-06-28)
- command: add completion for option flags for :MasonInstall (#1379) (e507af7)
- installer: write more installation output to stdout (#1376) (758ac5b)
1.4.0 (2023-06-21)
- fetch: add explicit default timeout to requests (#1364) (82cae55)
- fetch: include mason.nvim version in User-Agent (#1362) (e706d30)
1.3.0 (2023-06-18)
1.2.1 (2023-06-13)
1.2.0 (2023-06-13)
- async: always check channel state (#1351) (f503346)
- command: run :MasonUpdate synchronously in headless mode (#1347) (0276793)
- functional: strip_prefix and strip_suffix should not use patterns (#1352) (f99b702)
1.1.1 (2023-05-29)
1.1.0 (2023-05-18)
- installer: lock package installation (#1290) (227f8a9)
- ui: add keymap setting for toggling package installation log (#1268) (48bb1cc)
- ui: add search mode (#1306) (3b59f25)
- ui: display "update all" hint (#1296) (e634134)
- sources: don't skip installation if fixed version is not currently installed (#1297) (9c5edf1)
- ui: use vim.cmd("") for nvim-0.7.0 compatibility (#1307) (e60b855)