# owergungor/lyrow architecture

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

- Interactive diagram: https://gitdiagram.com/owergungor/lyrow
- Repository: https://github.com/owergungor/lyrow

## Overview

Lyrow is a native Windows music companion. The user-facing workflow is to launch the desktop app, detect the active GSMTC media session, normalize track metadata, retrieve lyrics and artwork, and present synchronized lyrics and playback controls; a shared timeline keeps track timing isolated. A parallel Ambient Glow module captures loopback audio, analyzes frequency/beat energy, and drives a non-interfering screen-edge overlay. The README documents these capabilities; unsampled UI and module implementations limit attribution of some internal calls, so those links are omitted rather than inferred.

Main entry points: [`src/Lyrow.App/App.xaml.cs`](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/App.xaml.cs) (App startup), [`src/Lyrow.App/MainWindow.xaml.cs`](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/MainWindow.xaml.cs) (Player window), [`src/Lyrow.Core/Modules/GlowModule.cs`](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Modules/GlowModule.cs) (Glow module), [`src/Lyrow.Core/Modules/LyricsModule.cs`](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Modules/LyricsModule.cs) (Lyrics module)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Desktop experience"]
  node_app_entry["App startup<br/>[App.xaml.cs]"]
  node_main_ui["Player window<br/>[MainWindow.xaml.cs]"]
  node_lyrics_ui["Lyrics window"]
  node_tray["Tray controls"]
  node_artwork_ui["Artwork display"]
  node_window_platform["Window platform"]
  node_overlay_manager["Glow overlay"]
  node_overlay_window["Overlay window"]
end

subgraph group_music["Media and lyrics"]
  node_session["GSMTC session"]
  node_metadata["Metadata normalizer"]
  node_lyrics_module["Lyrics module<br/>[LyricsModule.cs]"]
  node_lyrics_client["LRCLIB client<br/>[LrclibClient.cs]"]
  node_lrc_parser["LRC parser<br/>[LrcParser.cs]"]
  node_lyrics_cache["Lyrics cache"]
end

subgraph group_glow["Ambient audio glow"]
  node_glow_module["Glow module<br/>[GlowModule.cs]"]
  node_capture["WASAPI capture"]
  node_analyzer["Spectrum analysis"]
  node_beat_engine["Beat analysis<br/>[GlowBeatEngine.cs]"]
  node_audio_routing["Output routing"]
  node_audio_volume["Volume control"]
end

subgraph group_core["Shared core services"]
  node_timeline["Playback timeline"]
  node_artwork_service["Artwork service<br/>[ArtworkService.cs]"]
  node_settings[("Settings manager<br/>[SettingsManager.cs]")]
  node_module_manager["Module manager<br/>[ModuleManager.cs]"]
  node_updates["Update service"]
end

node_user(("Listener"))
node_lrclib["LRCLIB<br/>external service"]

node_user -->|"launches"| node_app_entry
node_app_entry -->|"creates"| node_main_ui
node_app_entry -->|"configures"| node_module_manager
node_app_entry -->|"registers"| node_glow_module
node_app_entry -->|"registers"| node_lyrics_module
node_app_entry -->|"initializes"| node_tray
node_main_ui -.->|"presents"| node_lyrics_ui
node_session -->|"normalizes"| node_metadata
node_session -->|"updates"| node_timeline
node_session -.->|"provides media"| node_lyrics_module
node_lyrics_module -.->|"requests lyrics"| node_lyrics_client
node_lyrics_client -->|"parses"| node_lrc_parser
node_lyrics_module -.->|"uses cache"| node_lyrics_cache
node_lyrics_client -->|"queries"| node_lrclib
node_lyrics_ui -.->|"shows timing"| node_timeline
node_main_ui -.->|"renders artwork"| node_artwork_ui
node_artwork_ui -->|"loads artwork"| node_artwork_service
node_app_entry -->|"registers"| node_settings
node_glow_module -.->|"captures audio"| node_capture
node_glow_module -.->|"analyzes spectrum"| node_analyzer
node_glow_module -.->|"drives glow"| node_overlay_manager
node_overlay_manager -->|"manages"| node_overlay_window
node_glow_module -.->|"analyzes beats"| node_beat_engine
node_main_ui -.->|"selects output"| node_audio_routing
node_main_ui -.->|"controls volume"| node_audio_volume
node_app_entry -->|"registers"| node_updates

