Skip to content

feat(listen-together): listen in sync with friends in Metrolist-compatible rooms - #2391

Merged
maxrave-dev merged 4 commits into
devfrom
feat/listen-together
Aug 22, 2026
Merged

feat(listen-together): listen in sync with friends in Metrolist-compatible rooms#2391
maxrave-dev merged 4 commits into
devfrom
feat/listen-together

Conversation

@maxrave-dev

Copy link
Copy Markdown
Owner

Listen Together: create a room, share an 8-character code, and everyone hears the same track at the same position.

The rooms are the ones Metrolist already uses, so a SimpMusic client and a Metrolist client can sit in the same room. The protocol work is in the core submodule — see maxrave-dev/core#28, which must merge first.

What a user sees

  • Entry point in the Home and Library top bars, carrying a dot while a room is live.
  • Host creates a room; guests join by code, with approval unless auto-approve is on.
  • Host controls playback for the room. Guests may pause locally and stay paused — pressing play asks the server where the room is now and rejoins there, rather than resuming where this device happened to stop.
  • Settings: server choice, auto-approve joins, and a client-side blocklist.

Screen

Built as a page rather than a stack of identical cards: two columns once the window is wide enough for two real ones, with the room code as the one deliberately outsized element — it is the thing people read aloud. Connection state is a single line, members are a divided list, and leaving/settings are quiet Material buttons at the end.

Everything resolves through MaterialTheme.colorScheme, so it is correct on the light theme too. The screens the glass treatment was borrowed from (Album, Playlist, Artist, Analytics) all sit inside ForceDarkContent, so their white default tint is always over a dark page; this one follows the theme and has to pass its own.

Architecture

composeApp never sees the protocol. It talks to ListenTogetherRepository in domain; ListenTogetherRepositoryImpl in data is the only place that knows the service module exists.

Notes

  • Crossfade is suppressed inside a room (a fade overlaps two tracks for seconds and drifts the room apart). The user's setting is untouched — it is a separate override on the player, the same shape as the sleep-timer fade.
  • docs/ is removed in this branch.
  • version-name is bumped to 2.0.0-alpha, which the Windows MSI target rejects — desktopApp/build.gradle.kts only strips a -hf suffix today, so it needs substringBefore("-") before a desktop release build will configure.

Testing

Protocol round-trip and handshake tests live in core. Playback sync was exercised with two live clients against wss://metroserverx.meowery.eu/ws.

@maxrave-dev
maxrave-dev merged commit 4373378 into dev Aug 22, 2026
1 check failed
@maxrave-dev
maxrave-dev deleted the feat/listen-together branch August 22, 2026 18:55
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