Hyprland hyprpm

ID

hyprpm

Home page

https://github.com/hyprwm/Hyprland

Version requirement

>= 0.56

Platforms

🐧 Linux

Operations

installed · install · upgrade_all · remove

purl types

pkg:hyprpm

CLI name

hyprpm

Issues and PRs

📦 manager: hyprpm

Source

meta_package_manager/managers/hyprpm.toml

hyprpm is the plugin manager shipped inside Hyprland (https://github.com/hyprwm/Hyprland), the Wayland compositor.

A package is a plugin repository, not a plugin. hyprpm nests the two: one git repository is added, built and removed as a unit, and the plugins it carries are enabled and disabled inside it. add, remove and update all take the repository, which is the object mpm’s package model describes, while enable and disable configure something already installed rather than installing it. Mapping those two onto install and remove would be faking operations, so mpm reports the repositories and leaves the plugins to hyprpm’s own verbs. The cost is real and worth stating: the per-plugin enabled/failed state the listing prints is not carried into mpm.

Parsing notes, verified against hyprpm 0.56.2 on Arch Linux:

  • The listing is a two-level tree. Each repository heads a block, and its plugins follow indented beneath it, so only the Repository lines are packages and every other line falls through the pattern unmatched.

  • The pattern is unanchored on purpose. hyprpm writes SGR escapes whether or not it holds a terminal, and honors neither NO_COLOR nor TERM=dumb nor CLICOLOR, all three verified, so the line opens with escapes rather than with its text. Matching mid-line steps over them instead of fighting levers that do nothing, which is the reading bob settled.

  • The id is the bare repository name, not author/name. Both are accepted by remove, and the author is printed right beside the name, but a regex parser maps one named group to one package field and cannot join two captures into a single id. Two repositories sharing a name would collide, which is an ambiguity hyprpm has itself and resolves the same way.

  • No installed_version is captured: the listing carries none. The state file records a commit hash, but reading it would mean parsing hyprpm’s private files rather than driving its CLI.

Important

hyprpm has no version flag of its own: hyprpm --version answers Unrecognized option --version. It ships with the compositor and is versioned with it, so the probe runs Hyprland --version through version_cli, the same escape hatch the base-system suites use. That makes a host with no Hyprland report no version and leaves the manager unavailable, which is the right answer: hyprpm without its compositor cannot build a plugin. hyprctl version was rejected for the probe because it talks to a running instance and fails with HYPRLAND_INSTANCE_SIGNATURE not set! on a host that merely has Hyprland installed.

Caution

add and remove both stop on an Are you sure? [Y/n] confirmation that no flag disables. mpm clears it without answering: click-extra runs every child with stdin on subprocess.DEVNULL, hyprpm reads an empty line, and its check only aborts on an explicit n, so the default applies. Both halves are deliberate rather than lucky, but the pair is what makes this manager drivable unattended: read a hang here as one of them having changed.

Note

install takes a git URL, where the listing reports a name, so an id read back from installed cannot be handed to install. That is hyprpm’s own asymmetry: add accepts a URL alone while remove accepts a URL, a name or author/name. Removal and upgrade therefore round-trip on a listed id and installation does not, the same shape bob documents for its catalog.

No outdated: nothing reports staleness without acting, update computing what is behind and building it in one pass. No search: hyprpm has no catalog, a repository being whatever URL the user hands it. No cleanup: purge-cache removes every built plugin, the headers and hyprpm’s own settings, which is a mass removal rather than reclamation, the same reading that left bob erase and luarocks purge unmapped.

What mpm adds to hyprpm

mpm reaches across every manager at once, not hyprpm alone: mpm installed and mpm outdated cover hyprpm alongside every other manager you run in one table, mpm upgrade --all updates them together, and mpm sbom exports the whole machine as one bill of materials.

Every mpm command also gains --dry-run and --plan previews, cross-scheme version comparison and purl identifiers. See manager augmentations for how each one is built.

Your hyprpm commands, in mpm

You already know hyprpm: each operation maps one-to-one onto mpm, in an interface shared by every manager.

To…

With hyprpm

With mpm

List what’s installed

hyprpm list

mpm --hyprpm installed

Install a package

hyprpm add <package_id>

mpm install pkg:hyprpm/<package_id>

Upgrade everything

hyprpm update

mpm --hyprpm upgrade --all

Remove a package

hyprpm remove <package_id>

mpm remove pkg:hyprpm/<package_id>

Prefix any command above with --dry-run to simulate the underlying manager calls without touching the system: the safe way to watch what mpm would do before trusting it.

Operations

Operation

Supported

installed

outdated

orphans

search

install

upgrade

upgrade_all

remove

sync

cleanup

doctor

Selecting and configuring hyprpm

Deselect hyprpm for a single run with --no-hyprpm, or persist the choice in your configuration:

[mpm]
hyprpm = false

Keep it enabled but tune how mpm drives it with a per-manager override:

[mpm.managers.hyprpm]
timeout = 900

mpm config-template hyprpm prints every overridable attribute as a ready-to-paste block.

Recipes

A few jobs you would otherwise script around hyprpm, one mpm command each:

  • Snapshot and clone a machine: mpm --hyprpm dump hyprpm.toml, then mpm restore hyprpm.toml on the next one.

  • Export a compliance SBOM: mpm --hyprpm sbom (CycloneDX by default, --spdx for SPDX).

Privilege escalation

mpm runs this manager as the current user and never prepends sudo by default. Flip the policy for its privileged operations with --sudo or the per-manager sudo override.

None of its operations needs root.

See privilege escalation for the full policy.

Cooldown

State of Hyprland hyprpm’s release-age gating, from the cooldown support table:

Status: ❌ None (a plugin repository is a git clone, which carries no publication date)

A cooldown only pays off where a compromised release can be withdrawn while the clock runs, and can only be emulated where the registry dates its releases. From the retraction table:

  • Registry: Upstream Git clones

  • Retraction: None: a plugin is cloned straight from its upstream repository, so withdrawing a bad revision is its author force-pushing, retagging or deleting it themselves. No index sits in between

  • Publish date: ❌ a commit or tag date is set by the author and freely rewritable

With --cooldown set, mpm skips this manager’s install and upgrade operations rather than run them unguarded (fail-closed); --cooldown best-effort opts back in.

Version probe

The version is probed by running:

$ Hyprland --version
Hyprland 0.56.2 built from branch v0.56.2 at commit efb50993780079460b0cbed1363e2166a2de1d9f clean ([gha] Nix: update inputs).
Date: Wed Aug 5 14:13:21 2026
Tag: v0.56.2, commits: 7661

Libraries:
Hyprgraphics: built against 0.5.1, system has 0.5.1
Hyprutils: built against 0.14.0, system has 0.14.1
Hyprcursor: built against 0.1.13, system has 0.1.13
Hyprlang: built against 0.6.8, system has 0.6.8
Aquamarine: built against 0.14.0, system has 0.14.0

Version ABI string: efb50993780079460b0cbed1363e2166a2de1d9f_aq_0.14_hu_0.14_hg_0.5_hc_0.1_hlg_0.6
no flags were set

and extracted with:

r"^Hyprland (?P<version>\S+)"

Reference traces

Raw native outputs captured in the bundled definition: the reference mpm’s parsers were written against. If you know Hyprland hyprpm well and a transcript below looks wrong, or a newer release changed its output format, report it.

$ hyprpm list
→ Repository hyprsplit (by shezdy):
  │ Plugin hyprsplit
  └─ enabled: true

→ Repository hyprland-plugins (by hyprwm):
  │ Plugin csgo-vulkan-fix
  └─ enabled: Plugin failed to build

  │ Plugin hyprbars
  └─ enabled: true


Feed any of these through mpm and the raw output becomes one uniform table, the same shape for every manager: filter it, project columns, or export it (mpm --hyprpm installed --output json, or csv, toml, yaml), each package carrying a purl and a version comparable across managers.

Changelog

  • 8.0.0.dev0 (unreleased)

    • Add hyprpm Hyprland plugin manager, listing, installing, removing and upgrading plugin repositories.