Unsupported managersΒΆ

mpm wraps a long list of package managers, but not everything that installs software.

Every tool that installs software belongs in one of exactly two places: the supported list, or the table below. There is no third state, and absence from both is a gap to be closed rather than a verdict of its own. The goal is total coverage: if it installs software and anyone has heard of it, mpm either wraps it or records here why it does not. A blank cell in the benchmark is therefore a to-do, not an answer.

That is a deliberate change of policy. Curating which tools were worth an opinion left readers unable to tell β€œwe looked and declined” apart from β€œnobody looked”, which are very different answers to the only question this page exists to settle.

Two reasons put a tool in the table below:

  • ☠️ Its upstream is dead.

  • ❌ Or it lacks critical features required by mpm.

A third marker rides alongside either of them:

  • πŸ›Ÿ topgrade reaches it anyway, so mpm upgrade --topgrade still upgrades it. mpm wraps topgrade as the catch-all for tools too thin to earn a manager of their own, which is why most of this table is still upgradable without being wrapped.

Tool

Status

Kind

Why?

android-studio

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

antibody

☠️ πŸ›Ÿ

Zsh plugin manager

Archived on 2022-05-27, superseded by antidote, which mpm wraps.

antigravity

❌ πŸ›Ÿ

VS Code fork, extension manager

Google ships two separate products under the name: the Antigravity IDE, a VS Code fork that topgrade drives with --update-extensions, and the Antigravity CLI (agy), whose plugin subcommands manage an unrelated set. The IDE’s extension flags are documented nowhere, so the row topgrade covers has no contract to build on. The agy plugin list/install/uninstall surface is a different tool and would be its own candidate.

atuin

❌ πŸ›Ÿ

Self-updating application

Updates only itself. There is no catalog, no inventory and no per-package operation to map: the whole surface is one command that replaces the binary in place.

chezmoi

❌ πŸ›Ÿ

Dotfiles or repository syncer

Synchronizes files and Git checkouts, not packages. There is no registry, no package identity and no version: what it tracks is the user’s own content, which is outside the system scope every mpm manager holds to.

clam-av-db

❌ πŸ›Ÿ

System database refresher

Rebuilds a local database from files already on disk. Nothing is fetched, installed or removed, and the database has no package identity to report.

containers

❌ πŸ›Ÿ

Container runtime

Manages container images and running containers, not packages. An image is a filesystem bundle addressed by tag or digest rather than a versioned package, and pulling a newer tag is not an upgrade mpm can reason about.

cursor

❌ πŸ›Ÿ

VS Code fork, extension manager

A VS Code fork that did not inherit the CLI intact: --list-extensions launches the Cursor window instead of listing anything (forum.cursor.com, where a moderator grants β€œthis is not expected behavior” and the thread closes with no fix). Silently opening a GUI where a listing was asked for is worse than an error, since nothing signals the failure. Cursor’s own CLI documentation covers the separate cursor-agent binary and never documents the extension flags at all, so there is no contract to build on. Contrast vscode, whose --list-extensions --show-versions is documented and stable.

cursor-agent

❌ πŸ›Ÿ

Self-updating application

Cursor’s command-line coding agent, whose whole maintenance surface is cursor-agent update replacing the binary in place. It installs no packages and owns no catalog.

declaro

❌

Single-manager declarative wrapper

