Navidrome Plugin Examples

This folder contains example plugins for Navidrome that demonstrate how to build metadata agents using the plugin system.

Building

Prerequisites

Build all plugins

make all

This will compile all (Go) example plugins and place the .wasm files in this directory.

Build a specific plugin

make minimal.wasm
make wikimedia.wasm

Clean build artifacts

make clean

Available Examples

Plugin Language Description
minimal Go A minimal example showing the basic plugin structure
wikimedia Go Fetches artist metadata from Wikidata, DBpedia, and Wikipedia
crypto-ticker Go Real-time cryptocurrency prices from Coinbase using WebSocket
discord-rich-presence Go Discord Rich Presence integration using Scrobbler, WebSocket, Scheduler
coverartarchive-py Python Album cover art from Cover Art Archive (Python example)
nowplaying-py Python Logs currently playing tracks using Scheduler and SubsonicAPI

Testing with Extism CLI

You can test any plugin using the Extism CLI:

# Test the manifest
extism call minimal.wasm nd_manifest --wasi

# Test with input
extism call minimal.wasm nd_get_artist_biography --wasi \
  --input '{"id":"1","name":"The Beatles"}'

For plugins that make HTTP requests, use --allow-host to permit access:

extism call wikimedia.wasm nd_get_artist_biography --wasi \                                                                                      3s   ▼ 
  --input '{"id":"1","name":"Yussef Dayes"}' \
  --allow-host "query.wikidata.org" --allow-host "en.wikipedia.org"

Installation

Copy any .wasm file to your Navidrome plugins folder:

cp wikimedia.wasm /path/to/navidrome/plugins/

Then enable plugins in your navidrome.toml:

[Plugins]
Enabled = true
Folder = "/path/to/navidrome/plugins"

And add the plugin to your agents list:

Agents = "lastfm,spotify,wikimedia"

Creating Your Own Plugin

The plugin system supports multiple languages. See the minimal example for the simplest Go starting point, discord-rich-presence for a more complete Go example with HTTP requests, or coverartarchive-py for a Python example.

Bootstrapping a New Plugin

Use the XTP CLI to bootstrap a new plugin from a schema:

xtp plugin init \
  --schema-file plugins/schemas/metadata_agent.yaml \
  --template go \
  --path ./my-plugin \
  --name my-plugin

See the schemas README for more information about available schemas and supported languages.

For the simplest starting point, look at minimal. For a more complete example with HTTP requests, see wikimedia.

For full documentation, see the Plugin System README.