# callmerev95/chordly architecture

> Architecture diagram of the GitHub repository callmerev95/chordly, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-15). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/callmerev95/chordly
- Repository: https://github.com/callmerev95/chordly

## Overview

Chordly is an Android-first YouTube Music player with discovery, playback, synced lyrics, downloads, and audio-output controls; it also includes listening-party support and TV, Wear OS, and web code. The primary flow is listeners browsing account-backed music and playing it through a background service, with optional audio processing and casting. The map preserves major README capabilities and substantial indexed modules. Edges are limited to documented README behavior or visible excerpts and SOURCE INDEX references; unsampled subsystems are represented without speculative wiring.

Main entry points: [`app/src/main/java/com/chordly/MainActivity.kt`](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/MainActivity.kt) (Android app), [`app/src/main/java/com/chordly/playback/PlaybackService.kt`](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/PlaybackService.kt) (Playback service), [`shared/src/jvmSharedMain/kotlin/com/chordly/data/YtMusicRepository.kt`](https://github.com/callmerev95/chordly/blob/rebrand/chordly/shared/src/jvmSharedMain/kotlin/com/chordly/data/YtMusicRepository.kt) (Home and explore), [`app/src/main/java/com/chordly/playback/cast/CastController.kt`](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/cast/CastController.kt) (Cast control)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["Listener experience"]
  node_android_app["Android app<br/>[MainActivity.kt]"]
  node_home_discovery["Home and explore"]
end

subgraph group_music["Music and library"]
  node_lyrics["Synced lyrics<br/>[LyricsQuery.kt]"]
  node_account["Account settings<br/>[AppSettings.kt]"]
  node_yt_repository["YouTube Music data"]
  node_source_registry["Music sources<br/>[SourceRegistry.kt]"]
end

subgraph group_playback["Playback and audio"]
  node_playback_service["Playback service<br/>[PlaybackService.kt]"]
  node_crossfade["Smart crossfade"]
  node_bitperfect["Bit-perfect output"]
  node_cast_controller["Cast control<br/>[CastController.kt]"]
  node_cast_playback["Cast playback<br/>[CastPlayback.kt]"]
end

subgraph group_services["Offline and social"]
  node_offline_playlists[("Offline playlists")]
  node_downloads["Download manager<br/>[Downloads.kt]"]
  node_download_service["Download workers<br/>[DownloadService.kt]"]
  node_listen_together["Listen together<br/>[ListenTogether.kt]"]
  node_party_server["Party server<br/>[main.go]"]
end

subgraph group_platforms["Other platforms"]
  node_tv_app["TV app<br/>[TvActivity.kt]"]
  node_wear_playback["Watch playback"]
  node_web_player["Web player<br/>[engine.ts]"]
end

node_listener(("Listener"))

node_listener -->|"uses"| node_android_app
node_android_app -.->|"browses"| node_home_discovery
node_home_discovery -->|"loads catalog"| node_yt_repository
node_yt_repository -.->|"uses account"| node_account
node_android_app -->|"shows lyrics"| node_lyrics
node_android_app -.->|"starts playback"| node_playback_service
node_playback_service -->|"loads settings"| node_account
node_playback_service -->|"uses transitions"| node_crossfade
node_playback_service -->|"configures output"| node_bitperfect
node_playback_service -->|"controls casting"| node_cast_controller
node_cast_controller -->|"delegates playback"| node_cast_playback
node_android_app -.->|"selects sources"| node_source_registry
node_android_app -.->|"manages playlists"| node_offline_playlists
node_downloads -->|"starts workers"| node_download_service
node_android_app -.->|"queues downloads"| node_downloads
node_android_app -.->|"joins parties"| node_listen_together
node_listen_together -.->|"exchanges party data"| node_party_server
node_listener -.->|"uses"| node_tv_app
node_listener -.->|"uses"| node_wear_playback
node_listener -.->|"uses"| node_web_player

click node_android_app "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/MainActivity.kt"
click node_home_discovery "https://github.com/callmerev95/chordly/blob/rebrand/chordly/shared/src/jvmSharedMain/kotlin/com/chordly/data/YtMusicRepository.kt"
click node_lyrics "https://github.com/callmerev95/chordly/blob/rebrand/chordly/shared/src/jvmSharedMain/kotlin/com/chordly/data/lyrics/LyricsQuery.kt"
click node_account "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/data/settings/AppSettings.kt"
click node_yt_repository "https://github.com/callmerev95/chordly/blob/rebrand/chordly/shared/src/jvmSharedMain/kotlin/com/chordly/data/YtMusicRepository.kt"
click node_source_registry "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/data/sources/SourceRegistry.kt"
click node_offline_playlists "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/data/OfflinePlaylists.kt"
click node_playback_service "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/PlaybackService.kt"
click node_crossfade "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/CrossfadeController.kt"
click node_bitperfect "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/audio/bitperfect/BitPerfectOutput.kt"
click node_cast_controller "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/cast/CastController.kt"
click node_cast_playback "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/cast/CastPlayback.kt"
click node_downloads "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/download/Downloads.kt"
click node_download_service "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/download/DownloadService.kt"
click node_listen_together "https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/data/listentogether/ListenTogether.kt"
click node_party_server "https://github.com/callmerev95/chordly/blob/rebrand/chordly/backend/main.go"
click node_tv_app "https://github.com/callmerev95/chordly/blob/rebrand/chordly/tv/src/main/java/com/chordly/TvActivity.kt"
click node_wear_playback "https://github.com/callmerev95/chordly/blob/rebrand/chordly/wearos/src/main/java/com/chordly/wear/playback/WatchPlaybackService.kt"
click node_web_player "https://github.com/callmerev95/chordly/blob/rebrand/chordly/web/app/src/playback/youtube/engine.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_android_app,node_home_discovery toneBlue
class node_lyrics,node_account,node_yt_repository,node_source_registry toneAmber
class node_playback_service,node_crossfade,node_bitperfect,node_cast_controller,node_cast_playback toneMint
class node_offline_playlists,node_downloads,node_download_service,node_listen_together,node_party_server toneRose
class node_tv_app,node_wear_playback,node_web_player,node_listener toneIndigo
```

## Components

### Listener experience

- [Android app](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/MainActivity.kt): `app/src/main/java/com/chordly/MainActivity.kt`
- [Home and explore](https://github.com/callmerev95/chordly/blob/rebrand/chordly/shared/src/jvmSharedMain/kotlin/com/chordly/data/YtMusicRepository.kt): `shared/src/jvmSharedMain/kotlin/com/chordly/data/YtMusicRepository.kt`

### Music and library

- [Synced lyrics](https://github.com/callmerev95/chordly/blob/rebrand/chordly/shared/src/jvmSharedMain/kotlin/com/chordly/data/lyrics/LyricsQuery.kt): `shared/src/jvmSharedMain/kotlin/com/chordly/data/lyrics/LyricsQuery.kt`
- [Account settings](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/data/settings/AppSettings.kt): `app/src/main/java/com/chordly/data/settings/AppSettings.kt`
- [YouTube Music data](https://github.com/callmerev95/chordly/blob/rebrand/chordly/shared/src/jvmSharedMain/kotlin/com/chordly/data/YtMusicRepository.kt): `shared/src/jvmSharedMain/kotlin/com/chordly/data/YtMusicRepository.kt`
- [Music sources](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/data/sources/SourceRegistry.kt): `app/src/main/java/com/chordly/data/sources/SourceRegistry.kt`

### Playback and audio

- [Playback service](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/PlaybackService.kt): `app/src/main/java/com/chordly/playback/PlaybackService.kt`
- [Smart crossfade](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/CrossfadeController.kt): `app/src/main/java/com/chordly/playback/CrossfadeController.kt`
- [Bit-perfect output](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/audio/bitperfect/BitPerfectOutput.kt): `app/src/main/java/com/chordly/playback/audio/bitperfect/BitPerfectOutput.kt`
- [Cast control](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/cast/CastController.kt): `app/src/main/java/com/chordly/playback/cast/CastController.kt`
- [Cast playback](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/playback/cast/CastPlayback.kt): `app/src/main/java/com/chordly/playback/cast/CastPlayback.kt`

### Offline and social

- [Offline playlists](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/data/OfflinePlaylists.kt): `app/src/main/java/com/chordly/data/OfflinePlaylists.kt`
- [Download manager](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/download/Downloads.kt): `app/src/main/java/com/chordly/download/Downloads.kt`
- [Download workers](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/download/DownloadService.kt): `app/src/main/java/com/chordly/download/DownloadService.kt`
- [Listen together](https://github.com/callmerev95/chordly/blob/rebrand/chordly/app/src/main/java/com/chordly/data/listentogether/ListenTogether.kt): `app/src/main/java/com/chordly/data/listentogether/ListenTogether.kt`
- [Party server](https://github.com/callmerev95/chordly/blob/rebrand/chordly/backend/main.go): `backend/main.go`

### Other platforms

- [TV app](https://github.com/callmerev95/chordly/blob/rebrand/chordly/tv/src/main/java/com/chordly/TvActivity.kt): `tv/src/main/java/com/chordly/TvActivity.kt`
- [Watch playback](https://github.com/callmerev95/chordly/blob/rebrand/chordly/wearos/src/main/java/com/chordly/wear/playback/WatchPlaybackService.kt): `wearos/src/main/java/com/chordly/wear/playback/WatchPlaybackService.kt`
- [Web player](https://github.com/callmerev95/chordly/blob/rebrand/chordly/web/app/src/playback/youtube/engine.ts): `web/app/src/playback/youtube/engine.ts`

### Other components

- **Listener**

## Connections

- Listener → Android app: uses (evidence: `README.md`)
- Android app → Home and explore: browses
- Home and explore → YouTube Music data: loads catalog (evidence: `shared/src/jvmSharedMain/kotlin/com/chordly/data/YtMusicRepository.kt`)
- YouTube Music data → Account settings: uses account
- Android app → Synced lyrics: shows lyrics (evidence: `README.md`)
- Android app → Playback service: starts playback (evidence: `app/src/main/java/com/chordly/playback/PlaybackService.kt`)
- Playback service → Account settings: loads settings (evidence: `app/src/main/java/com/chordly/playback/PlaybackService.kt`)
- Playback service → Smart crossfade: uses transitions (evidence: `app/src/main/java/com/chordly/playback/PlaybackService.kt`)
- Playback service → Bit-perfect output: configures output (evidence: `app/src/main/java/com/chordly/playback/PlaybackService.kt`)
- Playback service → Cast control: controls casting (evidence: `app/src/main/java/com/chordly/playback/PlaybackService.kt`)
- Cast control → Cast playback: delegates playback (evidence: `app/src/main/java/com/chordly/playback/cast/CastController.kt`)
- Android app → Music sources: selects sources
- Android app → Offline playlists: manages playlists
- Download manager → Download workers: starts workers (evidence: `app/src/main/java/com/chordly/download/DownloadService.kt`)
- Android app → Download manager: queues downloads
- Android app → Listen together: joins parties
- Listen together → Party server: exchanges party data
- Listener → TV app: uses
- Listener → Watch playback: uses
- Listener → Web player: uses
