Navidrome Plugin Examples

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

Building

Prerequisites

  • TinyGo (recommended) or Go 1.23+ (for Go plugins)
  • extism-py (for Python plugins)
  • Rust with wasm32-unknown-unknown target (for Rust plugins)
  • Extism CLI (optional, for testing)

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
webhook-rs Rust Sends HTTP webhooks on scrobble events (Rust example)

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, coverartarchive-py for a Python example, or webhook-rs for a Rust 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.