Snapshots one already-installed manager at a time into an editable package list. No unique registry, no license, and its own multi-manager request has sat unaddressed since December 2025 (mantinhas/declaro#31).

decman

❌

Arch declarative system manager

No operation verbs at all, flags only: every run reconciles the whole declared state. Its packages come from pacman and its own in-house AUR builder, both already mpm territory. Also manages dotfiles, systemd units, users and PGP keys, outside the system scope every mpm manager holds to.

dein

☠️ πŸ›Ÿ

Vim and Neovim plugin manager

Development stopped, superseded by dpp below, last commit on 2025-09-13. Pure Vimscript, so it also exposes neither a binary to run nor a version to report.

deno

❌ πŸ›Ÿ

Self-updating application

Updates only itself. There is no catalog, no inventory and no per-package operation to map: the whole surface is one command that replaces the binary in place.

distrobox

❌ πŸ›Ÿ

Container runtime

Manages container images and running containers, not packages. An image is a filesystem bundle addressed by tag or digest rather than a versioned package, and pulling a newer tag is not an upgrade mpm can reason about.

dpp

❌

Vim and Neovim plugin manager

Live successor to dein above, but drivable only from inside the editor: its work happens in a Deno process (denops.vim) that Vim starts, and it documents no headless entry point. It reports no version and ships no binary of its own either, so it fails the same two requirements dein does, with nothing left to key the manager on.

etc-update

❌ πŸ›Ÿ

Configuration file merger

Merges pending /etc configuration files left behind by a Portage upgrade. It resolves conflicts, installs nothing, and is already covered by emerge, which mpm wraps.

flutter

❌ πŸ›Ÿ

Self-updating application

Updates only itself. There is no catalog, no inventory and no per-package operation to map: the whole surface is one command that replaces the binary in place.

fossil

❌ πŸ›Ÿ

Self-updating application

Updates only itself. There is no catalog, no inventory and no per-package operation to map: the whole surface is one command that replaces the binary in place.

fundle

☠️ πŸ›Ÿ

Fish plugin manager

No commit since 2023-01-05.

git

❌ πŸ›Ÿ

Dotfiles or repository syncer

Synchronizes files and Git checkouts, not packages. There is no registry, no package identity and no version: what it tracks is the user’s own content, which is outside the system scope every mpm manager holds to.

jetbrains-aqua

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-clion

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-datagrip

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-dataspell

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-gateway

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-goland

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-idea

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-mps

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-phpstorm

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-pycharm

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-rider

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-rubymine

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-rustrover

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetbrains-toolbox

❌ πŸ›Ÿ

JetBrains IDE installer

Ships no command-line interface at all: it is a tray application, and the only way to drive it non-interactively is the third-party jetbrains-toolbox-updater crate that pokes at its installation directory. Nothing to execute, nothing to list, no version to report.

jetbrains-webstorm

❌ πŸ›Ÿ

JetBrains IDE plugins

Plugins are driven through an undocumented update subcommand of the IDE binary (topgrade’s own comment: β€œThe update command is undocumented, but tested on all of the below”), which lists nothing, reports free-form text, and refuses outright while the IDE is open (β€œOnly one instance of … can be run at a time.”, exit 1). No inventory, no contract, and unusable on the very machines where the IDE is in use. Contrast vscode, whose --list-extensions is documented and stable, which is why it is wrapped.

jetpack

☠️ πŸ›Ÿ

FreeBSD jail runtime

Self-described prototype, no commit since 2018-10-25. Not a package manager to begin with.

lensfun

❌ πŸ›Ÿ

System database refresher

Rebuilds a local database from files already on disk. Nothing is fetched, installed or removed, and the database has no package identity to report.

mandb

❌ πŸ›Ÿ

System database refresher

Rebuilds a local database from files already on disk. Nothing is fetched, installed or removed, and the database has no package identity to report.

maza

❌ πŸ›Ÿ

Ad-blocking host list

Rewrites the local hosts file from an upstream blocklist. A host list is data, not a package: there is nothing to enumerate, version or uninstall.

metapac

❌

Declarative multi-backend package manager

Delegates to 21 backends mpm already wraps directly. No per-package install/remove verb: removed by design, see ripytide/metapac#197. The successor to the archived pacdef below, and actively maintained.

microsoft-office

❌ πŸ›Ÿ

Vendor application updater

Runs Microsoft’s own updater for one suite of applications. It has a fixed, single-vendor scope with no catalog to search and no packages to enumerate.

microsoft-store

❌ πŸ›Ÿ

Vendor application store

Driven through a PowerShell call that triggers the Store’s own bulk update. It exposes no per-package command line, so there is nothing to list, install or remove individually. Contrast winget, Microsoft’s actual package CLI, which mpm wraps.

myrepos

❌ πŸ›Ÿ

Dotfiles or repository syncer

Synchronizes files and Git checkouts, not packages. There is no registry, no package identity and no version: what it tracks is the user’s own content, which is outside the system scope every mpm manager holds to.

neobundle

☠️ πŸ›Ÿ

Vim plugin manager

No commit since 2018-07-26, superseded by dein, itself superseded by dpp, both above.

pacapt

☠️

Cross-manager wrapper

Retired in 2022. All 19 of the package managers it drove are shipped by mpm.

pacdef

☠️ πŸ›Ÿ

Arch meta package manager

Archived on 2025-08-05, README pointing to metapac above as its successor.

packer-aur

☠️

Arch AUR helper

No commit since 2016-03-25. Superseded by the same AUR helpers as yaourt below; the bare packer name belongs to HashiCorp’s tool and to packer-nvim above, hence the suffix.

packer-nvim

☠️ πŸ›Ÿ

Neovim plugin manager

README has declared it unmaintained since August 2023, pointing at lazy, which mpm wraps, and at pckr-nvim below.

pathogen

☠️

Vim plugin manager

No commit since 2022-08-24. Its whole job, splicing plugin directories into runtimepath, became a Vim 8 and Neovim built-in, which is what vim-pack wraps.

pckr-nvim

❌

Neovim plugin manager

Successor to packer-nvim above and actively developed, but drivable only from inside Neovim: no documented completion signal, and a confirmation prompt that blocks an unattended run by default (lewis6991/pckr.nvim#12).

pihole

❌ πŸ›Ÿ

DNS ad blocker

Updates its own installation and blocklists. It manages a network service and its data, not packages on the host.

podman

❌ πŸ›Ÿ

Container runtime

Manages container images and running containers, not packages. An image is a filesystem bundle addressed by tag or digest rather than a versioned package, and pulling a newer tag is not an upgrade mpm can reason about.

rcm

❌ πŸ›Ÿ

Dotfiles or repository syncer

Synchronizes files and Git checkouts, not packages. There is no registry, no package identity and no version: what it tracks is the user’s own content, which is outside the system scope every mpm manager holds to.

remotes

❌ πŸ›Ÿ

topgrade internal step

Not a tool: an internal step of topgrade, which mpm already wraps. It names no upstream project of its own and installs nothing.

restarts

❌ πŸ›Ÿ

Service restart helper

needrestart restarts services whose libraries were replaced by an upgrade. It installs nothing and owns no packages: it reacts to what a real package manager just did.

rtcl

❌ πŸ›Ÿ

topgrade internal step

Not a tool: an internal step of topgrade, which mpm already wraps. It names no upstream project of its own and installs nothing.

smart

☠️

Cross-manager wrapper

No commit since 2016-10-27. An early cross-distribution package manager over the RPM and dpkg archives among others, chasing the same goal as mpm; every archive it drove has a manager today.

spicetify

❌ πŸ›Ÿ

Self-updating application

Updates only itself. There is no catalog, no inventory and no per-package operation to map: the whole surface is one command that replaces the binary in place.

sysget

☠️

Cross-manager wrapper

Retired in 2019. All 21 of the package managers it drove are shipped by mpm.

system

❌ πŸ›Ÿ

topgrade internal step

Not a tool: an internal step of topgrade, which mpm already wraps. It names no upstream project of its own and installs nothing.

tldr

❌ πŸ›Ÿ

Man-page cache

Refreshes a local cache of community-written command summaries. The pages are documentation, not packages: nothing is installed, versioned or removable.

toolbx

❌ πŸ›Ÿ

Container runtime

Manages container images and running containers, not packages. An image is a filesystem bundle addressed by tag or digest rather than a versioned package, and pulling a newer tag is not an upgrade mpm can reason about.

typst

❌ πŸ›Ÿ

Self-updating application

Updates only itself. There is no catalog, no inventory and no per-package operation to map: the whole surface is one command that replaces the binary in place.

upt

❌

Universal package-management syntax shim

Translates one CLI vocabulary onto whichever single OS-level manager is detected, never more than one per invocation, by the maintainer’s own account: β€œupt is just aliases, nothing more” (sigoden/upt#60).

waydroid

❌ πŸ›Ÿ

Android container

Runs an Android system in a container. It installs no packages of its own, and what runs inside it is out of reach of the host’s package managers.

whohas

☠️

Cross-distribution search

Retired in 2015. All 16 of the distribution archives it queried have a manager in mpm.

windsurf

❌ πŸ›Ÿ

VS Code fork, extension manager

A VS Code fork whose vendor documents a launcher (windsurf .) and never the extension-management flags, so nothing upstream commits to --list-extensions behaving as it does in VS Code. The one fork where the community did test it, cursor above, found the listing opens the editor window instead. Reassess with a citation the day Windsurf documents the flags or a listing is confirmed working.

wsl

❌ πŸ›Ÿ

Windows Subsystem for Linux

Updates the WSL kernel and its distributions. It is a platform, not a package manager: the managers that run inside a WSL distribution are the ones mpm wraps, and it wraps them directly.

wsl-update

❌ πŸ›Ÿ

Windows Subsystem for Linux

Updates the WSL kernel and its distributions. It is a platform, not a package manager: the managers that run inside a WSL distribution are the ones mpm wraps, and it wraps them directly.

yadm

❌ πŸ›Ÿ

Dotfiles or repository syncer

Synchronizes files and Git checkouts, not packages. There is no registry, no package identity and no version: what it tracks is the user’s own content, which is outside the system scope every mpm manager holds to.

yaourt

☠️

Arch AUR helper

Archived, and self-described [unmaintained] in its own repository description, with no commit since 2018-12. The dominant AUR helper before yay; mpm wraps its successors yay and paru.

zgenom

❌ πŸ›Ÿ

Zsh plugin manager

Reports no version through any binary: its whole function set runs from zgenom-api to zgenom-update with no version command anywhere, so the probe that establishes a shell-function manager’s presence has nothing to read. The upstream request to tag releases was closed on the maintainer’s position that β€œI consider everything merged into main as a stable release” (jandamm/zgenom#120), so no version is coming. Its list compounds that by cat-ing the generated init.zsh verbatim rather than reporting an inventory.

zr

❌ πŸ›Ÿ

Zsh plugin manager

Owns no inventory to report: plugins are the arguments you hand it, so its whole main.rs recognizes --update, --help, --version and identifiers containing a slash, and there is no state to list. Wrapping it would buy a single upgrade_all over zr --update, which is what topgrade already reaches. No upstream request for a listing exists: the design is deliberate, documented in its README.

Hint

None of these verdicts are permanent. If a tool here looks misjudged, make the case in a new manager request and the entry will be reassessed.

Project-scoped dependency managersΒΆ

Tools that resolve dependencies inside a working tree are out of scope today.

This is a big feature for the future, but is already delimited by the PROJECT concept, the discover_projects() extension point, and issue #1725.

mpm already covers the system-scoped part of these managers:

Ecosystem

Project files

mpm manager

C/C++

conanfile.txt (Conan), vcpkg.json (vcpkg)

β€”

Conda

conda-lock.yml

conda

Go

go.mod, go.sum

β€”

Java

pom.xml (Maven), build.gradle (Gradle), ivy.xml

β€”

JavaScript

package.json, package-lock.json, yarn.lock, pnpm-lock.yaml

npm, yarn, pnpm

.NET

*.csproj, packages.config (NuGet)

β€”

Perl

cpanfile

cpan

PHP

composer.json, composer.lock

composer

Python

requirements.txt, pyproject.toml, poetry.lock, uv.lock

pip, uv

Ruby

Gemfile, Gemfile.lock

gem

Rust

Cargo.toml, Cargo.lock

cargo

Swift and Objective-C

Package.swift, Package.resolved (SwiftPM), Podfile, Podfile.lock (CocoaPods)

β€”