Declarative Nix packages and Home Manager integration for Herdr plugins
  • Nix 90.6%
  • Python 9.2%
  • Just 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-15 04:27:47 +00:00
.forgejo/workflows fix(ci): supersede stale catalog updates 2026-09-06 11:50:42 +02:00
data chore(catalog): update Herdr plugins 2026-09-15 04:27:47 +00:00
nix fix(catalog): handle unavailable plugin sources 2026-09-06 11:09:21 +02:00
scripts fix(catalog): handle unavailable plugin sources 2026-09-06 11:09:21 +02:00
.gitignore feat: initialize Herdr plugin catalog flake 2026-09-04 09:16:00 +02:00
actionlint.yaml ci: migrate workflows to KEDA runners 2026-09-06 10:37:08 +02:00
flake.lock chore(catalog): update Herdr plugins 2026-09-15 04:27:47 +00:00
flake.nix chore(catalog): update Herdr plugins 2026-09-15 04:27:47 +00:00
justfile feat(packages): add generic plugin builders 2026-09-04 09:36:07 +02:00
LICENSE feat: initialize Herdr plugin catalog flake 2026-09-04 09:16:00 +02:00
README.md fix(catalog): handle unavailable plugin sources 2026-09-06 11:09:21 +02:00
renovate.json feat: initialize Herdr plugin catalog flake 2026-09-04 09:16:00 +02:00

herdr-plugins-nix

Declarative, commit-pinned access to the public Herdr plugin marketplace.

The marketplace is refreshed daily from its public JSON index. Each GitHub repository is represented as a non-flake input pinned by flake.lock; every discovered manifest is exported through lib.pluginSources, and reproducibly buildable plugins are exported through packages.

Package a plugin

nix build .#herdr-lazy
herdr plugin link ./result

From another flake:

home.packages = [ inputs.herdr-plugins-nix.packages.${pkgs.system}.herdr-lazy ];

Package attribute names are the normalized Herdr plugin ids. Inspect them with:

nix eval .#packages.x86_64-linux --apply builtins.attrNames --json

The current nixpkgs input supports x86_64-linux, aarch64-linux, and aarch64-darwin. Nixpkgs 26.11 dropped x86_64-darwin; supporting Intel macOS would require a separate compatibility input.

Generic builders

The generated classifier currently supports:

  • build-free shell, Python, JavaScript, TypeScript, Lua, Perl, PHP, HTML, C, and Zig plugin trees with command-derived runtime dependencies;
  • Rust crates with Cargo.lock and no unhashed Git dependencies;
  • npm projects with complete package-lock.json integrity metadata;
  • dependency-free Go modules with explicit go build commands.

Absolute interpreter references in manifests are rewritten to Nix store paths, scripts have their shebangs patched, and required runtimes are propagated into user environments. lib.buildersFor pkgs exposes the builders for downstream use. Hand-written fixes and exceptional builds belong in nix/overrides.nix.

Plugins that download binaries during installation, require an unsupported dependency lock, contain unresolved external commands, or have malformed manifests remain catalogued under lib.pluginSources but are deliberately omitted from packages.

Use a source

{
  inputs.herdr-plugins-nix.url = "git+https://git.ancofazi.de/Andreas/herdr-plugins-nix.git";

  outputs = { herdr-plugins-nix, ... }: {
    # Metadata, the manifest path, and the pinned source/root are available as:
    # herdr-plugins-nix.lib.pluginSources."plugin.id"
  };
}

Inspect available attributes without building or downloading every plugin:

nix eval .#lib.catalog.pluginCount
nix eval .#lib.pluginSources --apply builtins.attrNames --json

Update

just update-catalog
just check

The updater consumes https://assets.herdr.dev/plugins/index.json; it does not scrape the marketplace HTML. The generated files are committed so a marketplace outage or removal does not silently change an existing revision.

Repositories whose GitHub source archives are not reliably fetchable can opt into the Git transport in data/input-overrides.json. Repositories removed by their upstream owner can be explicitly disabled there until the marketplace index stops advertising them.

Renovate maintains the ordinary flake dependencies weekly. A Forgejo Actions workflow refreshes the marketplace snapshot, pinned plugin revisions, and flake.lock daily as one reviewed change.

Design influences

The generated-catalog plus hand-written-override structure follows the proven split used by nix-vscode-extensions and the generated Vim plugin set in nixpkgs. Herdr's static marketplace index replaces a crawler, and pinned non-flake inputs let Nix record source content hashes without trusting mutable branches.

Coverage

The generated data/build-catalog.json records both supported builders and explicit rejection reasons. At the initial builder release, 707 of 944 manifests produce packages across their declared platforms; 656 are available on x86_64 Linux. A Home Manager reconciliation module is still planned separately—installing a package does not mutate Herdr's plugin registry automatically.