Releases: crypt0rr/ArtistTrackarr
Release list
ArtistTrackarr v0.63.4
Maintenance release
- Refreshes the pinned Go 1.27.1 and Alpine 3.24 base-image digests.
- Refreshes the pinned Docker Buildx, Build/Push, and QEMU action digests.
- Updates modernc.org/sqlite to v1.59.0 and its libc dependency.
- Publishes the v0.63.4 multi-architecture container image.
ArtistTrackarr v0.63.3
Maintenance release
- Updates the Go toolchain to 1.27.1 and refreshes SQLite, x/crypto, and x/sys dependencies.
- Pins Dockerfile syntax, base-image, and QEMU action references immutably.
- Updates govulncheck to v1.8.0 and aligns the documented tooling versions.
- Publishes the v0.63.3 multi-architecture container image.
ArtistTrackarr v0.63.2
What's Changed
Full Changelog: v0.63.1...v0.63.2
ArtistTrackarr v0.63.1
What's Changed
Full Changelog: v0.63.0...v0.63.1
ArtistTrackarr v0.63.0
Reliability and release confidence
- Bound unauthenticated
/readyzwriter probes with single-flight caching, a short freshness window, and a strict deadline. - Added regression coverage for concurrent callers, cached failures, and canceled waiters.
- Added an isolated Docker disaster-recovery gate covering backup/restore, checksum enforcement, encrypted destination recovery, wrong-key rejection, restart persistence, and signal cleanup.
- Release publication now waits for the disaster-recovery rehearsal.
ArtistTrackarr v0.62.0
What's Changed
- Update module github.com/golangci/golangci-lint/v2 to v2.13.1 by @renovate[bot] in #293
- Add notification throttling and align settings layout by @crypt0rr in #300
Full Changelog: v0.61.1...v0.62.0
v0.61.1 — the gates, checked
A patch release for the checks v0.61.0 added, after those checks were reviewed adversarially and eight faults were found in them.
None was a live bug. Every one was a check narrower than its name, or a diagnostic that printed nothing. Nothing in the running application behaves differently — this release makes the safeguards actually cover what they claim to.
The checks now cover what they say
The new SQL bind-argument check did not cover this project's own preferred way of writing to the database, so a test named for every SQL statement was quietly skipping 31 of them. It now covers 316 statements rather than 287, and it fails if someone adds a future write helper without listing it — so this particular gap cannot reopen.
Two smaller gaps in the same check are closed. A statement stored in one kind of Go declaration was skipped entirely, meaning a single keyword silently decided whether it was checked. And statements assembled from other constants were never resolved at all — which covers the ones involved in the defect that motivated the check in the first place.
Diagnostics that said nothing
When the container reported the wrong version, the failure message printed the expected version and then nothing at all where the actual one belonged — the same no-reason failure the message was written to prevent.
The Compose command in the README, the one a reader copies and runs, was the only version reference no check verified. A release could bump everything else and leave that command pinned to the previous image. It is checked now, and that check caught exactly this on its first outing.
An unreadable version constant silently switched the version check back off rather than failing — the state that check spent sixteen releases in.
Tests
The suite now sets an explicit timeout. Go's ten-minute default sits close enough to how long these tests actually take that ordinary load on a developer machine produced a failure that looked exactly like a hang, at a commit where the build was green.
v0.61.0 — the gates
A release about the gates rather than the features. Five of the previous release's 44 findings turned out to be residuals — a fix applied to one of several places, or an invariant asserted in a comment rather than in code — so this one closes the ways that keeps happening.
Nothing changes in the interface. There are two things for operators, and the rest is machinery that exists to stop defects reaching you.
For operators
Rolling back to an earlier image is now refused instead of silently breaking. Database migrations only move forward, and three recent ones remove a table and two columns that older builds still read. Until now, downgrading a deployment to a previous image tag started cleanly, passed its health check, and then failed on the first authenticated request — the worst possible place to discover it. The application now refuses to start against a database a newer release has migrated, names both schema versions, and tells you to restore the backup taken before the upgrade.
Downgrades were never supported; they now fail loudly rather than quietly. This is also written down in the README's backup section, which previously covered upgrades and said nothing about going back.
The published image is now checked against its own version tag. A check has existed since v0.46.1 that a built image reports the version it was built from — but nothing ever switched it on, so it had not run once in the sixteen releases since. It runs now, and on a tagged build it verifies the image about to be published reports the version it is being published as.
Two new automated checks
Every SQL statement in the application is now checked so its placeholders and its arguments agree. The database driver reports too few arguments as an error but silently ignores extra ones, so a mismatched statement runs, returns rows, and answers a different question than the one written — which is how one real defect shipped. 287 statements are covered, 59 of which carry four or more placeholders and one carries 21. Nobody verifies those by eye.
make mutate reintroduces each already-fixed defect in turn and confirms the test written for it still fails. Every fix in this project is proved that way; done by hand the proof happens once and then decays. Twenty-eight are now recorded and repeatable.
A duplicate-code check was also enabled, chosen on evidence: run against the tree a previous review examined by hand, it reports that review's largest finding in seconds.
Internal consistency
The outbound network policy — which addresses this application refuses to contact — existed as two identical copies, one for webhooks and one for artwork, kept in agreement by a comment on each asking the reader to keep them aligned. There is now one. The same was true of the delivery retry schedule, which existed three times with two different argument conventions.
Several existing tests could not fail. The credential audit log added in v0.60.0 was verified by a test that emitted the events itself and then asserted they came back; it now drives the real sign-out and feed-token routes and reads the server's own log.
v0.60.0 — the backlog closed
Finishes the fifth review's backlog, closing the remaining 27 findings — all 44 are now resolved.
Notifications
A daily digest is no longer silently skipped for a whole day after you change your profile timezone. The previous release repaired this for weekly digests and, for daily ones, made it slightly worse — no time window can separate the two cases, because the previous day's digest is created at your reminder time and can sit an hour before the new period even begins.
An interrupted shutdown no longer marks queued "Sync now" requests as permanently failed, and no longer reports artists it never attempted as synchronisation failures. A notification the provider already accepted is no longer recorded as failed because the database write ran out of time. And one member's digest failure no longer abandons everyone after them in the queue.
Apple/iTunes discovery
Three improvements, each checked against the live API:
- A prolific artist's catalogue is capped at 200 albums by Apple. That truncation is now detected, so the MusicBrainz fallback still runs and fills the gap instead of being suppressed by an apparently successful check.
- Guest credits are found when the feature is named in the track title rather than the artist field, which is how Apple expresses most of them. For one artist, 31 of 50 results were previously discarded.
- Compilations are recognised, so the per-artist Compilations toggle works on an iTunes deployment as it already did on a Spotify one.
ListenBrainz returning "no data" for an artist no longer overwrites a known listener total with zero.
Links follow your decision
When your household confirms which source represents a release, the calendar export, the digest and the notification bodies now all link there. Previously only the release page did.
Interface
A calendar month outside the export's one-year window is told plainly that the feed does not reach it, rather than being pointed at an export that would come back without those releases. Following one of this application's own calendar event links while signed out now returns you to that release after signing in, instead of dropping you on the dashboard.
For operators
Sign-ins, sign-outs, rejected attempts, password changes, invite and reset links, feed tokens and account deletions are all recorded in the application log, which previously held only failures.
Log-loss and database-contention warnings clear once they stop recurring, instead of pinning the instance to "degraded" until it restarts — and the persisted health history can finally record them at all. A dropped SSH session during a backup no longer leaves the application stopped. Provider counts no longer display as "-1 releases returned".
Deleting a household account now removes its delivery audit rows, which had retained the member-authored destination label.
Under the hood
Several tables, columns, methods and a template that were written but never read are removed. The artwork sweep's index is now actually used by the query it was created for, replacing a full scan that ran every sixty seconds.
Upgrade: ghcr.io/crypt0rr/artist-trackarr:0.60.0. Four schema migrations apply automatically; no manual steps.
Gates: go test 12/12 · -race -p 1 clean · coverage 81.5% ≥ 80.0% · lint 0 issues · govulncheck 0 · CI green on the merge commit and the tag.
v0.59.0 — one governing follow
Starts on the fifth review's backlog (#291) and rebuilds the part of the notification engine that backlog kept pointing at. 17 findings fixed; 27 remain open and will follow.
Five pause defects, one cause
Three different pieces of code decided which of your follows governs a given alert, and only one of them actually chose — the other two matched any follow connected to the release. That produced all five issues at once:
- Pausing one artist could move an alert a different, still-active follow was in charge of, and could reset an ordinary retry backoff no pause had created.
- Extending a pause left its alerts due at the old, earlier time, so they arrived while the follow still read "Paused until" a later date.
- An alert held back by a pause, on a destination that then failed often enough to be switched off, had no automatic way back once the destination recovered. You had to know to press "Retry failed deliveries" a second time after the pause expired, which nothing told you.
- Removing an artist from your watchlist left its already-queued alerts in place, so a notification could still arrive months later for an artist you had removed.
There is now one definition of "which follow governs this alert", and the code that admits a notification calls the same function as everything that reschedules one.
Recovering a destination now reports separately how many alerts it made runnable and how many it unblocked but is holding until a pause ends — instead of saying "0 queued for retry" beside a destination still showing failures.
Elsewhere
Pausing an artist and letting the pause lapse no longer leaves the Artists page insisting it is still paused with the Pause button replaced by "Resume now"; that page also shows the pause expiry in your own timezone rather than raw UTC.
Arriving from a homelab dashboard tile, a webmail tab, or one of this application's own calendar links no longer silently invalidates the forms you have open and loses what you had typed.
For operators
A TRUST_PROXY misconfiguration, application-log loss, and SQLite write contention are all reported rather than silent. Provider failure messages now survive a tick where the provider was deliberately not contacted, instead of being erased. Startup security warnings reach the stored log rather than only stdout. And three diagnostic fields that exist purely as operator signal — including the invite-link fingerprint added specifically so a failing link can be traced without exposing the token — are no longer destroyed by log redaction.
Destination test and retry throttles are keyed per member and checked after ownership, closing two ways the cap could be sidestepped.
Upgrade: ghcr.io/crypt0rr/artist-trackarr:0.59.0. No manual migration steps; no schema change.
Gates: go test 12/12 · -race -p 1 clean · coverage 81.3% ≥ 80.0% · lint 0 issues · govulncheck 0 · Docker test and quality stages · CI green on the merge commit and the tag.