click node_app_entry "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/App.xaml.cs"
click node_main_ui "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/MainWindow.xaml.cs"
click node_lyrics_ui "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/LyricsWindow.xaml.cs"
click node_tray "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/Platform/LyrowTrayIconManager.cs"
click node_artwork_ui "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/Platform/ArtworkBitmapManager.cs"
click node_window_platform "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/Platform/WindowsWindowPlatformAdapter.cs"
click node_session "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Music/Session/WindowsGsmtcMediaSessionMonitor.cs"
click node_metadata "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Music/Metadata/MediaMetadataNormalizer.cs"
click node_lyrics_module "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Modules/LyricsModule.cs"
click node_lyrics_client "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Music/Lyrics/LrclibClient.cs"
click node_lrc_parser "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Music/Lyrics/LrcParser.cs"
click node_lyrics_cache "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Music/Lyrics/LocalFileLyricsCache.cs"
click node_timeline "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Timeline/PlaybackTimelineEngine.cs"
click node_artwork_service "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Services/ArtworkService.cs"
click node_settings "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Services/SettingsManager.cs"
click node_module_manager "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Services/ModuleManager.cs"
click node_glow_module "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Modules/GlowModule.cs"
click node_capture "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Audio/Capture/WasapiAudioCaptureService.cs"
click node_analyzer "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Audio/Analysis/SpectrumAnalyzer.cs"
click node_beat_engine "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Audio/Analysis/GlowBeatEngine.cs"
click node_overlay_manager "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/Platform/GlowOverlayManager.cs"
click node_overlay_window "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/Platform/GlowOverlayWindow.cs"
click node_audio_routing "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Audio/Routing/WindowsAudioRoutingService.cs"
click node_audio_volume "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Audio/Control/WindowsAudioVolumeService.cs"
click node_updates "https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Services/GitHubUpdateService.cs"

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_app_entry,node_main_ui,node_lyrics_ui,node_tray,node_artwork_ui,node_window_platform,node_overlay_manager,node_overlay_window toneBlue
class node_session,node_metadata,node_lyrics_module,node_lyrics_client,node_lrc_parser,node_lyrics_cache toneAmber
class node_glow_module,node_capture,node_analyzer,node_beat_engine,node_audio_routing,node_audio_volume toneMint
class node_timeline,node_artwork_service,node_settings,node_module_manager,node_updates toneRose
class node_user,node_lrclib toneIndigo
```

## Components

### Desktop experience

- [App startup](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/App.xaml.cs): `src/Lyrow.App/App.xaml.cs`
- [Player window](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/MainWindow.xaml.cs): `src/Lyrow.App/MainWindow.xaml.cs`
- [Lyrics window](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/LyricsWindow.xaml.cs): `src/Lyrow.App/LyricsWindow.xaml.cs`
- [Tray controls](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/Platform/LyrowTrayIconManager.cs): `src/Lyrow.App/Platform/LyrowTrayIconManager.cs`
- [Artwork display](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/Platform/ArtworkBitmapManager.cs): `src/Lyrow.App/Platform/ArtworkBitmapManager.cs`
- [Window platform](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/Platform/WindowsWindowPlatformAdapter.cs): `src/Lyrow.App/Platform/WindowsWindowPlatformAdapter.cs`
- [Glow overlay](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/Platform/GlowOverlayManager.cs): `src/Lyrow.App/Platform/GlowOverlayManager.cs`
- [Overlay window](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.App/Platform/GlowOverlayWindow.cs): `src/Lyrow.App/Platform/GlowOverlayWindow.cs`

### Media and lyrics

- [GSMTC session](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Music/Session/WindowsGsmtcMediaSessionMonitor.cs): `src/Lyrow.Music/Session/WindowsGsmtcMediaSessionMonitor.cs`
- [Metadata normalizer](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Music/Metadata/MediaMetadataNormalizer.cs): `src/Lyrow.Music/Metadata/MediaMetadataNormalizer.cs`
- [Lyrics module](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Modules/LyricsModule.cs): `src/Lyrow.Core/Modules/LyricsModule.cs`
- [LRCLIB client](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Music/Lyrics/LrclibClient.cs): `src/Lyrow.Music/Lyrics/LrclibClient.cs`
- [LRC parser](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Music/Lyrics/LrcParser.cs): `src/Lyrow.Music/Lyrics/LrcParser.cs`
- [Lyrics cache](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Music/Lyrics/LocalFileLyricsCache.cs): `src/Lyrow.Music/Lyrics/LocalFileLyricsCache.cs`

### Ambient audio glow

- [Glow module](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Modules/GlowModule.cs): `src/Lyrow.Core/Modules/GlowModule.cs`
- [WASAPI capture](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Audio/Capture/WasapiAudioCaptureService.cs): `src/Lyrow.Audio/Capture/WasapiAudioCaptureService.cs`
- [Spectrum analysis](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Audio/Analysis/SpectrumAnalyzer.cs): `src/Lyrow.Audio/Analysis/SpectrumAnalyzer.cs`
- [Beat analysis](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Audio/Analysis/GlowBeatEngine.cs): `src/Lyrow.Audio/Analysis/GlowBeatEngine.cs`
- [Output routing](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Audio/Routing/WindowsAudioRoutingService.cs): `src/Lyrow.Audio/Routing/WindowsAudioRoutingService.cs`
- [Volume control](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Audio/Control/WindowsAudioVolumeService.cs): `src/Lyrow.Audio/Control/WindowsAudioVolumeService.cs`

### Shared core services

- [Playback timeline](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Timeline/PlaybackTimelineEngine.cs): `src/Lyrow.Core/Timeline/PlaybackTimelineEngine.cs`
- [Artwork service](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Services/ArtworkService.cs): `src/Lyrow.Core/Services/ArtworkService.cs`
- [Settings manager](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Services/SettingsManager.cs): `src/Lyrow.Core/Services/SettingsManager.cs`
- [Module manager](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Services/ModuleManager.cs): `src/Lyrow.Core/Services/ModuleManager.cs`
- [Update service](https://github.com/owergungor/lyrow/blob/main/src/Lyrow.Core/Services/GitHubUpdateService.cs): `src/Lyrow.Core/Services/GitHubUpdateService.cs`

### Other components

- **Listener**
- **LRCLIB**: external service

## Connections

- Listener → App startup: launches (evidence: `README.md`)
- App startup → Player window: creates (evidence: `src/Lyrow.App/App.xaml.cs`)
- App startup → Module manager: configures (evidence: `src/Lyrow.App/App.xaml.cs`)
- App startup → Glow module: registers (evidence: `src/Lyrow.App/App.xaml.cs`)
- App startup → Lyrics module: registers (evidence: `src/Lyrow.App/App.xaml.cs`)
- App startup → Tray controls: initializes (evidence: `src/Lyrow.App/App.xaml.cs`)
- Player window → Lyrics window: presents
- GSMTC session → Metadata normalizer: normalizes (evidence: `src/Lyrow.Music/Session/WindowsGsmtcMediaSessionMonitor.cs`)
- GSMTC session → Playback timeline: updates (evidence: `src/Lyrow.Music/Session/WindowsGsmtcMediaSessionMonitor.cs`)
- GSMTC session → Lyrics module: provides media
- Lyrics module → LRCLIB client: requests lyrics
- LRCLIB client → LRC parser: parses (evidence: `src/Lyrow.Music/Lyrics/LrclibClient.cs`)
- Lyrics module → Lyrics cache: uses cache
- LRCLIB client → LRCLIB: queries (evidence: `src/Lyrow.Music/Lyrics/LrclibClient.cs`)
- Lyrics window → Playback timeline: shows timing
- Player window → Artwork display: renders artwork
- Artwork display → Artwork service: loads artwork (evidence: `src/Lyrow.App/Platform/ArtworkBitmapManager.cs`)
- App startup → Settings manager: registers (evidence: `src/Lyrow.App/App.xaml.cs`)
- Glow module → WASAPI capture: captures audio
- Glow module → Spectrum analysis: analyzes spectrum
- Glow module → Glow overlay: drives glow (evidence: `src/Lyrow.App/Platform/GlowOverlayManager.cs`)
- Glow overlay → Overlay window: manages (evidence: `src/Lyrow.App/Platform/GlowOverlayManager.cs`)
- Glow module → Beat analysis: analyzes beats
- Player window → Output routing: selects output
- Player window → Volume control: controls volume
- App startup → Update service: registers (evidence: `src/Lyrow.App/App.xaml.cs`)
