# dhananjayanrajan/atmostream architecture

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

- Interactive diagram: https://gitdiagram.com/dhananjayanrajan/atmostream
- Repository: https://github.com/dhananjayanrajan/atmostream

## Overview

1. Atmostream is a dual-edition desktop audio player. The repository contains a native C++/GTK application as the main product and a Bash-based “Lite” edition that reuses the same configuration and state concepts but drives external tools from shell scripts.

2. The C++ edition is organized around a controller-centric architecture. `main.cpp` starts GTK, sets process/runtime defaults, and hands control to `ApplicationController`, which owns startup, wiring, lifecycle, and periodic UI refreshes.

3. The C++ codebase uses dependency inversion heavily. `src/interfaces/` defines the contracts, `src/core/` provides concrete services, `src/features/` contains self-contained feature modules, `src/ui/` provides reusable windows/dialogs, and `src/platform/` contains OS-specific integration. Feature code depends on interfaces, not concrete implementations.

4. The central runtime data path is audio playback. `AudioEngine` wraps three mpv-backed streams: narration/main, ambience, and noise. `PipeWireManager` builds the downstream audio graph, including low-pass filtering, sidechain compression, and optional noise generation, then routes everything to the system sink.

5. The application’s audio behavior is intentionally layered. The main track carries speech, ambience ducks under narration through PipeWire sidechain control, and the noise layer is filtered to stay unobtrusive. Volume hierarchy is enforced in the controller/service layer so noise never exceeds ambience, and ambience never exceeds main.

6. Persistent state is isolated in `StateManager` and stored as JSON under the user data directory. It handles resume data, bookmarks/markers, favorites, presets, settings, and statistics. Writes are atomic, and older bookmark formats are migrated on read.

7. Configuration is separate from state and is loaded by `ConfigLoader`. The app merges plain-text config files from local, system, and user locations, then uses them for channel maps, source pools, defaults, thresholds, and fallback URLs.

8. Source acquisition is its own subsystem. `SourcesManager` and the Librivox browser deal with YouTube-facing selection and validation, while `LauncherDialog` provides the GTK UI for browsing channels and videos. The C++ edition fetches playable URLs and metadata via `yt-dlp`-style flows rather than embedding a browser.

9. UI is split into tray, mini player, launch dialogs, and feature panels. `TrayManager` is the primary shell, `MiniPlayer` is a floating overlay, `VolumePanel` exposes mixer controls and safe-listening limits, and the various feature panels are standalone dialogs that can be shown or hidden from the tray menu.

10. Platform integration is explicit and separate from business logic. `mpris2.cpp` exposes the app on the desktop session bus for media controls, `hotkeys.cpp` captures global X11 media keys, and `safe_listening.h` models device detection and conservative output-volume limits.

11. Feature modules are mostly independent vertical slices under `src/features/`. Each folder bundles its own logic and panel for a specific capability such as binaural beats, cinematic DSP presets, voice profiles, timers, favorites, stats, quick EQ, bookmarks, drift detection, auto-ambience, noise generation, and source browsing.

12. The Bash Lite edition mirrors the same domain concepts with a simpler execution model. `bash/bin/atmostream-lite` sources modular scripts for core lifecycle, audio setup, UI rendering, input handling, state save, source selection, MPRIS-style command forwarding, and cleanup. It runs external `mpv` processes, manages PipeWire links from shell, and falls back from TUI to a single-line status display when terminal capabilities are limited.

13. The main architectural boundary between editions is control plane versus audio plane. In C++, the control plane is in-process and GUI-driven; in Bash, it is script-driven and terminal-driven. In both cases, the audio plane is still built around mpv plus PipeWire plus Calf LV2 plugins, so the user-visible feature set stays aligned.

14. `tests/` contains focused checks for core services and panel construction, which reinforces the repo’s modular design: service contracts can be validated independently from the UI shell, and panels can be instantiated without relying on the whole application.

