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

Angry package

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.

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 main branch: 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:

  1. Verify the binary you downloaded with the attestation procedure below. It cryptographically proves the artifact came from this repository’s release pipeline.

  2. 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.

Yo dawg, I herd you like package managers...

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.

The mpm version screen

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:

  • mpm releases before 8.1.0 (2026-10-04)

  • Python versions before 3.10 (2021-10-04)

  • click-extra versions before 9.3.0 (2026-09-18)

Python compatibilityΒΆ

Each cell holds one of three states:

  • βœ…: the release declares support for that Python.

  • ❌: the requires-python of 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.

mpm ↴ \ Python β†’

3.15

3.14

3.13

3.12

3.11

3.10

3.9

3.8

3.7

8.3.0

βœ…

βœ…

βœ…

βœ…

βœ…

❌

❌

❌

❌

8.0.x β†’ 8.2.x

βœ…

βœ…

βœ…

βœ…

βœ…

βœ…

❌

❌

❌

6.0.x β†’ 7.6.x

–

βœ…

βœ…

βœ…

βœ…

βœ…

❌

❌

❌

5.21.0

–

–

βœ…

βœ…

βœ…

❌

❌

❌

❌

5.19.x β†’ 5.20.x

–

–

βœ…

βœ…

βœ…

βœ…

❌

❌

❌

5.17.x β†’ 5.18.x

–

–

–

βœ…

βœ…

βœ…

βœ…

❌

❌

5.14.x β†’ 5.16.x

–

–

–

βœ…

βœ…

βœ…

βœ…

βœ…

❌

3.2.x β†’ 5.13.x

–

–

–

βœ…

βœ…

βœ…

βœ…

βœ…

βœ…

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.gz on 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

hjson

$ uv pip install meta-package-manager[hjson]

json5

$ uv pip install meta-package-manager[json5]
  • JSON5 config files: --config mpm.json5

sbom-offline

$ uv pip install meta-package-manager[sbom-offline]
  • CycloneDX and SPDX SBOM generation from local data: mpm sbom

sbom-online

$ uv pip install meta-package-manager[sbom-online]
  • Network enrichment for mpm --network sbom: OSV.dev vulnerability lookups

toml

$ uv pip install meta-package-manager[toml]

yaml

$ 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