# nyanarchive/purpletv architecture

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

- Interactive diagram: https://gitdiagram.com/nyanarchive/purpletv
- Repository: https://github.com/nyanarchive/purpletv

## Overview

PurpleTV is an open-source modification of the Twitch Android application. Its runtime workflow extends Twitch startup with PurpleTV initialization, then applies user-configured changes to chat, playback/network behavior, and settings; additional feature branches include moderation-related tools, VOD chapters, logs, and a timer. The graph emphasizes these app capabilities and the sampled integration points. Several feature paths are inferred only from the file tree, so their connections are left unasserted; relationships shown are limited to explicit excerpts or source-index references.

Main entry points: [`app/monolith/src/main/java/tv/purple/monolith/bridge/PurpleTVAppContainer.kt`](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/bridge/PurpleTVAppContainer.kt) (PurpleTV container), [`app/monolith/src/main/java/tv/purple/monolith/features/settings/component/PurpleTVSettingsController.kt`](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/settings/component/PurpleTVSettingsController.kt) (PurpleTV settings), [`app/app/src/main/java/tv/twitch/android/shared/chat/observables/ChatConnectionController.java`](https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/shared/chat/observables/ChatConnectionController.java) (Chat connection), [`app/monolith/src/main/java/tv/purple/monolith/core/PrefManager.kt`](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/core/PrefManager.kt) (Preferences)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_startup["App integration"]
  node_lifecycle["Application lifecycle"]
  node_container["PurpleTV container"]
  node_prefs["Preferences<br/>[PrefManager.kt]"]
  node_flags["Feature flags<br/>[Flag.kt]"]
  node_resources["Resource lookup<br/>[ResManager.kt]"]
end

subgraph group_chat["Chat features"]
  node_chatconnect["Chat connection"]
  node_chathooks["Chat hook provider"]
  node_chatlogs["Chat logs<br/>[ChatLogs.kt]"]
  node_chatui["Chat UI"]
end

subgraph group_playback["Playback and proxy"]
  node_player["Theatre player"]
  node_manifest["Manifest fetching"]
  node_proxy["Stream proxy<br/>[Proxy.kt]"]
  node_proxyrepo["Proxy repository<br/>[ProxyRepository.kt]"]
end

subgraph group_settings["Settings and tools"]
  node_settings["PurpleTV settings"]
  node_blacklist[("Blacklist")]
  node_highlighter[("Chat highlighter")]
end

subgraph group_data["Data and extras"]
  node_chapters["VOD chapters"]
  node_updater["App updater"]
  node_timer["Playback timer<br/>[TimerService.kt]"]
end

node_user(("Twitch user"))

node_user -.->|"uses app"| node_lifecycle
node_lifecycle -->|"integrates"| node_container
node_container -->|"initializes"| node_prefs
node_container -->|"initializes"| node_chathooks
node_chatconnect -->|"filters messages"| node_chathooks
node_chatconnect -->|"handles clear events"| node_chathooks
node_chatconnect -.->|"subscribes logs"| node_chatlogs
node_container -->|"provides"| node_chatlogs
node_settings -->|"creates settings UI"| node_blacklist
node_settings -->|"creates settings UI"| node_highlighter
node_settings -->|"opens proxy settings"| node_proxy
node_proxy -->|"requests proxy playlists"| node_proxyrepo
node_player -.->|"fetches stream manifest"| node_manifest
node_manifest -.->|"may rewrite response"| node_proxy
node_container -.->|"registers lifecycle feature"| node_timer
node_container -->|"provides chapters"| node_chapters
node_settings -.->|"updates preferences"| node_prefs
node_prefs -->|"loads flag values"| node_flags
node_timer -.->|"resolves notification text"| node_resources

click node_lifecycle "https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/app/consumer/ApplicationLifecycleController.java"
click node_container "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/bridge/PurpleTVAppContainer.kt"
click node_prefs "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/core/PrefManager.kt"
click node_flags "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/core/models/flag/Flag.kt"
click node_chatconnect "https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/shared/chat/observables/ChatConnectionController.java"
click node_chathooks "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/chat/ChatHookProvider.kt"
click node_chatlogs "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/logs/ChatLogs.kt"
click node_chatui "https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/shared/chat/ChatViewDelegate.java"
click node_player "https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/feature/theatre/common/PlayerCoordinatorPresenter.java"
click node_manifest "https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/shared/manifest/fetcher/StreamManifestFetcher.java"
click node_proxy "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/proxy/Proxy.kt"
click node_proxyrepo "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/component/api/repository/ProxyRepository.kt"
click node_settings "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/settings/component/PurpleTVSettingsController.kt"
click node_blacklist "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/component/blacklist/data/repository/BlacklistRepository.kt"
click node_highlighter "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/component/highlighter/data/repository/HighlighterRepository.kt"
click node_chapters "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/chapters/component/data/repository/ChaptersRepository.kt"
click node_updater "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/updater/component/data/repository/UpdaterRepository.kt"
click node_timer "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/timer/service/TimerService.kt"
click node_resources "https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/core/ResManager.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_lifecycle,node_container,node_prefs,node_flags,node_resources,node_user toneBlue
class node_chatconnect,node_chathooks,node_chatlogs,node_chatui toneAmber
class node_player,node_manifest,node_proxy,node_proxyrepo toneMint
class node_settings,node_blacklist,node_highlighter toneRose
class node_chapters,node_updater,node_timer toneIndigo
```

## Components

### App integration

- [Application lifecycle](https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/app/consumer/ApplicationLifecycleController.java): `app/app/src/main/java/tv/twitch/android/app/consumer/ApplicationLifecycleController.java`
- [PurpleTV container](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/bridge/PurpleTVAppContainer.kt): `app/monolith/src/main/java/tv/purple/monolith/bridge/PurpleTVAppContainer.kt`
- [Preferences](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/core/PrefManager.kt): `app/monolith/src/main/java/tv/purple/monolith/core/PrefManager.kt`
- [Feature flags](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/core/models/flag/Flag.kt): `app/monolith/src/main/java/tv/purple/monolith/core/models/flag/Flag.kt`
- [Resource lookup](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/core/ResManager.kt): `app/monolith/src/main/java/tv/purple/monolith/core/ResManager.kt`

### Chat features

- [Chat connection](https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/shared/chat/observables/ChatConnectionController.java): `app/app/src/main/java/tv/twitch/android/shared/chat/observables/ChatConnectionController.java`
- [Chat hook provider](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/chat/ChatHookProvider.kt): `app/monolith/src/main/java/tv/purple/monolith/features/chat/ChatHookProvider.kt`
- [Chat logs](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/logs/ChatLogs.kt): `app/monolith/src/main/java/tv/purple/monolith/features/logs/ChatLogs.kt`
- [Chat UI](https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/shared/chat/ChatViewDelegate.java): `app/app/src/main/java/tv/twitch/android/shared/chat/ChatViewDelegate.java`

### Playback and proxy

- [Theatre player](https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/feature/theatre/common/PlayerCoordinatorPresenter.java): `app/app/src/main/java/tv/twitch/android/feature/theatre/common/PlayerCoordinatorPresenter.java`
- [Manifest fetching](https://github.com/nyanarchive/purpletv/blob/main/app/app/src/main/java/tv/twitch/android/shared/manifest/fetcher/StreamManifestFetcher.java): `app/app/src/main/java/tv/twitch/android/shared/manifest/fetcher/StreamManifestFetcher.java`
- [Stream proxy](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/proxy/Proxy.kt): `app/monolith/src/main/java/tv/purple/monolith/features/proxy/Proxy.kt`
- [Proxy repository](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/component/api/repository/ProxyRepository.kt): `app/monolith/src/main/java/tv/purple/monolith/component/api/repository/ProxyRepository.kt`

### Settings and tools

- [PurpleTV settings](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/settings/component/PurpleTVSettingsController.kt): `app/monolith/src/main/java/tv/purple/monolith/features/settings/component/PurpleTVSettingsController.kt`
- [Blacklist](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/component/blacklist/data/repository/BlacklistRepository.kt): `app/monolith/src/main/java/tv/purple/monolith/component/blacklist/data/repository/BlacklistRepository.kt`
- [Chat highlighter](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/component/highlighter/data/repository/HighlighterRepository.kt): `app/monolith/src/main/java/tv/purple/monolith/component/highlighter/data/repository/HighlighterRepository.kt`

### Data and extras

- [VOD chapters](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/chapters/component/data/repository/ChaptersRepository.kt): `app/monolith/src/main/java/tv/purple/monolith/features/chapters/component/data/repository/ChaptersRepository.kt`
- [App updater](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/updater/component/data/repository/UpdaterRepository.kt): `app/monolith/src/main/java/tv/purple/monolith/features/updater/component/data/repository/UpdaterRepository.kt`
- [Playback timer](https://github.com/nyanarchive/purpletv/blob/main/app/monolith/src/main/java/tv/purple/monolith/features/timer/service/TimerService.kt): `app/monolith/src/main/java/tv/purple/monolith/features/timer/service/TimerService.kt`

### Other components

- **Twitch user**

## Connections

- Twitch user → Application lifecycle: uses app
- Application lifecycle → PurpleTV container: integrates (evidence: `app/app/src/main/java/tv/twitch/android/app/consumer/ApplicationLifecycleController.java`)
- PurpleTV container → Preferences: initializes (evidence: `app/monolith/src/main/java/tv/purple/monolith/bridge/PurpleTVAppContainer.kt`)
- PurpleTV container → Chat hook provider: initializes (evidence: `app/monolith/src/main/java/tv/purple/monolith/bridge/PurpleTVAppContainer.kt`)
- Chat connection → Chat hook provider: filters messages (evidence: `app/app/src/main/java/tv/twitch/android/shared/chat/observables/ChatConnectionController.java`)
- Chat connection → Chat hook provider: handles clear events (evidence: `app/app/src/main/java/tv/twitch/android/shared/chat/observables/ChatConnectionController.java`)
- Chat connection → Chat logs: subscribes logs
- PurpleTV container → Chat logs: provides (evidence: `app/monolith/src/main/java/tv/purple/monolith/bridge/PurpleTVAppContainer.kt`)
- PurpleTV settings → Blacklist: creates settings UI (evidence: `app/monolith/src/main/java/tv/purple/monolith/features/settings/component/PurpleTVSettingsController.kt`)
- PurpleTV settings → Chat highlighter: creates settings UI (evidence: `app/monolith/src/main/java/tv/purple/monolith/features/settings/component/PurpleTVSettingsController.kt`)
- PurpleTV settings → Stream proxy: opens proxy settings (evidence: `app/monolith/src/main/java/tv/purple/monolith/features/settings/component/PurpleTVSettingsController.kt`)
- Stream proxy → Proxy repository: requests proxy playlists (evidence: `app/monolith/src/main/java/tv/purple/monolith/features/proxy/Proxy.kt`)
- Theatre player → Manifest fetching: fetches stream manifest
- Manifest fetching → Stream proxy: may rewrite response
- PurpleTV container → Playback timer: registers lifecycle feature
- PurpleTV container → VOD chapters: provides chapters (evidence: `app/monolith/src/main/java/tv/purple/monolith/bridge/PurpleTVAppContainer.kt`)
- PurpleTV settings → Preferences: updates preferences
- Preferences → Feature flags: loads flag values (evidence: `app/monolith/src/main/java/tv/purple/monolith/core/PrefManager.kt`)
- Playback timer → Resource lookup: resolves notification text (evidence: `app/monolith/src/main/java/tv/purple/monolith/features/timer/service/TimerService.kt`)
