# bsoto-fc/voyager architecture

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

- Interactive diagram: https://gitdiagram.com/bsoto-fc/voyager
- Repository: https://github.com/bsoto-fc/voyager

## Overview

Voyager is a desktop MP3-file manager. The main workflow lets a user choose a music directory, scans audio tags and artwork, stores library metadata, then browses and searches the catalog, edits details, and plays a selected track. The graph preserves the documented library, search, metadata, artwork, and playback areas. Relationships are limited to calls or data flow visible in supplied excerpts and the SOURCE INDEX; several UI capabilities are represented by their source files, but unsampled behavior is not assumed.

Main entry points: [`app/src/main/kotlin/mx/unam/ciencias/myp/ui/MainScreen.kt`](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/MainScreen.kt) (Main screen), [`app/src/main/kotlin/mx/unam/ciencias/myp/db/DatabaseDriver.kt`](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/db/DatabaseDriver.kt) (SQLite catalog), [`app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumCoversColumn.kt`](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumCoversColumn.kt) (Album covers), [`app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/SongInfoColumn.kt`](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/SongInfoColumn.kt) (Song details)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Desktop app"]
  node_entry["App entry<br/>[App.kt]"]
  node_screen["Main screen<br/>[MainScreen.kt]"]
end

subgraph group_ingest["Library ingest"]
  node_miner["Audio scanner<br/>[Miner.kt]"]
  node_metadata["Song metadata<br/>[SongMetadata.kt]"]
end

subgraph group_catalog["Catalog data"]
  node_database[("SQLite catalog<br/>[DatabaseDriver.kt]")]
  node_dbmodels["Catalog records<br/>[DbDataClasses.kt]"]
end

subgraph group_browse["Browse and edit"]
  node_library["Library browser"]
  node_search["Advanced search"]
  node_navigation["Navigation"]
  node_covers["Album covers"]
  node_songinfo["Song details<br/>[SongInfoColumn.kt]"]
  node_albuminfo["Album details<br/>[AlbumInfoColumn.kt]"]
  node_performer["Performer editor"]
end

subgraph group_playback["Playback"]
  node_audio["Audio player UI<br/>[AudioPlayer.kt]"]
  node_playerlib["Gadulka player"]
end

node_user(("User"))

node_user -->|"launches"| node_entry
node_entry -.->|"opens"| node_screen
node_screen -->|"starts scan"| node_miner
node_miner -->|"creates"| node_metadata
node_screen -->|"initializes"| node_database
node_screen -->|"receives"| node_metadata
node_database -->|"uses"| node_metadata
node_library -->|"queries"| node_database
node_search -->|"queries"| node_database
node_screen -.->|"renders"| node_library
node_screen -->|"renders"| node_navigation
node_screen -.->|"renders"| node_songinfo
node_screen -.->|"renders"| node_albuminfo
node_screen -.->|"renders"| node_covers
node_covers -->|"loads albums"| node_database
node_songinfo -->|"reads and updates"| node_database
node_albuminfo -->|"updates album"| node_database
node_albuminfo -->|"opens editor"| node_performer
node_songinfo -->|"opens editor"| node_performer
node_performer -->|"updates performer"| node_database
node_navigation -->|"shows player"| node_audio
node_covers -->|"renders player"| node_audio
node_audio -.->|"controls playback"| node_playerlib

click node_entry "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/App.kt"
click node_screen "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/MainScreen.kt"
click node_miner "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/miner/Miner.kt"
click node_metadata "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/miner/SongMetadata.kt"
click node_database "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/db/DatabaseDriver.kt"
click node_dbmodels "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/db/DbDataClasses.kt"
click node_library "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AudioLibraryColumn.kt"
click node_search "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AdvancedSearchDialog.kt"
click node_navigation "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/NavigationColumn.kt"
click node_covers "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumCoversColumn.kt"
click node_songinfo "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/SongInfoColumn.kt"
click node_albuminfo "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumInfoColumn.kt"
click node_performer "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/EditPerformerDialog.kt"
click node_audio "https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/audio/AudioPlayer.kt"

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_entry,node_screen,node_user toneBlue
class node_miner,node_metadata toneAmber
class node_database,node_dbmodels toneMint
class node_library,node_search,node_navigation,node_covers,node_songinfo,node_albuminfo,node_performer toneRose
class node_audio,node_playerlib toneIndigo
```

## Components

### Desktop app

- [App entry](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/App.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/App.kt`
- [Main screen](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/MainScreen.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/ui/MainScreen.kt`

### Library ingest

- [Audio scanner](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/miner/Miner.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/miner/Miner.kt`
- [Song metadata](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/miner/SongMetadata.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/miner/SongMetadata.kt`

### Catalog data

- [SQLite catalog](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/db/DatabaseDriver.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/db/DatabaseDriver.kt`
- [Catalog records](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/db/DbDataClasses.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/db/DbDataClasses.kt`

### Browse and edit

- [Library browser](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AudioLibraryColumn.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AudioLibraryColumn.kt`
- [Advanced search](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AdvancedSearchDialog.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AdvancedSearchDialog.kt`
- [Navigation](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/NavigationColumn.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/NavigationColumn.kt`
- [Album covers](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumCoversColumn.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumCoversColumn.kt`
- [Song details](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/SongInfoColumn.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/SongInfoColumn.kt`
- [Album details](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumInfoColumn.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumInfoColumn.kt`
- [Performer editor](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/EditPerformerDialog.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/EditPerformerDialog.kt`

### Playback

- [Audio player UI](https://github.com/bsoto-fc/voyager/blob/main/app/src/main/kotlin/mx/unam/ciencias/myp/ui/audio/AudioPlayer.kt): `app/src/main/kotlin/mx/unam/ciencias/myp/ui/audio/AudioPlayer.kt`
- **Gadulka player**

### Other components

- **User**

## Connections

- User → App entry: launches (evidence: `README.md`)
- App entry → Main screen: opens
- Main screen → Audio scanner: starts scan (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/MainScreen.kt`)
- Audio scanner → Song metadata: creates (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/miner/Miner.kt`)
- Main screen → SQLite catalog: initializes (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/MainScreen.kt`)
- Main screen → Song metadata: receives (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/MainScreen.kt`)
- SQLite catalog → Song metadata: uses (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/db/DatabaseDriver.kt`)
- Library browser → SQLite catalog: queries (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AudioLibraryColumn.kt`)
- Advanced search → SQLite catalog: queries (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AdvancedSearchDialog.kt`)
- Main screen → Library browser: renders
- Main screen → Navigation: renders (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/MainScreen.kt`)
- Main screen → Song details: renders
- Main screen → Album details: renders
- Main screen → Album covers: renders
- Album covers → SQLite catalog: loads albums (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumCoversColumn.kt`)
- Song details → SQLite catalog: reads and updates (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/SongInfoColumn.kt`)
- Album details → SQLite catalog: updates album (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumInfoColumn.kt`)
- Album details → Performer editor: opens editor (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumInfoColumn.kt`)
- Song details → Performer editor: opens editor (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/SongInfoColumn.kt`)
- Performer editor → SQLite catalog: updates performer (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/EditPerformerDialog.kt`)
- Navigation → Audio player UI: shows player (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/NavigationColumn.kt`)
- Album covers → Audio player UI: renders player (evidence: `app/src/main/kotlin/mx/unam/ciencias/myp/ui/columns/AlbumCoversColumn.kt`)
- Audio player UI → Gadulka player: controls playback
