# caninjpn/xmb-launcher architecture

> Architecture diagram of the GitHub repository caninjpn/xmb-launcher, 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/caninjpn/xmb-launcher
- Repository: https://github.com/caninjpn/xmb-launcher

## Overview

Ember XMB is an Android TV launcher with a PS3-style XMB interface. A remote-key event enters through MainActivity, which dispatches navigation to XmbViewModel; the model loads installed apps and Continue Watching items, combines them with launcher state, and supplies the Compose screen. The screen presents categories, item columns, menus and themes, while a separate GLES view renders the animated background. The README also documents category assignment, favourites, rearrangement and theme options. Some listed modules were not excerpted, so their internal links are omitted where evidence is unavailable.

Main entry points: [`app/src/main/java/com/ember/xmb/XmbViewModel.kt`](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/XmbViewModel.kt) (Launcher state), [`app/src/main/java/com/ember/xmb/MainActivity.kt`](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/MainActivity.kt) (Main activity), [`app/src/main/java/com/ember/xmb/ui/XmbScreen.kt`](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/ui/XmbScreen.kt) (XMB screen), [`app/src/main/java/com/ember/xmb/ui/XmbParts.kt`](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/ui/XmbParts.kt) (Menus and parts)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_input["App entry and state"]
  node_activity["Main activity<br/>[MainActivity.kt]"]
  node_viewmodel["Launcher state<br/>[XmbViewModel.kt]"]
  node_models["Launcher models<br/>[Models.kt]"]
  node_system["System state<br/>[SystemState.kt]"]
end

subgraph group_catalog["App and recency data"]
  node_apprepo["App catalog<br/>[AppRepository.kt]"]
  node_continue["Continue Watching"]
  node_prefs["Launcher preferences<br/>[Prefs.kt]"]
  node_images["Artwork loading<br/>[Images.kt]"]
end

subgraph group_interface["XMB interface"]
  node_screen["XMB screen<br/>[XmbScreen.kt]"]
  node_parts["Menus and parts<br/>[XmbParts.kt]"]
  node_icons["XMB icons<br/>[XmbIcons.kt]"]
  node_palette["Theme palette<br/>[XmbPalette.kt]"]
end

subgraph group_rendering["Background rendering"]
  node_wave["Animated background<br/>[WaveView.kt]"]
  node_shaders["GLES shaders<br/>[Shaders.kt]"]
end

node_remote(("TV remote"))

node_remote -->|"sends keys"| node_activity
node_activity -->|"dispatches input"| node_viewmodel
node_activity -->|"hosts Compose UI"| node_screen
node_activity -->|"hosts renderer"| node_wave
node_activity -->|"uses theme"| node_palette
node_viewmodel -->|"loads catalog"| node_apprepo
node_viewmodel -->|"loads recency"| node_continue
node_viewmodel -->|"reads and writes"| node_prefs
node_apprepo -->|"reads assignments"| node_prefs
node_continue -->|"uses app catalog"| node_apprepo
node_continue -->|"uses launch history"| node_prefs
node_screen -->|"renders state"| node_viewmodel
node_screen -->|"uses colors"| node_palette
node_screen -->|"uses icons"| node_icons
node_parts -->|"invokes actions"| node_viewmodel
node_parts -->|"uses colors"| node_palette
node_parts -->|"uses icons"| node_icons
node_wave -->|"uses programs"| node_shaders

