Skip to content

Linked names stage 1: artist and album names link everywhere (MAD-837, MAD-838) - #68

Merged
madeofpendletonwool merged 2 commits into
mainfrom
mad-836-linked-names
Oct 14, 2026
Merged

madeofpendletonwool merged 2 commits into
mainfrom
mad-836-linked-names

Conversation

@madeofpendletonwool

Copy link
Copy Markdown
Owner

Stage 1 of Phase 13 (MAD-836): every artist and album name in the app opens its page, including up next and recently played in the full-screen player, wherever the song came from.

MAD-837: Shared links and cross-service lookup

  • New components in components/linked-names.tsx: ArtistLink, ArtistLinks (one link per credited artist) and AlbumLink. They replace track-credits.tsx, which only the now-playing sheet and room page used.
  • Direct when possible. If the song's link is one you can use (yours or shared) and the service gave an ID, the name is a plain link to /artist/$linkId/$artistId or /album/$linkId/$albumId.
  • Looked up otherwise. For a song from a link you can't use (a friend's unshared Spotify, say), or with no ID, tapping the name calls a new endpoint:
    • GET /resolve/artist?name= searches your links for an exact name match (match.Simplify), your own links before shared ones, all at once.
    • GET /resolve/album?title=&artist= does the same for an album, matching title and artist (new artistpage.AlbumElsewhere).
    • If no service has it, you land on a search for the name instead of a dead page.
    • Lookups are cached for 30 minutes. The link pulses while one runs. Its href is the search, so a modifier-click opens that in a new tab.
    • Guests may call both endpoints, like Search.
  • Now playing closes on any page change (AppShell listens for onBeforeNavigate). Links inside the sheet and its queue don't need to close it themselves.
  • Clicks on a name don't reach the row or card around it.

MAD-838: The sweep

Names now link in:

  • Queue rows: up next, recently played, my lane, history and stats (all QueueRow).
  • Track rows: search, album, artist, genre and service playlist pages. Artists now link too; only the album did before.
  • Syncphony playlist pages, the album page header (artists without an ID used to be plain text), the liner notes artist heading, and Discover's feed and release cards.

Left as plain text, on purpose:

  • The TV stage and visualizer, which have no pointer.
  • Game screens, so links don't spoil answers or fight the game's tap targets.
  • The Wrapped story, where taps move between screens.
  • Album cards, because the whole card is already a link and anchors can't nest.
  • The mini-player, which stays one tap target that opens now playing.
  • The crown moment overlay.

Testing

  • go test ./..., golangci-lint (0 issues), and web pnpm test (260), typecheck, lint and build all pass.
  • New tests:
    • TestAlbumElsewhere.
    • TestResolveArtistAndAlbum: own link preferred over a shared one, wrong artist is a 404, partial names don't match, blank name is a 400.
    • lib/names.test.ts.
    • linked-names.test.tsx: direct link, lookup on tap, and search fallback.
  • TrackRow and ReleaseCard now render links, so their tests mount inside a small memory router (src/test/router.tsx).
  • Not checked yet: nothing has been tried in a browser. Discover items are music you don't own, so their artist links will often land on the search fallback unless a service like Spotify has them.

🤖 Generated with Claude Code

madeofpendletonwool and others added 2 commits October 13, 2026 15:59
ArtistLink, ArtistLinks and AlbumLink replace track-credits. A name links
straight to its page when the link it came from is one you can use.
Otherwise, tapping it looks it up by name on your services through the
new GET /resolve/artist and /resolve/album, your own links before shared
ones. When none has it, you get a search for the name. Guests can use
them too.

Now playing closes on any page change, so links inside it, or in its
queue, don't open the page behind it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Artist and album names now link in queue rows (up next, recently played,
my lane, history and stats), track rows (search, album, artist, genre
and playlist pages), Syncphony playlists, the album page header, liner
notes, and Discover's feed and release cards.

Left as plain text: the TV and visualizer (no pointer), game screens,
the Wrapped story (taps move between screens), album cards (already a
link to the album), and the mini-player (one tap target that opens now
playing).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@madeofpendletonwool
madeofpendletonwool merged commit 8928b09 into main Oct 14, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant