Skip to content

Navidrome - Plugins

Configuration options for navidrome plugins.

Available Options

This page documents 8 configuration options.

Additional Options

This page has the following additional configuration options:

nixflix.navidrome.plugins

Navidrome plugins to manage declaratively. Each key is a plugin's nixflix-facing name (usually, but not required to be, the same as its pkgs.pkgsCross.wasi32.navidromePlugins attribute name, e.g. "apple-music", "audiomuseai"). A default package and strongly-typed config sub-options are provided for some popular plugins.

For a plugin not in that first-class table (e.g. only published as a .ndp release asset on its own GitHub repo), set package yourself, and apiId too if it doesn't already match that package — see those options' docs.

Typeopen submodule of attribute set of (submodule)
Default
{
  apple-music = {
    package = <derivation apple-music-plugin-static-wasm32-unknown-wasip1-0.2.0>;
  };
  audiomuseai = {
    package = <derivation audiomuseai-static-wasm32-unknown-wasip1-10>;
  };
  discord-rich-presence = {
    apiId = "discord-rich-presence-plugin";
    package = <derivation discord-rich-presence-plugin-static-wasm32-unknown-wasip1-2.0.0>;
  };
  listenbrainz-daily-playlist = {
    package = <derivation listenbrainz-daily-playlist-static-wasm32-unknown-wasip1-6.0.0>;
  };
  lyrics = {
    apiId = "nd-lyrics";
    package = <derivation lyrics-plugin-static-wasm32-unknown-wasip1-8.1.0>;
  };
}
Declared inmodules/navidrome/plugins/fromGenerated.nix, modules/navidrome/plugins

nixflix.navidrome.plugins.<name>.allLibraries

PUT as allLibraries.

Typeboolean
Default
false

nixflix.navidrome.plugins.<name>.allowWriteAccess

PUT as allowWriteAccess.

Typeboolean
Default
false

nixflix.navidrome.plugins.<name>.apiId

The plugin's /api/plugin/<id> id. This must equal the basename (without .ndp) of the file actually installed to services.navidrome.finalPackage's plugin folder, i.e. package's pname (or bundleName) — not necessarily this attribute's name. It defaults to the attribute name only as a convenience, for packages where the two happen to line up; set it explicitly whenever they don't (see the discord-rich-presence/lyrics first-class plugins for existing examples of this).

Typestring
Default
"‹name›"

nixflix.navidrome.plugins.<name>.config

Plugin configuration. Strongly typed for plugins with a generated ./<name>-plugin.nix, else freeform.

When freeform, you can get the values from the web browser developer tools when changing the specified plugins settings.

Typeopen submodule of attribute set of anything
Default
{ }

nixflix.navidrome.plugins.<name>.enable

Whether to install this plugin's package into services.navidrome.plugins and configure+enable it via the Navidrome API.

Typeboolean
Default
false

nixflix.navidrome.plugins.<name>.libraries

PUT as libraries (JSON-encoded) when allLibraries = false.

Typelist of string
Default
[ ]

nixflix.navidrome.plugins.<name>.package

Package producing this plugin's .ndp bundle.

For a plugin not packaged in nixpkgs (i.e. not available under pkgs.pkgsCross.wasi32.navidromePlugins), wrap its .ndp release asset in a minimal derivation. passthru.isNavidromePlugin = true is required, as services.navidrome.plugins only accepts packages carrying that flag. Navidrome installs the plugin under this derivation's pname (or bundleName), so apiId must match that same name.

Typepackage
Default
null
Example
pkgs.stdenvNoCC.mkDerivation {
  pname = "discord-rpc-nd";
  version = "1.2.0";
  src = pkgs.fetchurl {
    url = "https://github.com/<owner>/<repo>/releases/download/v1.2.0/discord-rpc-nd.ndp";
    hash = "sha256-<ndp-hash>";
  };
  dontUnpack = true;
  installPhase = ''
    mkdir -p $out/share
    cp $src $out/share/discord-rpc-nd.ndp
  '';
  passthru.isNavidromePlugin = true;
}