apps.header.allAppsCount
Stillwater
apps.detail.types.app from sydlexius' Repository
apps.detail.sections.overview
Readme
View on GitHub
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.nfofiles 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
apps.marketingCta.appInstallTitle
apps.marketingCta.appInstallDescription
apps.detail.sections.categories
apps.detail.sections.related
apps.detail.related.exploreCategories
apps.detail.related.exploreAllapps.detail.sections.links
apps.detail.sections.details
ghcr.io/sydlexius/stillwaterapps.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 interface port.
- apps.detail.config.target
- 1973
- apps.detail.config.default
- 1973
- apps.detail.config.value
- 1973
Stores configuration, database, and backups.
- apps.detail.config.target
- /config
Path to your music library. Maps to /music inside the container.
- apps.detail.config.target
- /music
User ID for file permissions. Default 99 maps to nobody on Unraid.
- apps.detail.config.default
- 99
- apps.detail.config.value
- 99
Group ID for file permissions. Default 100 maps to users on Unraid.
- apps.detail.config.default
- 100
- apps.detail.config.value
- 100
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 verbosity: info, debug, warn, or error.
- apps.detail.config.target
- SW_LOG_LEVEL
- apps.detail.config.default
- info
- apps.detail.config.value
- info
Log output format: json or text.
- apps.detail.config.target
- SW_LOG_FORMAT
- apps.detail.config.default
- json
- apps.detail.config.value
- json
URL prefix for subfolder reverse proxy deployments, for example /stillwater. Leave blank for root deployments.
- apps.detail.config.target
- SW_BASE_PATH