Stillwater

Stillwater

apps.detail.types.app from sydlexius' Repository

apps.detail.sections.overview

Artist metadata and image management for Emby, Jellyfin, and Kodi. Manage NFO files, artwork, and metadata across your media library.

Stillwater

CI Release codecov OpenSSF Scorecard License: GPL-3.0 Go Version

Stillwater is a self-hosted web app that curates the artist and composer metadata for your music library and gets it where it needs to go: into the artist.nfo files your servers read, pushed to Emby or Jellyfin over their APIs, or both. It pulls from ten metadata providers with per-field fallback, so the indie, regional, classical, and non-Latin-script artists that leave other tools blank usually resolve here, and per-library locking keeps your manual edits from being clobbered the next time a server refreshes.

Full documentation: https://sydlexius.github.io/stillwater/

Features

  • Ten metadata providers, per-field fallback. MusicBrainz, Fanart.tv, Discogs, TheAudioDB, Spotify, Last.fm, Deezer, Genius, Wikidata, and Wikipedia, ranked per field so when one source comes up empty another fills the gap, plus opt-in DuckDuckGo web image search for the stragglers.
  • Deliver by NFO writeback, direct API push, or both. Write artist.nfo files that Emby, Jellyfin, and Kodi all read cleanly, and/or push edits straight to Emby and Jellyfin over their APIs. Stillwater only ever touches metadata and artwork, never your audio files.
  • Per-library edit locking. Your manual corrections stay put instead of drifting back every time a media server rewrites the file on refresh.
  • Rule-driven cleanup with a conflict gate. A rule engine flags missing, inconsistent, or low-quality metadata and artwork and fixes it in bulk or one at a time, with a round-trip conflict check guarding every write-back.
  • Artwork pipeline. Fetch, compare, and crop thumbnails, fanart, logos, and banners across providers from a single comparison view.
  • Reports and a live dashboard. Library-health scoring, a prioritized action queue, duplicate detection, the Unmatched Files report, and a live activity feed.
  • Runs on your hardware. Single binary or container, SQLite, no cloud, no telemetry, no account, with a REST API at /api/v1/ and webhooks for automation.

Quick start

# docker-compose.yml
services:
  stillwater:
    image: ghcr.io/sydlexius/stillwater:latest
    container_name: stillwater
    ports:
      - "1973:1973"
    environment:
      - PUID=99
      - PGID=100
      - GOMAXPROCS=2  # keep equal to `cpus` below
      - GOMEMLIMIT=2400MiB  # keep at ~80% of `mem_limit` below
    volumes:
      - stillwater-data:/config
      - /path/to/your/music:/music:rw
    restart: unless-stopped
    cpus: "2.0"
    pids_limit: 512
    mem_limit: 3g
    mem_reservation: 512m
    ulimits:
      nofile:
        soft: 8192
        hard: 8192

volumes:
  stillwater-data:
docker compose up -d

Then open http://localhost:1973.

Looking for a different install path, configuration knobs, or details on how Stillwater plays with media-server NFO write-back? It's all on the project site: install guides (Docker, binary, Unraid Community Applications, reverse proxy), environment-variable reference, encryption-key handling, the round-trip-conflict gate, and the full OpenAPI reference.

Binary downloads live on the Releases page. Nightly builds (nightly-YYYYMMDD) ship from main each day there are new commits. See the self-update guide for the nightly channel.

Release binaries are code-signed; see the Code Signing Policy for the signing process and role listing. For a description of what network connections Stillwater makes, see the Privacy Policy.

Contributing

Contributions are welcome. See CONTRIBUTING.md for the dev environment setup, code style, and pull-request workflow. Participants are expected to follow the project Code of Conduct.

License

GPL-3.0

apps.marketingCta.appInstallTitle

apps.marketingCta.appInstallDescription

apps.installHelp.stepOpen apps.installHelp.stepSearchApp apps.installHelp.stepReview apps.installHelp.stepInstall

apps.detail.sections.categories

apps.detail.sections.related

apps.detail.sections.details

apps.detail.details.repository
ghcr.io/sydlexius/stillwater
apps.detail.details.lastUpdated2026-08-08
apps.detail.details.firstSeen2026-04-27

apps.detail.sections.runtime

apps.detail.details.webui
http://[IP]:[PORT:1973]
apps.detail.details.network
bridge
apps.detail.details.shell
sh
apps.detail.details.privileged
false

apps.detail.sections.configuration

Web UI PortPorttcp

Web interface port.

apps.detail.config.target
1973
apps.detail.config.default
1973
apps.detail.config.value
1973
AppdataPathrw

Stores configuration, database, and backups.

apps.detail.config.target
/config
Music LibraryPathrw

Path to your music library. Maps to /music inside the container.

apps.detail.config.target
/music
PUIDVariable

User ID for file permissions. Default 99 maps to nobody on Unraid.

apps.detail.config.default
99
apps.detail.config.value
99
PGIDVariable

Group ID for file permissions. Default 100 maps to users on Unraid.

apps.detail.config.default
100
apps.detail.config.value
100
Encryption KeyVariable

AES-256 encryption key for API secrets stored at rest. Auto-generated on first run if left blank. Set an explicit value to preserve access to stored secrets across container recreations.

apps.detail.config.target
SW_ENCRYPTION_KEY
Log LevelVariable

Log verbosity: info, debug, warn, or error.

apps.detail.config.target
SW_LOG_LEVEL
apps.detail.config.default
info
apps.detail.config.value
info
Log FormatVariable

Log output format: json or text.

apps.detail.config.target
SW_LOG_FORMAT
apps.detail.config.default
json
apps.detail.config.value
json
Base PathVariable

URL prefix for subfolder reverse proxy deployments, for example /stillwater. Leave blank for root deployments.

apps.detail.config.target
SW_BASE_PATH