Main entry points: [`src/controller/feature_coordinator.cpp`](https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/feature_coordinator.cpp) (Feature Coord), [`src/application_controller.cpp`](https://github.com/dhananjayanrajan/atmostream/blob/main/src/application_controller.cpp) (App Controller), [`src/ui/ui_context.cpp`](https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/ui_context.cpp) (UI Context), [`src/controller/app_startup.cpp`](https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/app_startup.cpp) (Startup)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_grp_cpp["C++ Edition"]
  node_n_main["main<br/>gtk entrypoint<br/>[main.cpp]"]
  node_n_appctl["App Controller<br/>runtime coordinator"]
  node_n_startup["Startup<br/>boot wiring<br/>[app_startup.cpp]"]
  node_n_audioctl["Audio Control<br/>playback orchestrator"]
  node_n_featurecoord["Feature Coord<br/>feature router"]
  node_n_panelmgr["Panel Manager<br/>ui shell manager<br/>[panel_manager.cpp]"]
  node_n_session["Session Manager<br/>session state"]
  node_n_timerctl["Timer Ctrl<br/>timer orchestration"]
  node_n_trayctl["Tray Ctrl<br/>shell bridge"]
  node_n_audioeng["Audio Engine<br/>mpv mixer<br/>[audio_engine.cpp]"]
  node_n_pipewire["PipeWire<br/>audio graph<br/>[pipewire.cpp]"]
  node_n_config["Config Loader<br/>config merge<br/>[config_loader.cpp]"]
  node_n_state[("State Manager<br/>persistent state<br/>[state_manager.cpp]")]
  node_n_sources["Sources<br/>source acquisition<br/>[sources.cpp]"]
  node_n_ui["UI Context<br/>ui composition<br/>[ui_context.cpp]"]
  node_n_tray["Tray<br/>desktop shell<br/>[tray_manager.cpp]"]
  node_n_miniplayer["Mini Player<br/>overlay window<br/>[mini_player.cpp]"]
  node_n_volume["Volume Panel<br/>mixer panel<br/>[volume_panel.cpp]"]
  node_n_launcher["Launcher<br/>source browser"]
  node_n_platform["Platform<br/>desktop integration<br/>[mpris2.cpp]"]
  node_n_binaural["Binaural<br/>feature module"]
  node_n_cinematic["Cinematic<br/>feature module"]
  node_n_voice["Voice Profile<br/>feature module"]
  node_n_bookmarks["Bookmarks<br/>feature module<br/>[playback_panel.cpp]"]
  node_n_favorites["Favorites<br/>feature module"]
  node_n_stats["Stats<br/>feature module"]
  node_n_quickeq["Quick EQ<br/>feature module<br/>[quick_eq.cpp]"]
  node_n_timers["Timers<br/>feature module<br/>[pomodoro_timer.cpp]"]
  node_n_drift["Drift Detect<br/>feature module<br/>[drift_detector.cpp]"]
  node_n_noise["Noise Gen<br/>feature module"]
  node_n_autoamb["Auto Ambience<br/>feature module"]
  node_n_librivox["Librivox Browser<br/>source feature"]
end

subgraph group_grp_bash["Lite Edition"]
  node_n_bash_entry["lite entry<br/>shell entrypoint"]
  node_n_bash_core["core.sh<br/>shell lifecycle<br/>[core.sh]"]
end

node_n_main -->|"starts"| node_n_appctl
node_n_appctl -->|"bootstraps"| node_n_startup
node_n_appctl -->|"coordinates"| node_n_audioctl
node_n_appctl -->|"enables"| node_n_featurecoord
node_n_appctl -->|"manages"| node_n_panelmgr
node_n_appctl -->|"tracks"| node_n_session
node_n_appctl -->|"drives"| node_n_timerctl
node_n_appctl -->|"exposes"| node_n_trayctl
node_n_startup -->|"loads"| node_n_config
node_n_startup -->|"restores"| node_n_state
node_n_audioctl -->|"uses"| node_n_audioeng
node_n_audioeng -->|"routes"| node_n_pipewire
node_n_audioctl -->|"limits"| node_n_platform
node_n_featurecoord -->|"loads"| node_n_binaural
node_n_featurecoord -->|"loads"| node_n_cinematic
node_n_featurecoord -->|"loads"| node_n_voice
node_n_featurecoord -->|"loads"| node_n_bookmarks
node_n_featurecoord -->|"loads"| node_n_favorites
node_n_featurecoord -->|"loads"| node_n_stats
node_n_featurecoord -->|"loads"| node_n_quickeq
node_n_featurecoord -->|"loads"| node_n_timers
node_n_featurecoord -->|"loads"| node_n_drift
node_n_featurecoord -->|"loads"| node_n_noise
node_n_featurecoord -->|"loads"| node_n_autoamb
node_n_panelmgr -->|"composes"| node_n_ui
node_n_ui -->|"hosts"| node_n_tray
node_n_ui -->|"hosts"| node_n_miniplayer
node_n_ui -->|"hosts"| node_n_volume
node_n_ui -->|"hosts"| node_n_launcher
node_n_launcher -->|"queries"| node_n_sources
node_n_sources -->|"browses"| node_n_librivox
node_n_state -.->|"separates"| node_n_config
node_n_trayctl -->|"drives"| node_n_tray
node_n_platform -.->|"integrates"| node_n_trayctl
node_n_bash_entry -->|"sources"| node_n_bash_core

click node_n_main "https://github.com/dhananjayanrajan/atmostream/blob/main/src/main.cpp"
click node_n_appctl "https://github.com/dhananjayanrajan/atmostream/blob/main/src/application_controller.cpp"
click node_n_startup "https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/app_startup.cpp"
click node_n_audioctl "https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/audio_controller.cpp"
click node_n_featurecoord "https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/feature_coordinator.cpp"
click node_n_panelmgr "https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/panel_manager.cpp"
click node_n_session "https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/session_manager.cpp"
click node_n_timerctl "https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/timer_controller.cpp"
click node_n_trayctl "https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/tray_controller.cpp"
click node_n_audioeng "https://github.com/dhananjayanrajan/atmostream/blob/main/src/core/audio/audio_engine.cpp"
click node_n_pipewire "https://github.com/dhananjayanrajan/atmostream/blob/main/src/core/audio/pipewire.cpp"
click node_n_config "https://github.com/dhananjayanrajan/atmostream/blob/main/src/core/config/config_loader.cpp"
click node_n_state "https://github.com/dhananjayanrajan/atmostream/blob/main/src/core/state/state_manager.cpp"
click node_n_sources "https://github.com/dhananjayanrajan/atmostream/blob/main/src/core/sources/sources.cpp"
click node_n_ui "https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/ui_context.cpp"
click node_n_tray "https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/tray/tray_manager.cpp"
click node_n_miniplayer "https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/mini_player/mini_player.cpp"
click node_n_volume "https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/volume_panel/volume_panel.cpp"
click node_n_launcher "https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/launcher_dialog/launcher_dialog.cpp"
click node_n_platform "https://github.com/dhananjayanrajan/atmostream/blob/main/src/platform/mpris2.cpp"
click node_n_binaural "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/binaural/binaural_generator.cpp"
click node_n_cinematic "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/cinematic/cinematic_panel.cpp"
click node_n_voice "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/voice_profile/voice_profile_panel.cpp"
click node_n_bookmarks "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/bookmarks/playback_panel.cpp"
click node_n_favorites "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/favorites/favorites_manager.cpp"
click node_n_stats "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/stats/stats_collector.cpp"
click node_n_quickeq "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/quick_eq/quick_eq.cpp"
click node_n_timers "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/timers/pomodoro_timer.cpp"
click node_n_drift "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/drift_detection/drift_detector.cpp"
click node_n_noise "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/noise_generator/noise_generator_panel.cpp"
click node_n_autoamb "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/auto_ambience/time_of_day_ambience.cpp"
click node_n_librivox "https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/sources/librivox_browser.cpp"
click node_n_bash_entry "https://github.com/dhananjayanrajan/atmostream/tree/main/bash/bin/atmostream-lite"
click node_n_bash_core "https://github.com/dhananjayanrajan/atmostream/blob/main/bash/lib/core.sh"

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_n_main,node_n_appctl,node_n_startup,node_n_audioctl,node_n_featurecoord,node_n_panelmgr,node_n_session,node_n_timerctl,node_n_trayctl,node_n_audioeng,node_n_pipewire,node_n_config,node_n_state,node_n_sources,node_n_ui,node_n_tray,node_n_miniplayer,node_n_volume,node_n_launcher,node_n_platform,node_n_binaural,node_n_cinematic,node_n_voice,node_n_bookmarks,node_n_favorites,node_n_stats,node_n_quickeq,node_n_timers,node_n_drift,node_n_noise,node_n_autoamb,node_n_librivox toneBlue
class node_n_bash_entry,node_n_bash_core toneAmber
```

## Components

### C++ Edition

Native GTK desktop application and its layered subsystems.

- [main](https://github.com/dhananjayanrajan/atmostream/blob/main/src/main.cpp): gtk entrypoint · Starts GTK, sets runtime defaults, and enters the controller-driven app. · `src/main.cpp`
- [App Controller](https://github.com/dhananjayanrajan/atmostream/blob/main/src/application_controller.cpp): runtime coordinator · Owns startup, wiring, lifecycle, and periodic refresh for the native app. · `src/application_controller.cpp`
- [Startup](https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/app_startup.cpp): boot wiring · Builds the initial application services and connects the runtime pieces. · `src/controller/app_startup.cpp`
- [Audio Control](https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/audio_controller.cpp): playback orchestrator · Enforces playback layering and volume hierarchy across the audio stack. · `src/controller/audio_controller.cpp`
- [Feature Coord](https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/feature_coordinator.cpp): feature router · Coordinates feature modules and their activation within the app. · `src/controller/feature_coordinator.cpp`
- [Panel Manager](https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/panel_manager.cpp): ui shell manager · Opens, hides, and tracks feature panels and dialogs. · `src/controller/panel_manager.cpp`
- [Session Manager](https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/session_manager.cpp): session state · Tracks active session flow and restores runtime context. · `src/controller/session_manager.cpp`
- [Timer Ctrl](https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/timer_controller.cpp): timer orchestration · Coordinates pomodoro and sleep-timer behavior. · `src/controller/timer_controller.cpp`
- [Tray Ctrl](https://github.com/dhananjayanrajan/atmostream/blob/main/src/controller/tray_controller.cpp): shell bridge · Drives the tray shell and user-visible app commands. · `src/controller/tray_controller.cpp`
- [Audio Engine](https://github.com/dhananjayanrajan/atmostream/blob/main/src/core/audio/audio_engine.cpp): mpv mixer · Wraps the narration, ambience, and noise streams backed by mpv. · `src/core/audio/audio_engine.cpp`
- [PipeWire](https://github.com/dhananjayanrajan/atmostream/blob/main/src/core/audio/pipewire.cpp): audio graph · Builds downstream filtering, sidechain compression, and system sink routing. · `src/core/audio/pipewire.cpp`
- [Config Loader](https://github.com/dhananjayanrajan/atmostream/blob/main/src/core/config/config_loader.cpp): config merge · Merges local, system, and user config files into runtime defaults. · `src/core/config/config_loader.cpp`
- [State Manager](https://github.com/dhananjayanrajan/atmostream/blob/main/src/core/state/state_manager.cpp): persistent state · Stores JSON state for resume data, bookmarks, favorites, presets, settings, and stats. · `src/core/state/state_manager.cpp`
- [Sources](https://github.com/dhananjayanrajan/atmostream/blob/main/src/core/sources/sources.cpp): source acquisition · Resolves playable source URLs and metadata through provider flows. · `src/core/sources/sources.cpp`
- [UI Context](https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/ui_context.cpp): ui composition · Provides shared UI wiring and context for windows and panels. · `src/ui/ui_context.cpp`
- [Tray](https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/tray/tray_manager.cpp): desktop shell · Primary tray window and menu entry point for the native edition. · `src/ui/tray/tray_manager.cpp`
- [Mini Player](https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/mini_player/mini_player.cpp): overlay window · Floating compact player for quick playback control. · `src/ui/mini_player/mini_player.cpp`
- [Volume Panel](https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/volume_panel/volume_panel.cpp): mixer panel · Exposes mixer controls and safe-listening limits. · `src/ui/volume_panel/volume_panel.cpp`
- [Launcher](https://github.com/dhananjayanrajan/atmostream/blob/main/src/ui/launcher_dialog/launcher_dialog.cpp): source browser · GTK dialog for browsing channels and videos before playback. · `src/ui/launcher_dialog/launcher_dialog.cpp`
- [Platform](https://github.com/dhananjayanrajan/atmostream/blob/main/src/platform/mpris2.cpp): desktop integration · Implements session-bus media control, global hotkeys, and conservative output limits. · `src/platform/mpris2.cpp`
- [Binaural](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/binaural/binaural_generator.cpp): feature module · Generates binaural beats and its panel. · `src/features/binaural/binaural_generator.cpp`
- [Cinematic](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/cinematic/cinematic_panel.cpp): feature module · Encapsulates cinematic DSP presets and controls. · `src/features/cinematic/cinematic_panel.cpp`
- [Voice Profile](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/voice_profile/voice_profile_panel.cpp): feature module · Models voice-profile behavior and panel controls. · `src/features/voice_profile/voice_profile_panel.cpp`
- [Bookmarks](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/bookmarks/playback_panel.cpp): feature module · Manages chapters and playback bookmarks. · `src/features/bookmarks/playback_panel.cpp`
- [Favorites](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/favorites/favorites_manager.cpp): feature module · Tracks saved favorites and related panel UI. · `src/features/favorites/favorites_manager.cpp`
- [Stats](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/stats/stats_collector.cpp): feature module · Collects usage statistics and displays the stats panel. · `src/features/stats/stats_collector.cpp`
- [Quick EQ](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/quick_eq/quick_eq.cpp): feature module · Provides fast equalizer controls and presets. · `src/features/quick_eq/quick_eq.cpp`
- [Timers](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/timers/pomodoro_timer.cpp): feature module · Bundles pomodoro and sleep timer implementations. · `src/features/timers/pomodoro_timer.cpp`
- [Drift Detect](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/drift_detection/drift_detector.cpp): feature module · Detects playback drift and related anomalies. · `src/features/drift_detection/drift_detector.cpp`
- [Noise Gen](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/noise_generator/noise_generator_panel.cpp): feature module · Generates unobtrusive background noise and its panel. · `src/features/noise_generator/noise_generator_panel.cpp`
- [Auto Ambience](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/auto_ambience/time_of_day_ambience.cpp): feature module · Adjusts ambience from time-of-day context. · `src/features/auto_ambience/time_of_day_ambience.cpp`
- [Librivox Browser](https://github.com/dhananjayanrajan/atmostream/blob/main/src/features/sources/librivox_browser.cpp): source feature · Binds source browsing and validation to the launcher flow. · `src/features/sources/librivox_browser.cpp`

### Lite Edition

Shell-driven edition that reuses the same audio/state concepts.

- [lite entry](https://github.com/dhananjayanrajan/atmostream/tree/main/bash/bin/atmostream-lite): shell entrypoint · Sources modular shell libraries and starts the Lite runtime. · `bash/bin/atmostream-lite`
- [core.sh](https://github.com/dhananjayanrajan/atmostream/blob/main/bash/lib/core.sh): shell lifecycle · Lite runtime lifecycle and shared shell coordination. · `bash/lib/core.sh`

## Connections

- main → App Controller: starts · Main hands control to the application controller.
- App Controller → Startup: bootstraps · Controller delegates service wiring and startup.
- App Controller → Audio Control: coordinates · Keeps playback and volume rules consistent.
- App Controller → Feature Coord: enables · Activates feature modules.
- App Controller → Panel Manager: manages · Opens and closes feature panels.
- App Controller → Session Manager: tracks · Maintains runtime session state.
- App Controller → Timer Ctrl: drives · Routes timer behavior through the controller.
- App Controller → Tray Ctrl: exposes · Connects the app to tray actions.
- Startup → Config Loader: loads · Startup reads merged configuration.
- Startup → State Manager: restores · Startup hydrates persisted state.
- Audio Control → Audio Engine: uses · Controller commands the audio engine.
- Audio Engine → PipeWire: routes · Audio engine feeds PipeWire graph construction.
- Audio Control → Platform: limits · Applies safe-listening and device constraints.
- Feature Coord → Binaural: loads · Coordinates feature modules.
- Feature Coord → Cinematic: loads · Coordinates feature modules.
- Feature Coord → Voice Profile: loads · Coordinates feature modules.
- Feature Coord → Bookmarks: loads · Coordinates feature modules.
- Feature Coord → Favorites: loads · Coordinates feature modules.
- Feature Coord → Stats: loads · Coordinates feature modules.
- Feature Coord → Quick EQ: loads · Coordinates feature modules.
- Feature Coord → Timers: loads · Coordinates feature modules.
- Feature Coord → Drift Detect: loads · Coordinates feature modules.
- Feature Coord → Noise Gen: loads · Coordinates feature modules.
- Feature Coord → Auto Ambience: loads · Coordinates feature modules.
- Panel Manager → UI Context: composes · Panel manager builds UI surfaces in the shared context.
- UI Context → Tray: hosts · Shared UI context includes the tray shell.
- UI Context → Mini Player: hosts · Shared UI context includes the mini player.
- UI Context → Volume Panel: hosts · Shared UI context includes the volume panel.
- UI Context → Launcher: hosts · Shared UI context includes the source launcher.
- Launcher → Sources: queries · Launcher feeds source discovery and validation.
- Sources → Librivox Browser: browses · Source acquisition includes Librivox-facing browsing.
- State Manager → Config Loader: separates · Persistent state is distinct from loaded configuration.
- Tray Ctrl → Tray: drives · Tray controller manipulates the tray shell.
- Platform → Tray Ctrl: integrates · Desktop integration supports controller commands and shortcuts.
- lite entry → core.sh: sources · Lite entrypoint assembles runtime from shell modules.
