• v2026.09.11.0329
    test-web / test (push) Successful in 1m5s
    test-go / test (push) Successful in 1m33s
    test-go / integration (push) Successful in 4m25s
    android / Build + lint + test (push) Successful in 5m33s
    release / Build signed APK (releases and dev) (push) Successful in 4m38s
    release / Build + push container image (push) Successful in 16s
    release / Verify release artifacts (tag releases only) (push) Successful in 2s
    Stable

    bvandeusen released this 2026-09-10 23:44:15 -04:00 | 0 commits to main since this release

    Recommendations that stay where you put them, a rollback unit, and a version that names what shipped.

    Your mixes should feel tighter

    "Songs like X" stopped wandering. It shared a scoring profile with For You, and those two want opposite things — For You roams by design, Songs-like should not. Under the shared weights, an unrelated track you'd liked and hadn't played recently outranked a perfect similarity match you hadn't liked. Liking something beat sounding like the seed.

    It now has its own profile where similarity outweighs everything not related to the seed. The same pair that scored 2.50 against 5.50 now scores 5.00 against 2.00.

    Songs-like can include the seed artist's own music. It used to filter it out, which threw away the tracks most likely to sound like the seed and then reached further away to replace them. It's bounded at 3 of 25 by the diversity cap rather than excluded.

    Radio no longer collapses onto one artist. There was no per-artist cap in the radio path at all, while every comparable surface had one. The caps scale with the length you ask for, and they change which tracks are picked rather than how many — a radio never comes back short because the cap couldn't be satisfied.

    The candidate pool scales with your library. It was a fixed ~170 candidates whether you had 500 tracks or 100,000, so it sampled a shrinking fraction of a growing collection. It now grows with the library, per-arm, bounded.

    These are starting values rather than measured ones. Everything above is adjustable in Admin → Tuning with no restart; if Songs-like now feels too narrow, lower its Similarity weight.

    Image tags changed — read this if you pin one

    :latest          production; tracks main's tip
    :<commit-sha>    NEW — immutable, the rollback unit
    :dev             the rolling test channel
    

    :vYYYY.MM.DD.HHMM and :main are no longer published. Existing version-tagged images still work and are untouched; they simply aren't extended. If you pinned one, move to a :<commit-sha> — every main push publishes one now, so any production commit is addressable without waiting for a release.

    Rolling back to :<commit-sha> pins the server, not the server-and-app pair: the Android APK is baked in at image build time, so a SHA image carries whichever app was current then.

    Also

    • A release tag now names the last commit that actually shipped something — a CI-only or docs-only commit no longer moves the version.
    • The build context shrank by half (42.7 MB → 21.8 MB); .dockerignore had been excluding CI directories this repo doesn't have while missing the one it does.
    • Two Moe Shop files in WWW (2020) are the same audio under different tags — a library-content issue, not a player one, if you'd noticed something odd there.

    Upgrading

    Nothing to do. Migration 0057 runs at startup. System mixes rebuild on their next daily cycle, so the tuning above takes effect then rather than instantly.

    🤖 Generated with Claude Code

    https://claude.ai/code/session_01SQ31KQpYbStyK5y58UmPLH

    Downloads