InstallationΒΆ
Meta Package Manager is distributed on PyPI.
So you can install the latest stable release with uv:
$ uv tool install meta-package-manager
Danger
Misleading package name
There is a mpm Python module on PyPI that has nothing to do with this project. Avoid it!
The real package is named meta-package-manager. Only the latter provides the mpm CLI youβre looking for.
Try it nowΒΆ
You can try Meta Package Manager right now in your terminal, without installing any dependency or virtual env thanks to uvx:
$ uvx meta-package-manager --help
$ mpm --help
Usage: mpm [OPTIONS] COMMAND [ARGS]...
CLI options shared by all subcommands.
Package manager selection:
Use these options to restrict the subcommand to a subset of managers.
- By default, mpm will evaluate all managers supported on the current platform.
- Use the --<manager-id> selectors to restrict target to a subset of managers.
- To remove a manager from the selection, use --no-<manager-id> selectors.
- Order of the selectors is preserved for priority-sensitive subcommands.
- Exclusion of a manager always takes precedence over its inclusion.
--am / --no-am Select or deselect AppImage Manager.
--antidote / --no-antidote Select or deselect Antidote.
--antigen / --no-antigen Select or deselect Zsh Antigen.
--antigravity-cli-plugins / --no-antigravity-cli-plugins
Select or deselect Antigravity CLI plugins.
--apk / --no-apk Select or deselect Alpine apk.
--apm / --no-apm Select or deselect Atom apm. (unmaintained)
--apt / --no-apt Select or deselect Debian apt.
--apt-mint / --no-apt-mint Select or deselect Linux Mint apt.
--aptitude / --no-aptitude Select or deselect aptitude.
--asdf / --no-asdf Select or deselect asdf.
--aura / --no-aura Select or deselect Arch Linux aura.
--bin / --no-bin Select or deselect bin.
--brew / --no-brew Select or deselect Homebrew Formulae.
--cask / --no-cask Select or deselect Homebrew Cask.
--composer / --no-composer Select or deselect PHP Composer.
--conda / --no-conda Select or deselect Conda.
--cpan / --no-cpan Select or deselect Perl CPAN.
--deb-get / --no-deb-get Select or deselect deb-get.
--dkp-pacman / --no-dkp-pacman Select or deselect devkitPro pacman.
--dnf / --no-dnf Select or deselect Fedora DNF.
--dnf5 / --no-dnf5 Select or deselect Fedora DNF5.
--dotnet / --no-dotnet Select or deselect dotnet tool.
--emerge / --no-emerge Select or deselect Gentoo emerge.
--eopkg / --no-eopkg Select or deselect Solus eopkg.
--fisher / --no-fisher Select or deselect Fish fisher.
--flatpak / --no-flatpak Select or deselect Flatpak.
--fwupd / --no-fwupd Select or deselect Linux fwupd.
--gem / --no-gem Select or deselect RubyGems.
--gext / --no-gext Select or deselect GNOME Shell extensions.
--ghcup / --no-ghcup Select or deselect Haskell ghcup.
--go / --no-go Select or deselect Go.
--guix / --no-guix Select or deselect GNU Guix.
--ips / --no-ips Select or deselect Image Packaging System.
--lazy / --no-lazy Select or deselect Neovim lazy-nvim.
--luarocks / --no-luarocks Select or deselect LuaRocks.
--lure / --no-lure Select or deselect LURE.
--mamba / --no-mamba Select or deselect Mamba.
--mas / --no-mas Select or deselect Mac App Store.
--mason / --no-mason Select or deselect Neovim mason-nvim.
--microdnf / --no-microdnf Select or deselect microdnf.
--micromamba / --no-micromamba Select or deselect Micromamba.
--miktex / --no-miktex Select or deselect MiKTeX.
--mise / --no-mise Select or deselect mise.
--nala / --no-nala Select or deselect Nala.
--nimble / --no-nimble Select or deselect Nimble.
--nix / --no-nix Select or deselect Nix.
--npm / --no-npm Select or deselect Node npm.
--oh-my-fish / --no-oh-my-fish Select or deselect Fish Oh My Fish.
--pacaur / --no-pacaur Select or deselect Arch Linux pacaur.
(unmaintained)
--pacman / --no-pacman Select or deselect Arch Linux pacman.
--pacstall / --no-pacstall Select or deselect Pacstall.
--paru / --no-paru Select or deselect Arch Linux paru.
--pear / --no-pear Select or deselect PEAR.
--pikaur / --no-pikaur Select or deselect Arch Linux pikaur.
--pip / --no-pip Select or deselect Python pip.
--pipx / --no-pipx Select or deselect Python pipx.
--pixi / --no-pixi Select or deselect pixi.
--pkcon / --no-pkcon Select or deselect PackageKit.
--pkg / --no-pkg Select or deselect FreeBSD pkg.
--pkgit / --no-pkgit Select or deselect pkgit.
--pmerge / --no-pmerge Select or deselect pkgcore pmerge.
--pnpm / --no-pnpm Select or deselect Node pnpm.
--ports / --no-ports Select or deselect FreeBSD Ports Collection.
--protonplus / --no-protonplus Select or deselect ProtonPlus.
--prt-get / --no-prt-get Select or deselect CRUX prt-get.
--pwsh-gallery / --no-pwsh-gallery
Select or deselect PowerShell Gallery.
--roswell / --no-roswell Select or deselect Roswell.
--scoop / --no-scoop Select or deselect Scoop.
--sdkman / --no-sdkman Select or deselect SDKMAN.
--sfsu / --no-sfsu Select or deselect Scoop sfsu.
--sheldon / --no-sheldon Select or deselect Sheldon.
--snap / --no-snap Select or deselect Snap.
--spack / --no-spack Select or deselect Spack.
--sun-tools / --no-sun-tools Select or deselect Solaris SVR4 package tools.
--tazpkg / --no-tazpkg Select or deselect TazPkg.
--trizen / --no-trizen Select or deselect Arch Linux trizen.
--uv / --no-uv Select or deselect Python uv.
--uvx / --no-uvx Select or deselect Python uvx.
--vagrant / --no-vagrant Select or deselect Vagrant.
--vcpkg / --no-vcpkg Select or deselect vcpkg.
--vim-pack / --no-vim-pack Select or deselect Neovim vim-pack.
--volta / --no-volta Select or deselect Volta. (unmaintained)
--whalebrew / --no-whalebrew Select or deselect Whalebrew.
--winget / --no-winget Select or deselect WinGet.
--xbps / --no-xbps Select or deselect Void XBPS.
--yarn-berry / --no-yarn-berry Select or deselect Yarn Berry.
--yarn / --no-yarn Select or deselect Yarn Classic.
--yay / --no-yay Select or deselect Arch Linux yay.
--yum / --no-yum Select or deselect Fedora YUM.
--zef / --no-zef Select or deselect Zef.
--zeroinstall / --no-zeroinstall
Select or deselect Zero Install.
--zim / --no-zim Select or deselect Zsh Zim.
--zinit / --no-zinit Select or deselect Zinit.
--zplug / --no-zplug Select or deselect Zsh zplug.
--zypper / --no-zypper Select or deselect openSUSE Zypper.
--app-manager / --no-app-manager
Select or deselect AppManager.
--apt-cyg / --no-apt-cyg Select or deselect apt-cyg. (unmaintained)
--basalt / --no-basalt Select or deselect Basalt.
--bob / --no-bob Select or deselect bob.
--bpkg / --no-bpkg Select or deselect bpkg.
--bun / --no-bun Select or deselect Bun.
--cargo / --no-cargo Select or deselect Rust cargo.
--cave / --no-cave Select or deselect cave.
--choco / --no-choco Select or deselect Chocolatey.
--choosenim / --no-choosenim Select or deselect Nim choosenim.
--chromebrew / --no-chromebrew Select or deselect Chromebrew.
--claude-code-plugins / --no-claude-code-plugins
Select or deselect Claude Code plugins.
--clib / --no-clib Select or deselect clib.
--cran / --no-cran Select or deselect R packages.
--elan / --no-elan Select or deselect Lean elan.
--emacs / --no-emacs Select or deselect GNU Emacs packages.
--fink / --no-fink Select or deselect Fink.
--gcloud / --no-gcloud Select or deselect Google Cloud CLI.
--getnf / --no-getnf Select or deselect getnf.
--gh-ext / --no-gh-ext Select or deselect GitHub CLI extensions.
--gup / --no-gup Select or deselect gup.
--haxelib / --no-haxelib Select or deselect Haxe haxelib.
--hyprpm / --no-hyprpm Select or deselect Hyprland hyprpm.
--jpm / --no-jpm Select or deselect jpm.
--julia / --no-julia Select or deselect Julia Pkg.
--juliaup / --no-juliaup Select or deselect Julia juliaup.
--krew / --no-krew Select or deselect kubectl krew.
--macports / --no-macports Select or deselect MacPorts.
--micro / --no-micro Select or deselect micro editor.
--octave / --no-octave Select or deselect GNU Octave pkg.
--ollama / --no-ollama Select or deselect Ollama.
--opam / --no-opam Select or deselect OCaml opam.
--opkg / --no-opkg Select or deselect opkg.
--pamac / --no-pamac Select or deselect Manjaro pamac.
--pearl / --no-pearl Select or deselect Pearl.
--pi / --no-pi Select or deselect Pi extensions.
--pipxu / --no-pipxu Select or deselect pipxu.
--pkg-tools / --no-pkg-tools Select or deselect OpenBSD pkg tools.
--pkgin / --no-pkgin Select or deselect Pkgin.
--pkgm / --no-pkgm Select or deselect pkgm.
--platformio-core / --no-platformio-core
Select or deselect PlatformIO Core.
--pyenv / --no-pyenv Select or deselect Python pyenv.
--raco / --no-raco Select or deselect raco.
--rustup / --no-rustup Select or deselect Rust rustup.
--shelly / --no-shelly Select or deselect Shelly.
--skills / --no-skills Select or deselect Agent Skills.
--slapt-get / --no-slapt-get Select or deselect slapt-get.
--soar / --no-soar Select or deselect Soar.
--sorcery / --no-sorcery Select or deselect Sorcery.
--steamcmd / --no-steamcmd Select or deselect Valve SteamCMD.
--stew / --no-stew Select or deselect stew.
--swupd / --no-swupd Select or deselect Clear Linux Software
Updater. (unmaintained)
--tlmgr / --no-tlmgr Select or deselect TeX Live Manager.
--topgrade / --no-topgrade Select or deselect Topgrade.
--urpmi / --no-urpmi Select or deselect urpmi.
--vscode / --no-vscode Select or deselect Visual Studio Code.
--vscodium / --no-vscodium Select or deselect VSCodium.
--xcodes / --no-xcodes Select or deselect Xcode xcodes.
--yazi / --no-yazi Select or deselect Yazi ya.
--zerobrew / --no-zerobrew Select or deselect zerobrew.
--zvm / --no-zvm Select or deselect zvm.
-a, --all-managers Force evaluation of all managers implemented
by mpm, including those not supported by the
current platform or unmaintained. Still
applies filtering by --<manager-id> /
--no-<manager-id> options before calling the
subcommand.
-x, --xkcd Preset manager selection as defined by XKCD
#1654. Equivalent to: --pip --brew --npm --dnf
--apt --steamcmd.
Manager options:
--stop-on-error / --continue-on-error
Stop right away or continue operations on
manager CLI error. [default: continue-on-
error]
--sudo / --no-sudo Force running privileged manager operations
with (or without) sudo. Unset by default,
letting each manager decide: system managers
(apt, dnf, pacman, ...) escalate, user-level
managers do not. When escalation is needed on
a terminal, mpm authenticates once up front
instead of prompting mid-run; off a terminal,
managers needing root fail fast rather than
stalling.
--sudo-command [sudo|doas|run0|pkexec|gsudo|win-sudo]
Escalator to run privileged manager operations
with. Auto-detected by default, preferring
sudo on a host carrying both. Selects the
binary only: whether a manager escalates at
all stays up to --sudo/--no-sudo and each
manager's own policy.
-d, --dry-run Do not actually perform any action, just
simulate CLI calls.
-p, --plan Print the exact package-manager commands each
state-changing operation would run, without
running them. Read-only queries (installed,
outdated, search) still run, so install,
remove and upgrade --all resolve to the
commands they would actually execute against
real system state. The plan prints to stdout,
one copy-pasteable command per line.
-t, --timeout INTEGER RANGE Maximum duration in seconds for each CLI call.
Applies to every manager and operation. When
unset, a per-operation default is used
instead: a short cap for read-only queries
(installed, outdated, search) and a longer one
for state-changing operations (install,
upgrade, remove, sync, cleanup). [x>=0]
--cooldown [DURATION | enforce | best-effort | off]
Refuse to install or upgrade any package
version published more recently than the given
duration, as a mitigation against supply-chain
attacks. Accepts a friendly duration ('7
days', '1 week', '12h'), an ISO 8601 duration
('P7D', 'PT12H'), an RFC 3339 absolute
timestamp ('2024-05-01T00:00:00Z'), or an
enforcement keyword: 'enforce' and 'best-
effort' pick the posture for managers without
native release-age support (skip them, or run
them without the safeguard) while the window
comes from the configuration, and 'off'
disables the gate for this run. The window is
only honored by managers with native release-
age support (flatpak, mas, npm, paru, pip,
pipx, pnpm, uv, uvx, yay); the others are
skipped unless the best-effort posture is
selected. [default: (disabled)]
--shell-env / --no-shell-env Adopt the environment of your login shell
before looking for managers. Meant for a run
started outside a terminal, like a menu bar
plugin, a desktop extension or a scheduled
job: such a run inherits the bare PATH of the
desktop session, which hides every manager
installed under your home directory and makes
pnpm refuse its global commands. mpm runs the
shell named by SHELL as an interactive login
shell, reads what it exports and adopts it,
PATH included, or keeps its own environment
when the shell does not answer within 10
seconds. Ignored on Windows, where desktop
programs already get your PATH. [default: no-
shell-env]
-j, --jobs [auto|max|INTEGER] Maximum number of managers to run
concurrently. Defaults to one less than the
CPU count; set 1 to run sequentially. Applies
to read-only queries (installed, outdated,
search), maintenance commands (sync, cleanup,
upgrade --all), and the state changers
(install, remove, upgrade, restore), which fan
out across managers while running each
manager's own packages one at a time.
Installing a package left untied to a manager
stays sequential. [default: auto]
Reporting options:
--description Show package description in results. Shorthand
for adding the 'description' column to 'mpm
search'; an explicit --columns selection wins.
--summary / --no-summary Print an end-of-run summary on stderr: a count
line of per-manager totals plus any
subcommand-specific follow-up notes (like SBOM
enrichment and merge counts). Defaults on; use
--no-summary to silence. [default: summary]
--network / --no-network Opt into network calls during the run. Today
this only affects 'mpm sbom', which uses the
flag to query OSV.dev for vulnerability data
and attach it to the rendered document.
Responses are cached on disk so repeat runs
are fast. Defaults off; the offline path
remains the default. Note: when enabled, this
transmits the package inventory to the queried
services. [default: no-network]
--suggest-contribs / --no-suggest-contribs
Print a contribution invitation when a user
override targets a field that likely indicates
an upstream detection bug (cli_names,
cli_search_path, requirement,
version_cli_options, version_regexes).
[default: suggest-contribs]
-s, --sort-by [manager_id|manager_name|package_id|package_name|version]
Sort results by this field. Repeat to add tie-
breakers in priority order, like '-s
manager_id -s package_id'. [default:
manager_id]
SwiftBar/Xbar options:
--bar-plugin-path Print location of the SwiftBar/Xbar plugin.
Other options:
-0, --zero-exit Always exit with a status code of 0, even when
problems are found.
-h, --help Show this message and exit.
Configuration options:
--config LOCATION Location of the configuration file. Supports
local path with glob patterns or remote URL.
[default: ~/.config/mpm/]
--no-config Ignore all configuration files and only use
command line parameters and environment
variables.
--validate-config LOCATION Validate the configuration file and exit.
--export-config FORMAT Export the configuration in the selected
format to <stdout>, then exit.
Output options:
--accessible Accessibility mode: disable colors and render
tables in a borderless, screen-reader-friendly
format.
--color [auto|always|never] Colorize the output. A bare --color is the
same as --color=always. [default: auto]
--no-color Disable colorization (alias of --color=never).
--progress / --no-progress Show progress indicators during long
operations. Disabled for non-interactive
output (pipes, dumb terminals, CI) and by
--accessible. [default: progress]
--theme [auto|dark|dracula|light|manpage|monokai|nord|solarized-dark]
Color theme used for help screens. [default:
dark]
--table-format FORMAT Rendering style of tables. [default: rounded-
outline]
Logging options:
--verbosity LEVEL Either CRITICAL, ERROR, WARNING, INFO, DEBUG.
[default: WARNING]
-v, --verbose Increase the default WARNING verbosity by one
level for each additional repetition of the
option. [default: 0]
-q, --quiet Decrease the default WARNING verbosity by one
level for each additional repetition of the
option. [default: 0]
--debug Shorthand for --verbosity DEBUG.
Introspection options:
--time / --no-time Measure and print elapsed execution time.
[default: no-time]
--params Show all CLI parameters, their provenance,
defaults and value, then exit.
--tree Show the tree of nested subcommands and exit.
--man Read the command's manual page and exit.
--help-format [carapace|json|json-full|man|markdown|markdown-full]
Render the command in the given format and
exit.
--version Show the version and exit.
Explore subcommands:
managers List the package managers detected on the system.
installed (list) List installed packages.
outdated List outdated packages.
orphans List orphaned packages.
search Search packages.
which (locate) Locate CLIs on system.
config-template Print per-manager overrides as a TOML config
template.
Maintenance subcommands:
install Install a package.
upgrade (update) Upgrade packages.
remove (uninstall) Remove a package.
sync Sync local package info.
cleanup Cleanup local data.
doctor (check, diagnose) Diagnose managers health.
Package snapshots subcommands:
dump (backup, lock, freeze, snapshot)
Snapshot installed packages to a TOML manifest or a
Brewfile.
restore Install packages referenced in TOML files.
SBOM subcommands:
sbom Export installed packages to a SBOM document.
Other commands:
help Show help for a command.
Examples:
List every package installed on the machine:
$ mpm installed
Upgrade everything every manager reports as outdated:
$ mpm upgrade --all
Refuse any release younger than a week while upgrading:
$ mpm --cooldown "7 days" upgrade --all
Snapshot the whole inventory to a TOML manifest:
$ mpm dump packages.toml
Replay that manifest on another machine:
$ mpm restore packages.toml
$ uvx [email protected] --help
$ uvx --from git+https://github.com/kdeldycke/meta-package-manager -- mpm --help
$ uvx --from file:///Users/me/code/meta-package-manager -- mpm --help
This will download meta-package-manager (the package), and run mpm, the CLI included in the package.
Try the libraryΒΆ
You can also try the library itself in an interactive Python shell without installing anything on your system:
$ uvx --with meta-package-manager python
Python 3.13.2 (main, Feb 4 2025, 14:51:09) [Clang 16.0.0 (clang-1600.0.26.6)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from meta_package_manager.pool import pool
>>> list(pool['brew'].installed)
[...]
>>>
Installation methodsΒΆ
mpm is available on several popular package managers:
Easiest way is to install uv, then install meta-package-manager system-wide with the uv tool command:
$ uv tool install meta-package-manager
Then you can run mpm directly:
$ mpm --version
To use mpm as a library in your project instead:
$ uv add meta-package-manager
You can install the latest stable release and its dependencies with a simple pip call:
$ python -m pip install meta-package-manager
Other variations includes:
$ pip install meta-package-manager
$ pip3 install meta-package-manager
If you have difficulties to use pip, see
pipβs own installation instructions.
pipx is a great way to install Python applications globally:
$ pipx install meta-package-manager
Meta Package Manager is available as a Homebrew formula, bottled for macOS and Linux, so you just need to:
$ brew install meta-package-manager
ZeroBrew is a fast, Homebrew-compatible package manager written in Rust. It consumes the same formula as Homebrew, so on Linux and macOS you just need to:
$ zb install meta-package-manager
Meta Package Manager is available on MacPorts, so you just need to:
$ sudo port install meta-package-manager
Tip
The port landed in MacPorts on 2026-07-22. If port install cannot find it yet, refresh your ports tree first with sudo port sync.
You can also install it from the Portfile overlay maintained in the repository.
Meta Package Manager is available in the main repository of Scoop, so you just need to:
> scoop install main/meta-package-manager
Build and install from the nuspec maintained in the repository:
> git clone https://github.com/kdeldycke/meta-package-manager.git
> cd meta-package-manager\packaging\choco\meta-package-manager
> choco pack
> choco install meta-package-manager --source .
Help unblock the community-repository submission
The build above is the only supported route: submission 6.4.2 was rejected over antivirus false positives on the bundled Windows binary.
You can help move it forward by reporting the detection to your antivirus vendor, the only practical path back to a community-repository submission.
Build and install from the definition maintained in the repository:
$ git clone https://github.com/kdeldycke/meta-package-manager.git
$ nix-env -f ./meta-package-manager/packaging/nix -i
On flake-enabled systems, you can run it without installing:
$ nix run github:kdeldycke/meta-package-manager?dir=packaging/nix -- --version
Help land it in nixpkgs
The nixpkgs package is pending review at NixOS/nixpkgs#506145. Once merged, installation will be a one-liner:
$ nix-env --install --attr nixpkgs.meta-package-manager
You can help move it forward by showing your support on the pull request.
Meta Package Manager is available in GNU Guix, so you just need to:
$ guix install meta-package-manager
Tip
The package landed in Guix on 2026-06-28. If guix install cannot find it yet, refresh your channels first with guix pull.
To build the bleeding-edge version instead, install from the definition maintained in the repository.
Build and install from the APKBUILD overlay maintained in the repository, as a member of the abuild group with a signing key set up. It targets Alpine edge:
$ doas apk add alpine-sdk
$ abuild-keygen --append --install -n
$ git clone https://github.com/kdeldycke/meta-package-manager.git
$ cd ./meta-package-manager/packaging/alpine
$ abuild -C ./py3-click -r
$ abuild -C ./py3-extra-platforms -r
$ abuild -C ./py3-tomlrt -r
$ abuild -C ./py3-wcwidth -r
$ abuild -C ./py3-cloup -r
$ abuild -C ./py3-click-extra -r
$ abuild -C ./meta-package-manager -r
$ doas apk add --repository ~/.local/share/abuild/alpine meta-package-manager
The 6 intermediate abuild runs produce the dependency packages that the official aports tree lacks or ships too old.
Help land it in aports
The package is pending review at alpine/aports!105566. Once merged, installation will be a one-liner:
$ apk add meta-package-manager
You can help move it forward by showing your support on the merge request.
On Tumbleweed, add the repository the packaging spec builds in and install from it:
$ sudo zypper addrepo https://download.opensuse.org/repositories/home:/kdeldycke/openSUSE_Tumbleweed/home:kdeldycke.repo
$ sudo zypper --gpg-auto-import-keys refresh
$ sudo zypper install meta-package-manager
Every dependency comes from Tumbleweed itself.
Help land it in openSUSE Factory
The repository above is a personal project on the Open Build Service. The package awaits review in request 1394245 to system:packagemanager, the development project through which it would reach Tumbleweed and then Leap. Once accepted, it installs from the distributionβs own repositories:
$ sudo zypper install meta-package-manager
Install from my PPA, on Ubuntu 24.04 and later:
$ sudo add-apt-repository ppa:kdeldycke/mpm
$ sudo apt install meta-package-manager
add-apt-repository comes from software-properties-common, which the desktop and server images carry. The package brings its own Python dependencies, so it installs no Python library system-wide and upgrades none of the ones already there.
Why a PPA rather than the Ubuntu archive
Ubuntu ships neither click-extra nor extra-platforms, and its python3-click and python3-cloup are older than click-extra accepts on every series up to and including 26.04, so no package built against the archive could work. The packaging page covers that trade-off, and how to build the source package by hand.
Help land it in deb-get
Support for deb-get is pending review at wimpysworld/deb-get#2036. Once merged, deb-get adds the PPA and installs the package in one step:
$ deb-get install meta-package-manager
You can help move it forward by showing your support on the pull request.
Build and install from the templates of void-linux/void-packages#60532, which GitHub serves under the ref of that pull request:
$ git init ./void-packages
$ cd ./void-packages
$ git fetch --depth 1 https://github.com/void-linux/void-packages.git pull/60532/head:mpm
$ git checkout mpm
$ ./xbps-src binary-bootstrap
$ ./xbps-src pkg mpm
$ sudo xbps-install --repository=./hostdir/binpkgs/mpm mpm
The pkg step cascades through the five new Python packages the pull request introduces, plus an in-place bump of python3-boltons from 20.2.1 to 25.0.0, as detailed on the packaging page.
Void Linux needs a contributor
Void does not accept a package submitted by the author of the software, so I cannot land mpm in void-packages myself. void-linux/void-packages#60532 was closed for that reason.
The templates above are complete: they build on a current Void host, and every dependency passes its test suite there. If you run Void and use mpm, you are welcome to take them and submit them under your own name. They are then yours: put yourself in the maintainer field. Void asks that submitters have a history of contributions to void-packages, so working on orphaned packages first is the recommended route.
Once a package lands, installation becomes a one-liner:
$ xbps-install --sync mpm
An mpm package is available on AUR and can be installed with any AUR helper:
$ yay -S meta-package-manager
$ paru -S meta-package-manager
$ pacaur -S meta-package-manager
Stew installs pre-compiled binaries from GitHub Releases:
$ stew install kdeldycke/meta-package-manager
BinariesΒΆ
Binaries are compiled at each release, so you can skip the installation process above and download the standalone executables directly.
This is the preferred way of testing mpm without polluting your machine. They also offer the possibility of running the CLI on older systems not supporting the minimal Python version required by mpm.
Platform |
|
|
|---|---|---|
Linux |
||
macOS |
||
Windows |
All links above points to the latest released version of mpm.
See also
To test previous versions for regression, compatibility or general troubleshooting, the old binaries are attached as assets to past releases on GitHub.
To test the bleeding-edge version, fresh binaries are compiled from every push to the
mainbranch: grab them from the development builds.The exact executable format each binary targets is listed in the ABI targets section of the catalog.
Important
Antivirus false positives
The Windows binaries (and to a lesser extent the macOS ARM64 ones, plus anything downstream that bundles them like the Chocolatey package) are flagged by heuristic and ML-based antivirus engines. These are false positives caused by the Nuitka --onefile packaging pattern, not by anything mpm does. Engineering background, per-release detection data, and long-term mitigations are documented on the binaries catalog.
If your antivirus quarantines an mpm binary:
Verify the binary you downloaded with the attestation procedure below. It cryptographically proves the artifact came from this repositoryβs release pipeline.
Submit a false-positive report to your antivirus vendor with the verified binary. The priority vendor list on the binaries catalog covers the engines responsible for most detections, and VirusTotalβs vendor directory covers the rest.
The more independent reports a vendor receives, the more likely a detection gets reclassified, and that is the only practical path back to a working Chocolatey community-repository submission.
Release verificationΒΆ
All release artifacts (Python packages and compiled binaries) are signed with GitHub Artifact Attestations providing SLSA v1 provenance. You can verify any downloaded artifact with the GitHub CLI:
$ gh attestation verify ./meta-package-manager-8.2.0-macos-arm64.bin --repo kdeldycke/meta-package-manager --signer-repo kdeldycke/repomatic
Loaded digest sha256:... for file://meta-package-manager-8.2.0-macos-arm64.bin
Loaded 1 attestation from GitHub API
β Verification succeeded!
Important
The --signer-repo kdeldycke/repomatic flag is required because the release workflow runs as a reusable workflow from kdeldycke/repomatic. The signing certificate references that repository, not kdeldycke/meta-package-manager. Without this flag, verification fails.
For Python packages from PyPI:
$ gh attestation verify ./meta_package_manager-8.2.0-py3-none-any.whl --repo kdeldycke/meta-package-manager --signer-repo kdeldycke/repomatic
Attestation bundles are also attached to each GitHub release for offline verification.
Self-bootstrappingΒΆ
In a funny twist, mpm can be installed with itself.

Which means there is a way to bootstrap its deployment on an unknown system. Just download the binary corresponding to your platform and architecture:
$ curl --fail --remote-name https://github.com/kdeldycke/meta-package-manager/releases/latest/download/meta-package-manager-macos-x64.bin
################################################### 100.0%
$ file ./meta-package-manager-macos-x64.bin
./meta-package-manager-macos-x64.bin: Mach-O 64-bit executable x86_64
$ chmod +x ./meta-package-manager-macos-x64.bin
$ ./meta-package-manager-macos-x64.bin --version
mpm, version 8.2.0
(...)
Then let mpm discovers which package managers are available on your machine and choose the one providing a path to mpm installation:
$ ./meta-package-manager-macos-x64.bin install meta-package-manager
warning: Skip unavailable cargo manager.
warning: Skip unavailable steamcmd manager.
Installation priority: brew > cask > composer > gem > mas > npm > pip > pipx > vscode > yarn
warning: No meta-package-manager package found on brew.
warning: No meta-package-manager package found on cask.
warning: No meta-package-manager package found on composer.
warning: No meta-package-manager package found on gem.
warning: No meta-package-manager package found on mas.
warning: No meta-package-manager package found on npm.
warning: pip does not implement search operation.
meta-package-manager existence unconfirmed, try to directly install it...
Install meta-package-manager package with pip...
Collecting meta-package-manager
Downloading meta_package_manager-8.2.0-py3-none-any.whl (887 kB)
ββββββββββββββββββββββββββββββββββββββββ 887.0/887.0 kB 494.7 kB/s eta 0:00:00
(...)
Installing collected packages: (...) meta-package-manager
Successfully installed (...) meta-package-manager-8.2.0
And now you can remove the local binary and enjoy the system-wide mpm that was installed by itself:
$ rm -f ./meta-package-manager-macos-x64.bin
$ which mpm
/opt/homebrew/bin/mpm
$ mpm --version
mpm, version 8.2.0
(...)
Tip
At this moment, mpm can be installed with itself via these managers:
$ mpm --brew install meta-package-manager
$ mpm --guix install meta-package-manager
$ sudo mpm --macports install meta-package-manager
$ mpm --pacaur install meta-package-manager
$ mpm --pacman install meta-package-manager
$ mpm --paru install meta-package-manager
> mpm --choco install meta-package-manager
$ mpm --pip install meta-package-manager
$ mpm --pipx install meta-package-manager
> mpm --scoop install meta-package-manager
$ mpm --stew install kdeldycke/meta-package-manager
$ mpm --uvx install meta-package-manager
$ mpm --yay install meta-package-manager
$ mpm --zerobrew install meta-package-manager
Python module usageΒΆ
Meta Package Manager should now be available system-wide. On a color terminal wide enough for it, --version draws the brand mark beside what this install is: its version, the interpreter running it, the platform, and how many of the managers it implements are usable here.
Anywhere else, and in a pipe, it prints the same facts as two plain lines:
$ mpm --version
mpm, version 8.2.0
Python 3.14.7, macOS ARM64 (AArch64)
If the command is not found, you can directly execute the module from Python:
$ python -m meta_package_manager --version
Support envelopeΒΆ
The Python and click-extra compatibility tables keep the support envelope of mpm. Outside of it, these are obsolete:
mpmreleases before8.1.0(2026-10-04)Python versions before
3.10(2021-10-04)click-extraversions before9.3.0(2026-09-18)
Python compatibilityΒΆ
Each cell holds one of three states:
β : the release declares support for that Python.
β: the
requires-pythonof the release rules that Python out.β: the release neither claimed nor forbade that Python, usually because that Python was not out yet when the release declared its requirements.
See three states, two sources. The table keeps the support envelope of mpm, so the oldest releases drop off as the oldest supported Python moves up.
|
|
|
|
|
|
|
|
|
|
|---|---|---|---|---|---|---|---|---|---|
|
β |
β |
β |
β |
β |
β |
β |
β |
β |
|
β |
β |
β |
β |
β |
β |
β |
β |
β |
|
β |
β |
β |
β |
β |
β |
β |
β |
β |
|
β |
β |
β |
β |
β |
β |
β |
β |
β |
|
β |
β |
β |
β |
β |
β |
β |
β |
β |
|
β |
β |
β |
β |
β |
β |
β |
β |
β |
|
β |
β |
β |
β |
β |
β |
β |
β |
β |
|
β |
β |
β |
β |
β |
β |
β |
β |
β |
Shell completionΒΆ
Completion for popular shell rely on Click feature.
Add this to ~/.bashrc:
eval "$(_MPM_COMPLETE=bash_source mpm)"
Add this to ~/.zshrc:
eval "$(_MPM_COMPLETE=zsh_source mpm)"
Add this to ~/.config/fish/completions/mpm.fish:
eval (env _MPM_COMPLETE=fish_source mpm)
Alternatively, export the generated completion code as a static script to be executed:
$ _MPM_COMPLETE=bash_source mpm > ~/.mpm-complete.bash
Then source it from ~/.bashrc:
. ~/.mpm-complete.bash
$ _MPM_COMPLETE=zsh_source mpm > ~/.mpm-complete.zsh
Then source it from ~/.zshrc:
. ~/.mpm-complete.zsh
_MPM_COMPLETE=fish_source mpm > ~/.config/fish/completions/mpm.fish
For broader shell coverage than Clickβs Bash, Zsh and Fish support, mpmβs command tree can be exported to Carapace, a multi-shell completion engine that drives identical completions across Bash, Zsh, Fish, Nushell, PowerShell, Elvish and more from a single spec. Generate and install the spec with click-extraβs wrap command:
$ uvx --from "click-extra[carapace]" --with meta-package-manager click-extra wrap --help-format carapace --install meta_package_manager.cli:mpm
This writes the spec to ~/.config/carapace/specs/mpm.yaml, which Carapace loads once it is installed and hooked into your shell. Re-run the command after upgrading mpm to refresh the spec.
Man pagesΒΆ
mpm exposes a --man option on every (sub)command, which typesets the corresponding manual and pages it, the way man does:
$ mpm --man
$ mpm install --man
To get the roff source instead, ask for the man rendering of --help-format:
$ mpm --help-format man
The full command tree is also pre-rendered as static .1 files:
Bundled as
mpm-manpages.tar.gzon every GitHub release. Download, extract, and copy to${MANPATH%%:*}/man1/(typically/usr/local/share/man/man1/).Rendered as browser-viewable HTML siblings under https://mpm.run/man/, which indexes the whole set.
Downstream packagers can regenerate them from source as part of their build phase:
$ click-extra wrap --help-format man --output-dir /usr/share/man/man1/ meta_package_manager.cli:mpm
The module:function notation skips the mpm console-script entry point (which dispatches through __main__:main and hides the Click command behind a lazy import). The generator honors SOURCE_DATE_EPOCH for reproducible builds. See the click-extra man-page reference for other invocation forms (uvx for build sandboxes, .py file paths, and the programmatic API).
Extra dependenciesΒΆ
By default, mpm supports TOML, JSONC and XML configuration files and all standard table formats. Optional extras unlock additional configuration file formats, table output formats, and SBOM generation:
Extra |
Install command |
Unlocks |
|---|---|---|
|
$ uv pip install meta-package-manager[hjson]
|
|
|
$ uv pip install meta-package-manager[json5]
|
|
|
$ uv pip install meta-package-manager[sbom-offline]
|
|
|
$ uv pip install meta-package-manager[sbom-online]
|
|
|
$ uv pip install meta-package-manager[toml]
|
|
|
$ uv pip install meta-package-manager[yaml]
|
|
Tip
Install all extras at once with:
$ uv pip install meta-package-manager[hjson,json5,sbom-offline,sbom-online,toml,yaml]
Or with pip:
$ pip install meta-package-manager[hjson,json5,sbom-offline,sbom-online,toml,yaml]
When working from a cloned repository, uv sync installs all runtime extras plus dev groups (test, docs, typing) in one shot:
$ uv sync --all-extras --all-groups