click node_activity "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/MainActivity.kt"
click node_viewmodel "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/XmbViewModel.kt"
click node_models "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/model/Models.kt"
click node_system "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/system/SystemState.kt"
click node_apprepo "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/data/AppRepository.kt"
click node_continue "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/data/ContinueWatchingRepository.kt"
click node_prefs "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/data/Prefs.kt"
click node_images "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/data/Images.kt"
click node_screen "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/ui/XmbScreen.kt"
click node_parts "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/ui/XmbParts.kt"
click node_icons "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/ui/XmbIcons.kt"
click node_palette "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/ui/XmbPalette.kt"
click node_wave "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/gl/WaveView.kt"
click node_shaders "https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/gl/Shaders.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_activity,node_viewmodel,node_models,node_system toneBlue
class node_apprepo,node_continue,node_prefs,node_images toneAmber
class node_screen,node_parts,node_icons,node_palette toneMint
class node_wave,node_shaders toneRose
class node_remote toneIndigo
```

## Components

### App entry and state

- [Main activity](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/MainActivity.kt): `app/src/main/java/com/ember/xmb/MainActivity.kt`
- [Launcher state](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/XmbViewModel.kt): `app/src/main/java/com/ember/xmb/XmbViewModel.kt`
- [Launcher models](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/model/Models.kt): `app/src/main/java/com/ember/xmb/model/Models.kt`
- [System state](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/system/SystemState.kt): `app/src/main/java/com/ember/xmb/system/SystemState.kt`

### App and recency data

- [App catalog](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/data/AppRepository.kt): `app/src/main/java/com/ember/xmb/data/AppRepository.kt`
- [Continue Watching](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/data/ContinueWatchingRepository.kt): `app/src/main/java/com/ember/xmb/data/ContinueWatchingRepository.kt`
- [Launcher preferences](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/data/Prefs.kt): `app/src/main/java/com/ember/xmb/data/Prefs.kt`
- [Artwork loading](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/data/Images.kt): `app/src/main/java/com/ember/xmb/data/Images.kt`

### XMB interface

- [XMB screen](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/ui/XmbScreen.kt): `app/src/main/java/com/ember/xmb/ui/XmbScreen.kt`
- [Menus and parts](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/ui/XmbParts.kt): `app/src/main/java/com/ember/xmb/ui/XmbParts.kt`
- [XMB icons](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/ui/XmbIcons.kt): `app/src/main/java/com/ember/xmb/ui/XmbIcons.kt`
- [Theme palette](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/ui/XmbPalette.kt): `app/src/main/java/com/ember/xmb/ui/XmbPalette.kt`

### Background rendering

- [Animated background](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/gl/WaveView.kt): `app/src/main/java/com/ember/xmb/gl/WaveView.kt`
- [GLES shaders](https://github.com/caninjpn/xmb-launcher/blob/main/app/src/main/java/com/ember/xmb/gl/Shaders.kt): `app/src/main/java/com/ember/xmb/gl/Shaders.kt`

### Other components

- **TV remote**

## Connections

- TV remote → Main activity: sends keys (evidence: `app/src/main/java/com/ember/xmb/MainActivity.kt`)
- Main activity → Launcher state: dispatches input (evidence: `app/src/main/java/com/ember/xmb/MainActivity.kt`)
- Main activity → XMB screen: hosts Compose UI (evidence: `app/src/main/java/com/ember/xmb/MainActivity.kt`)
- Main activity → Animated background: hosts renderer (evidence: `app/src/main/java/com/ember/xmb/MainActivity.kt`)
- Main activity → Theme palette: uses theme (evidence: `app/src/main/java/com/ember/xmb/MainActivity.kt`)
- Launcher state → App catalog: loads catalog (evidence: `app/src/main/java/com/ember/xmb/XmbViewModel.kt`)
- Launcher state → Continue Watching: loads recency (evidence: `app/src/main/java/com/ember/xmb/XmbViewModel.kt`)
- Launcher state → Launcher preferences: reads and writes (evidence: `app/src/main/java/com/ember/xmb/XmbViewModel.kt`)
- App catalog → Launcher preferences: reads assignments (evidence: `app/src/main/java/com/ember/xmb/data/AppRepository.kt`)
- Continue Watching → App catalog: uses app catalog (evidence: `app/src/main/java/com/ember/xmb/data/ContinueWatchingRepository.kt`)
- Continue Watching → Launcher preferences: uses launch history (evidence: `app/src/main/java/com/ember/xmb/data/ContinueWatchingRepository.kt`)
- XMB screen → Launcher state: renders state (evidence: `app/src/main/java/com/ember/xmb/ui/XmbScreen.kt`)
- XMB screen → Theme palette: uses colors (evidence: `app/src/main/java/com/ember/xmb/ui/XmbScreen.kt`)
- XMB screen → XMB icons: uses icons (evidence: `app/src/main/java/com/ember/xmb/ui/XmbScreen.kt`)
- Menus and parts → Launcher state: invokes actions (evidence: `app/src/main/java/com/ember/xmb/ui/XmbParts.kt`)
- Menus and parts → Theme palette: uses colors (evidence: `app/src/main/java/com/ember/xmb/ui/XmbParts.kt`)
- Menus and parts → XMB icons: uses icons (evidence: `app/src/main/java/com/ember/xmb/ui/XmbParts.kt`)
- Animated background → GLES shaders: uses programs (evidence: `app/src/main/java/com/ember/xmb/gl/WaveView.kt`)
