Snapshot and export¶
mpm can capture the installed-package inventory in two complementary formats:
a TOML manifest that re-installs cleanly through mpm restore;
a Brewfile that Homebrew Bundle can replay (a subset of managers only).
Both flow from the same selected-manager set, so manager filters (--brew, --cask, --apt, …) and the global --manager option apply uniformly. For supply-chain inventory work in SPDX or CycloneDX format, see SBOM: Software Bill of Materials.
TOML manifest¶
Let’s say you maintain a repository of dotfiles. This helps you spawn up a highly customized and productive environment quickly. New job? New machine? Easy: run your dotfiles, get a coffee, come back with everything perfectly in place to start an extremely productive hacking session.
But maintaining dotfiles is a pain.
mpm can help you keep an inventory of application to install across all package managers. It has a dedicated TOML file format which reference all packages and their version, per-manager.
Think of this as a kind of Dockerfile or .Brewfile. A way to run mpm install in auto-pilot so it can install packages in batch.
You can start by creating a new file of all packages installed on your machine:
$ mpm dump packages.toml
Dump all installed packages into packages.toml
Dumping packages from brew...
Dumping packages from cask...
Dumping packages from gem...
Dumping packages from mas...
Dumping packages from npm...
Dumping packages from pip...
1109 packages total (npm: 659, brew: 229, pip: 115, gem: 49, cask: 48, mas: 9).
The command is also reachable under its older names: mpm backup, mpm lock, mpm freeze, mpm snapshot.
Now inspect the results in packages.toml:
$ cat packages.toml
# Generated by mpm 6.6.0.
# Timestamp: 2026-06-12T10:30:00.000000+00:00.
[brew]
ack = "3.3.1"
adns = "1.5.1"
aom = "1.0.0"
apr = "1.7.0"
apr-util = "1.6.1_3"
arss = "0.2.3"
(...)
To keep the list above up to date, use the --update-version option to refresh the versions of entries already in the file:
$ mpm dump --update-version packages.toml
(...)
To add new packages installed since the last snapshot, use --merge:
$ mpm dump --merge packages.toml
(...)
Round-trip: switch systems¶
You used to work on macOS. Now you’d like to move to Linux. To reduce friction during your migration, you can make an inventory of all your installed packages with mpm, then reinstall them on your new distribution.
Snapshot a list of all installed packages on macOS:
$ mpm dump packages.toml
On your brand new Linux distribution, restore all packages with:
$ mpm restore packages.toml
Todo
Implement a best matching strategy, across package managers of different kinds.
Brewfile¶
If you live in the Homebrew Bundle ecosystem, mpm can export the installed inventory as a Brewfile directly. brew bundle install can then replay it on another machine:
$ mpm dump --brewfile Brewfile
Dump installed packages as a Brewfile into Brewfile
$ brew bundle install --file=Brewfile
Only the managers natively supported by Homebrew Bundle make it into the file: brew, cask, mas, vscode, npm, cargo, uv, winget, and flatpak. Everything else (apt, dnf, pacman, pip, pipx, gem, snap, scoop, chocolatey, sdkman, …) gets tallied in the header but excluded from the body.
The header carries a deliberate warning:
# DO NOT run `brew bundle cleanup --force` against this file. It would
# treat every excluded package as 'should be uninstalled' and tear down
# tools managed by the excluded managers.
Pass --no-header to suppress the comment block.
The Brewfile output is a complementary view, not a replacement for the TOML snapshot: TOML pins versions for mpm restore, while Brewfile lets Homebrew Bundle resolve to the latest version of each entry at install time. Use whichever fits the target workflow, or both.
VSCodium extensions are skipped¶
vscodium extensions are deliberately omitted from the Brewfile output. Homebrew Bundle’s vscode entry installs into VS Code only; emitting VSCodium-installed extensions as vscode entries would silently misroute them. mpm warns on stderr when this happens:
$ mpm dump --brewfile Brewfile
warning: Skipping 12 VSCodium extension(s) in Brewfile output: brew bundle has
no `vscodium` entry type, and emitting them as `vscode` would install them to
VS Code instead of VSCodium.
Edit the file by hand to add VSCodium entries through a separate channel if you need them.
uv mapping¶
The Brewfile uv entry installs through uv tool install, the same path mpm’s uvx manager wraps. uvx packages are included; the pip-style uv manager intentionally has no Brewfile mapping because its packages live inside a Python environment and would not round-trip through brew bundle.
Flatpak remote¶
Brewfile’s flatpak entry accepts a with: ["remote_name"] keyword for non-default remotes. mpm does not currently track the origin remote per installed flatpak, so the dump emits bare flatpak "id" lines; brew bundle install then resolves through flathub. Non-flathub flatpaks need to be edited in by hand after the dump.
See also¶
SBOM: Software Bill of Materials — SPDX and CycloneDX SBOM exports for supply-chain inventory work.
Per-manager overrides — per-manager
[mpm.managers.<id>]config blocks and how to generate them withmpm config-template.Cooldown — release-age gates that complement the snapshot workflow on the install side.