- Nix 90.6%
- Python 9.2%
- Just 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .forgejo/workflows | ||
| data | ||
| nix | ||
| scripts | ||
| .gitignore | ||
| actionlint.yaml | ||
| flake.lock | ||
| flake.nix | ||
| justfile | ||
| LICENSE | ||
| README.md | ||
| renovate.json | ||
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.lockand no unhashed Git dependencies; - npm projects with complete
package-lock.jsonintegrity metadata; - dependency-free Go modules with explicit
go buildcommands.
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.