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 this page. 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 sections below, and the section title carries the verdict:
β οΈ Its upstream is dead.
β Or it lacks critical features required by
mpm.
A third marker rides alongside either of them:
π
topgradereaches it anyway, sompm upgrade --topgradestill upgrades it.mpmwrapstopgradeas the catch-all for tools too thin to earn a manager of their own, which is why most of this page is still upgradable without being wrapped.
One section per tool, except where several share a verdict word for word: those are grouped under the family they belong to, which names its members up front. Each section is an anchor, so a decision can be cited from anywhere in the documentation, the code or an issue: https://mpm.run/unsupported/#paq.
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.
antibody β οΈ πΒΆ
Zsh plugin manager, archived on 2022-05-27 and superseded by antidote, which mpm wraps.
antigravity β πΒΆ
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.
app-man β πΒΆ
The same AppImage manager as am, which mpm wraps, under a second name. Its repository carries no implementation at all, only a stub that replaces its own contents with AMβs and re-executes it: βSince version 5, βAppManβ and βAMβ have been meged to share the same codeβ. The script then reads the path it was invoked through to decide whether to install system-wide or under the userβs home, which is the entire difference between the two. Wrapping it would also double-count, since am -fi already lists AppManβs applications in a table of their own.
auto-cpufreq β πΒΆ
A CPU speed and power optimizer for Linux, running as a daemon that switches governors and turbo boost according to load and battery state. topgrade updates it in place, which is what puts it in the benchmark, but it installs nothing and owns nothing installable: what it manages is a kernel tuning policy, which has no name, no version and no catalog to draw from.
bash-it β πΒΆ
Bash configuration framework shipping no registry of its own: its plugins, aliases and completions all live inside the single git checkout under plugins/available, aliases/available and completion/available, so bash-it enable plugin git only symlinks a file the clone already put on disk and bash-it disable removes that symlink again. Nothing is fetched and nothing carries a version of its own: bash-it update runs git fetch and checks out a tag or master across the whole tree, a mechanism its maintainer describes as βwe assume we cloned the project, and we run git fetch and things like thatβ (Bash-it/bash-it#1819).
basher βΒΆ
Package manager for shell scripts, and on the verbs alone the most complete candidate on this page: list, outdated, upgrade, install and uninstall are all native, so even the staleness read would have needed no synthesis.
It reports no version by any route, which is what settles it. None of the eleven commands it exposes is a version, no version constant appears anywhere in its source, and upstream publishes neither tags nor releases, so nothing on disk or in the repository names one. That is zgenomβs verdict exactly. Nothing on its tracker asks for a version either, so this rests on the observed behaviour rather than on an upstream position, and a release scheme would reopen it.
bpm β οΈΒΆ
Bash package manager, abandoned: 28 commits in all and nothing since 2021-07-25. Little would have been left to wrap in any case, its whole verb surface being install and run, with no listing, no removal and no upgrade, and its readme conceding it carries no versioning at all, which it blames on Bash having no namespacing.
certbot β πΒΆ
The EFFβs ACME client, obtaining and renewing TLS certificates. topgrade runs certbot renew beside its package steps, which is what lands it in this table, but a certificate is not a package: it is issued against a domain the host proves it controls, expires on a schedule of its own, and comes from no catalog anyone can enumerate. Nothing here can be listed, searched, installed by name or removed.
Container runtimes β πΒΆ
colima, containers, distrobox, podman and toolbx.
Manage 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 β πΒΆ
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.
declaro βΒΆ
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 with 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 whose development stopped, superseded by dpp, last commit on 2025-09-13. Pure Vimscript, so it also exposes neither a binary to run nor a version to report.
Dotfiles and repository syncers β πΒΆ
chezmoi, falconf, git, myrepos, rcm and yadm.
Synchronize files and Git checkouts, not packages. There is no registry, no package identity and no version: what they track is the userβs own content, which is outside the system scope every mpm manager holds to.
dpp βΒΆ
Vim and Neovim plugin manager, the live successor to dein, 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 β πΒΆ
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.
fresh βΒΆ
Describes itself as βBundler for your dot filesβ: it sources shell configuration (aliases, functions, snippets) out of other peopleβs Git repositories and splices it into the userβs own config, then symlinks the result. That is the verdict chezmoi and its peers already carry, and it earns a section of its own only because topgrade does not reach it, so it cannot sit under a title promising that fallback. Its search queries a community wiki rather than a registry, nothing it tracks carries a version of its own, and what it manages is the userβs content, outside the system scope every mpm manager holds to.
fundle β οΈ πΒΆ
Fish plugin manager with no commit since 2023-01-05.
gofish β οΈΒΆ
Cross-platform package manager modelled on Homebrew, down to a registry of its own: βfish foodβ recipes hosted at fishworks/fish-food. Its readme announces the end in as many words, βTHIS PROJECT IS BEING ARCHIVEDβ, blaming βthe amount of time and money required to maintain this side projectβ, and no commit has landed since 2022-03-08. The repository is archived and names no successor.
helm β πΒΆ
Everything about Helm reads like a candidate: chart repositories that are real registries, and list, search, install, upgrade and uninstall all native. Scope is the whole of the objection, and it is decisive.
Helm does not install onto the machine. Installing a chart βcreates a new release objectβ inside a Kubernetes cluster, and helm list enumerates the releases of whichever cluster the current context points at. That inventory therefore describes a cluster rather than a host, changes with kubectl config use-context, and is empty or unreachable where no cluster is configured at all, none of which the system scope every mpm manager holds to can express.
The line is not that Kubernetes is out of bounds: krew is wrapped, and installs kubectl plugins as binaries under the userβs own home. The object is what differs, a local binary against a remote deployment.
home-manager β πΒΆ
Draws its packages from nixpkgs, the registry mpm already reaches through nix: the manual states that βNixpkgs packages can be installed to the user profile using home.packagesβ, an option typed list of package. No per-package verb either, its command dispatch accepting only whole-state operations like build, switch and generations, so a package is added by editing home.nix and running home-manager switch. It does report what it installed, through home-manager packages, but that inventory is a view onto the same profile mpm already reads.
JetBrains IDE plugins β πΒΆ
android-studio, jetbrains-aqua, jetbrains-clion, jetbrains-datagrip, jetbrains-dataspell, jetbrains-gateway, jetbrains-goland, jetbrains-idea, jetbrains-mps, jetbrains-phpstorm, jetbrains-pycharm, jetbrains-rider, jetbrains-rubymine, jetbrains-rustrover and jetbrains-webstorm.
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.
jetpack β οΈ πΒΆ
FreeBSD jail runtime, a self-described prototype with no commit since 2018-10-25. Not a package manager to begin with.
macos β πΒΆ
Appleβs softwareupdate(8) updates the operating system rather than managing packages, putting it outside mpmβs domain along with every other system updater a competitor happens to drive. Nothing about it is inventoriable either: --list reports the updates pending for the machine, --history is a log of those applied through the tool and prints its header alone on a current host, and no verb lists installed components, searches a catalog or removes anything. A macOS update cannot be uninstalled.
maza β πΒΆ
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 delegating 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, and actively maintained.
microsoft-office β πΒΆ
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 β πΒΆ
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.
neobundle β οΈ πΒΆ
Vim plugin manager with no commit since 2018-07-26, superseded by dein, itself superseded by dpp.
ninite βΒΆ
Installs from a real catalog of Windows applications, so the packages are there, but the free product exposes no command line to reach them with: the whole interface is a web form that generates a bespoke .exe bundling the selected apps. That installer takes no package argument, lists nothing and removes nothing, which is the same shape that rules out microsoft-store. A command line exists only in Ninite Pro, behind a per-machine monthly subscription with no free tier, so no mpm install could exercise it and the destructive install/remove round-trip the test suite runs on every wrapped manager could never be provisioned.
oh-my-bash β πΒΆ
Bash configuration framework with no registry of its own: its plugins and themes are files inside the single git checkout, loaded by name from the plugins=() array a user hand-edits into ~/.bashrc and resolved against $OSH/plugins/<name>/, so nothing is independently fetched or versioned and a new plugin arrives only as a pull request against the framework itself (ohmybash/oh-my-bash#771). upgrade_oh_my_bash is correspondingly a git pull --rebase of that one checkout, which is the whole of what topgrade already drives. Nor is there a surface to drive it through: lib/cli.bash advertises plugin, theme and version subcommands in its completion table but implements all three as echo 'Not yet implemented' stubs, leaving no inventory command and no per-package verb.
oh-my-zsh β πΒΆ
Zsh configuration framework with no registry of its own: every plugin ships inside the git checkout, and omz plugin list is a directory glob over $ZSH/plugins and $ZSH_CUSTOM/plugins rather than a query against an index. The verb set confirms it, offering only disable, enable, info, list and load, where enable just rewrites the plugins=() array in ~/.zshrc for a directory already on disk: adding a third-party plugin means hand-creating $ZSH_CUSTOM/plugins/foobar/foobar.plugin.zsh yourself (Customization), and the External plugins page is a hand-curated list of links, not an index. Nothing versioned to install against either: upstream carries no tags, so omz version falls through git describe --tags HEAD to the branch name.
oneget βΒΆ
Windows package-manager manager: PackageManagement brokers transactions out to providers (NuGet, PowerShellGet, Chocolatey) instead of owning packages itself, so everything it reaches through PowerShellGet mpm already reaches directly through pwsh-gallery. Wrapping it would buy a delegation layer and not one extra package, which is the verdict metapac and upt get for the same shape. Its upstream has stopped moving besides: the readme declares the module βcurrently not in developmentβ and βno longer accepting any pull requestsβ, naming AnyPackage and PowerShellGet as the successors.
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, its README pointing to metapac as its successor.
package-control βΒΆ
Sublime Textβs package manager, thoroughly alive and backed by a registry of its own at packagecontrol.io. It is drivable only from inside the editor, though: its readme documents installation as three steps through the Command Palette, and no command-line entry point exists to list, install or remove anything with nobody at the keyboard. That is the test pckr-nvim and dpp fail too. Contrast micro, an editor mpm does wrap, whose plugin flag is handled before its screen is ever initialised and so prints and exits.
packer-aur β οΈΒΆ
Arch AUR helper with no commit since 2016-03-25. Superseded by the same AUR helpers as yaourt; the bare packer name belongs to HashiCorpβs tool and to packer-nvim, hence the suffix.
packer-nvim β οΈ πΒΆ
Neovim plugin manager whose README has declared it unmaintained since August 2023, pointing at lazy, which mpm wraps, and at pckr-nvim.
pakku β οΈΒΆ
Pacman wrapper with AUR support, abandoned: its last release is v0.14 from 2019-12-20 and its last commit 2020-11-12. Nothing is out of reach for want of it either, mpm wrapping six live tools over the same ground in pacaur, pamac, paru, pikaur, trizen and yay.
paq β πΒΆ
Neovim plugin manager clearing both tests its peers failed: installation has a documented headless recipe closing on paqβs own PaqDoneInstall autocommand, and paq-lock.json sits at a fixed path recording each pluginβs name, URL and commit, so an inventory needs no configuration loaded. It reports no version of its own, though. require("paq") exposes clean, install, list, log_clean, log_open, query, setup, sync and update, and no version constant appears anywhere in its source; upstream tags releases, but a tag never reaches the checkout a user clones. Nothing on its tracker asks for one.
pathogen β οΈΒΆ
Vim plugin manager with 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 βΒΆ
Successor to packer-nvim 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 that updates its own installation and blocklists. It manages a network service and its data, not packages on the host.
pip-review β πΒΆ
A convenience layer over pip, which mpm wraps directly: its readme opens by calling it βa convenience wrapper around pipβ that lists updates βby deferring to pip list --outdatedβ and installs them βby deferring to pip installβ. It owns no registry, no installed-package inventory and no per-package verb: pip-review takes no package argument, and its flags only choose how to present the same all-outdated set.
pipupgrade β πΒΆ
Wraps pip and nothing else: it discovers the pip, pip3 and pip2 executables on PATH and shells out to them, resolving every candidate version against PyPI, so its whole inventory is the packages mpm already reaches through pip. Its readme calls it βThe missing command for pipβ, and what it adds on top is project-file rewriting of requirements.txt and Pipfile plus a semver-aware upgrade gate, both outside the system scope every mpm manager holds to.
pkgfile β πΒΆ
Answers which package owns a given file by searching the .files metadata repo-add publishes on pacman mirrors, scoped to the repositories enabled in /etc/pacman.conf. Its man page documents exactly three operations, --search, --list and --update, none of which installs, removes or reports locally-installed packages. --update only refreshes the cached index, and that index is pacmanβs own repository metadata rather than a registry of its own. The bundled command-not-found hook can offer to install a match, but delegates to sudo pacman -S.
plug β πΒΆ
Vim and Neovim plugin manager, drivable unattended unlike dein and dpp: PlugInstall runs under --headless and exits cleanly. It reports no version, though, and by design. It ships as a single file the documented install fetches from master, so no release tag ever reaches the copy on disk, and it records no manifest either: the plugin list lives in the userβs own config. The request for a version command was closed on the maintainerβs βit doesnβt have a version number in it, so itβs not currently possibleβ.
restarts β πΒΆ
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.
sage β οΈΒΆ
Cygwin package manager, offered as an alternative to apt-cyg, which mpm wraps. It is gone in the strongest sense available: the repository 404s and so does the svnpenn account that owned it, so the project was not renamed or transferred, it was deleted along with its owner. Nothing survives to wrap, and no fork carries the name.
Self-updating applications β πΒΆ
atuin, claude-code, codex, cursor-agent, deno, flutter, fossil, opencode, spicetify and typst.
Update only themselves. 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.
smart β οΈΒΆ
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.
sparkle β πΒΆ
An update framework developers embed in their own macOS applications, described by its site as βan easy-to-use software update framework for macOS applicationsβ. Each application carries its own appcast feed and Sparkleβs helper acts on one bundle path at a time, so there is no catalog and no inventory anywhere in it.
topgrade reaches it by supplying the enumeration itself, walking /Applications, probing every bundle with --probe and updating whichever answer. That is a directory listing performed by the caller, not something Sparkle exposes, and it leaves nothing here to list, search, install by name or remove.
sysget β οΈΒΆ
Cross-manager wrapper retired in 2019. All 21 of the package managers it drove are shipped by mpm.
System database refreshers β πΒΆ
clam-av-db, lensfun and mandb.
Rebuild a local database from files already on disk. Nothing is fetched, installed or removed, and the database has no package identity to report.
tldr β πΒΆ
Refreshes a local cache of community-written command summaries. The pages are documentation, not packages: nothing is installed, versioned or removable.
tmux β πΒΆ
The Tmux Plugin Manager clears the bar most editor and shell plugin managers fail: it is genuinely scriptable, shipping bin/install_plugins, bin/update_plugins and bin/clean_plugins, and its own comment notes tmux βdoes not need to be started in order to run this scriptβ. Nobody has to be at the keyboard.
What it has no shape for is a package. Those three scripts are the whole surface and none takes an argument: the plugin set is whatever .tmux.conf declares, so installing is all-or-nothing from that file and there is no verb naming one plugin. Neither is there a listing, nor a version of its own, upstream tagging its repository but publishing no releases and putting nothing on disk that names one.
No inventory, no per-package operation, and topgrade already reaching it leaves nothing a wrapper would add, which is zrβs verdict.
topgrade internal steps β πΒΆ
Not tools: internal steps of topgrade, which mpm already wraps. They name no upstream project of their own and install nothing.
upm βΒΆ
βUniversal Package Managerβ, putting one syntax over apk, apt, guix, opkg, pacman, pkg, pkg_add, pkgin, xbps and yum. It owns no registry: every command is translated to whichever of those the host already carries, all of them wrapped by mpm directly, so it reaches no package mpm cannot. That is uptβs verdict word for word, and like upt it reads as a peer of mpm rather than a candidate to wrap.
upt βΒΆ
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 β πΒΆ
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.
Windows Subsystem for Linux β πΒΆ
wsl and wsl-update.
Update the WSL kernel and its distributions. WSL 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.
windsurf β πΒΆ
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, found the listing opens the editor window instead. Reassess with a citation the day Windsurf documents the flags or a listing is confirmed working.
wpkg β οΈΒΆ
Windows Packager, a dpkg clone bringing Debian-style packaging and apt-like verbs to Windows. Its upstream is gone: windowspackager.org now serves a parking page offering the domain for sale, no canonical repository survives it, and the only trace left on GitHub is a single-star fork carrying no releases. Not to be confused with the unrelated WPKG deployment tool, which shares the name and nothing else.
yaourt β οΈΒΆ
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.
yt-dlp βΒΆ
A command-line audio and video downloader, not a package manager: what it fetches is media, addressed by URL, carrying no name, no version and no catalog to enumerate. Its --update flag replaces its own binary in place, which is the whole of its resemblance to one and the reason it keeps being suggested.
That is the verdict the self-updating applications family carries, and yt-dlp would sit there but for the lifebuoy: no competitor drives it, so it cannot share a title promising topgrade reaches it.
zgenom β πΒΆ
Zsh plugin manager reporting 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 owning 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.
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 |
|
|---|---|---|
C/C++ |
|
β |
Conda |
|
|
Go |
|
β |
Haskell |
|
β |
Java |
|
β |
JavaScript |
|
|
.NET |
|
β |
Perl |
|
|
PHP |
|
|
Python |
|
|
Ruby |
|
|
Rust |
|
|
Swift and Objective-C |
|
β |