Repository navigation
Navidrome Stat v0.8.8
Added
- Prometheus metrics now cover dashboard builds and cache outcomes, SQLite busy retries, imports, cover-art caching, and fixed-section query budgets.
- Recent Plays now offers on-demand details for attempts below the configured counting threshold. The details follow the current date, server, user, and timezone filters without labeling short sessions as intentional skips.
- Privacy export format v3 adds stable record IDs and fingerprints. Merge imports now report inserted, skipped, and conflicting rows; formats v1 and v2 remain importable and gain deterministic repeat-import deduplication.
- Readiness reports durable playback-write health separately from upstream polling health.
Changed
- First-use dashboards keep connection guidance, current collection status, and playback-accounting details available while collapsing empty historical charts and tables. Filtered empty results still show section-specific guidance.
- Dashboard cache misses now read all local sections from one consistent SQLite snapshot. IANA-timezone bucket scans stream rows to reduce peak memory use.
- The product display name is consistently "Navidrome Stat" across the interface, documentation, API metadata, and releases. Existing repository and Docker image names remain unchanged.
- New local checkouts keep runtime data under
.data/, while existing root-level databases remain automatically discoverable and Docker deployments continue using/data. - Tag releases now require strict SemVer, matching source and Docker versions, release notes, the complete test workflow, and a container smoke test. Stable releases publish
latest; prereleases do not. Successful image builds create a GitHub Release with the image digest and rollback guidance. - Backup guidance archives the complete data volume and includes a restore integrity check before production recovery.
- Advanced theme settings summarize contrast by text role without exposing raw ratios, while retaining validation across every editable background.
Fixed
- Cover-art caching preserves validated WebP and AVIF content types instead of defaulting unrecognized images to JPEG. The cache no longer writes unused MIME sidecar files.
- Cover-art proxy responses enforce a streaming size limit, verify the image signature, perform file operations off the event loop, and release per-key request locks after use.
- Retention previews no longer claim that
DELETEshrinks the SQLite database file; they report deleted record payload while explaining that SQLite reuses freed pages internally. - Older application versions now refuse databases with a newer schema before creating or changing schema objects and provide upgrade-or-restore guidance.
- Finite date-window queries now use schema v13 UTC epoch columns and source/user/time indexes instead of wrapping
played_atindatetime(), allowing SQLite to use the time index while preserving local-calendar and DST boundaries. - The Settings header distinguishes browser-only display preferences from connections and data controls saved by the service.
- Recent playback metadata is selected by playback time rather than insertion order, so importing older history cannot replace the latest title or timestamp.
- Album rankings persist upstream album IDs and keep same-named albums separate by source and artist; multi-server cover art uses each ranking row's source.
- Native
getSongHistoryimports commit and checkpoint each page, resume after limited batches or restarts, and retry failures with persisted exponential backoff. - Deleting a user's data discards active in-memory sessions and suppresses their already queued writes while allowing future plays to start fresh sessions.
- Year-in-review links, requests, responses, cache entries, aggregates, and visible labels preserve year, server, user, and timezone scope; the page reports loading and retry states, prevents outdated responses from replacing the selected year, and provides text summaries for charts.
- The review login dialog keeps keyboard focus within the dialog, the dashboard localizes its review link, and recent-play column preferences apply on mobile.
- The recent-play column menu remains visible outside short empty-state cards and stays open while multiple columns are changed.
- Playback-attempt rates now exclude backfill and native-history imports because those records were not observed as live playback sessions. Privacy-archive restores remain included.
- A cache invalidation error after a successful playback write is logged separately and no longer marks durable playback persistence as unhealthy.
Security
- Docker build contexts exclude local credential keys, databases, cover-art caches, backups, and
.data/contents. - Metrics use fixed section labels and do not include users, servers, tracks, or other high-cardinality identifiers.
Container image
Image: stepaniah/navidrome-statistic:v0.8.8
Digest: stepaniah/navidrome-statistic@sha256:b32e5621a4f3b90ae5eebbdb1bb15f3275579c55cc1222d7fe85ab2d8590c300
To roll back, deploy a previously published version tag. If the target version predates a schema migration, restore the matching data-volume backup instead of starting an unsupported downgrade.