# open-ani/animeko architecture

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

- Interactive diagram: https://gitdiagram.com/open-ani/animeko
- Repository: https://github.com/open-ani/animeko
- Video tour (about a minute): https://gitdiagram.com/open-ani/animeko/video

## Overview

Animeko is a cross-platform anime discovery and viewing app. The main user journey is finding a title or episode, choosing a source, watching with danmaku, and syncing viewing progress; offline caching and watch-together are parallel capabilities. The tree and README establish these product stages, while sampled code confirms search, selector/RSS source processing, torrent caching, Android torrent service behavior, and watch-together sync guidance. UI-to-domain wiring and several unsampled integrations are therefore represented only where documented, not as inferred call chains.

Main entry points: [`app/shared/app-data/src/commonMain/kotlin/data/network/AniSubjectSearchService.kt`](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/network/AniSubjectSearchService.kt) (Subject search), [`app/shared/app-data/src/commonMain/kotlin/domain/episode/SubjectMediaFetchSessions.kt`](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/episode/SubjectMediaFetchSessions.kt) (Episode sessions), [`app/shared/app-data/src/commonMain/kotlin/data/repository/subject/SubjectCollectionRepository.kt`](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/repository/subject/SubjectCollectionRepository.kt) (Collections and progress), [`app/android/src/default/kotlin/activity/MainActivity.kt`](https://github.com/open-ani/animeko/blob/main/app/android/src/default/kotlin/activity/MainActivity.kt) (Android app)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_clients["Client apps"]
  node_android["Android app<br/>[MainActivity.kt]"]
  node_desktop["Desktop app<br/>[AniDesktop.kt]"]
  node_ios["iOS app<br/>[ContentView.swift]"]
  node_tv["TV app<br/>[MainActivity.kt]"]
end

subgraph group_catalog["Discovery and tracking"]
  node_search["Subject search"]
  node_tracking["Collections and progress"]
end

subgraph group_playback["Playback and sources"]
  node_episode["Episode sessions"]
  node_selector["Web source selector"]
  node_rss["RSS source engine"]
  node_player["Cross-platform player"]
  node_danmaku["Danmaku service"]
  node_cache["Media cache<br/>[MediaCache.kt]"]
  node_torrent_cache["Torrent cache engine"]
  node_watchtogether["Watch-together guidance"]
end

subgraph group_platform["State and platform services"]
  node_torrent["Torrent engine<br/>[TorrentEngine.kt]"]
  node_torrent_service["Android torrent service"]
  node_database[("App database<br/>[AniDatabase.kt]")]
  node_settings[("User settings<br/>[SettingsStore.kt]")]
end

node_user(("Viewer"))
node_catalogapi{{"Animeko catalog API"}}
node_bangumi{{"Bangumi services"}}
node_sources{{"Online media sources"}}
node_danmaku_remote{{"Danmaku providers"}}
node_watch_api{{"Watch-together API"}}

node_user -->|"uses"| node_android
node_user -->|"uses"| node_desktop
node_user -->|"uses"| node_ios
node_user -->|"uses"| node_tv
node_android -->|"searches titles"| node_search
node_desktop -->|"searches titles"| node_search
node_ios -->|"searches titles"| node_search
node_tv -->|"searches titles"| node_search
node_search -->|"queries"| node_catalogapi
node_user -->|"tracks shows"| node_tracking
node_tracking -->|"syncs progress"| node_bangumi
node_user -->|"selects episode"| node_episode
node_episode -->|"fetches media"| node_selector
node_episode -->|"fetches media"| node_rss
node_selector -->|"requests pages"| node_sources
node_rss -->|"reads feeds"| node_sources
node_episode -->|"starts playback"| node_player
node_player -->|"loads comments"| node_danmaku
node_danmaku -->|"fetches and posts"| node_danmaku_remote
node_user -->|"caches media"| node_cache
node_cache -->|"delegates torrent cache"| node_torrent_cache
node_torrent_cache -->|"downloads"| node_torrent
node_torrent_service -->|"hosts engine"| node_torrent
node_user -->|"joins session"| node_watchtogether
node_watchtogether -->|"syncs playback"| node_watch_api
node_tracking -->|"stores local state"| node_database
node_user -->|"configures playback"| node_settings

click node_android "https://github.com/open-ani/animeko/blob/main/app/android/src/default/kotlin/activity/MainActivity.kt"
click node_desktop "https://github.com/open-ani/animeko/blob/main/app/desktop/src/main/kotlin/AniDesktop.kt"
click node_ios "https://github.com/open-ani/animeko/blob/main/app/ios/Animeko/ContentView.swift"
click node_tv "https://github.com/open-ani/animeko/blob/main/app/android/src/tv/kotlin/MainActivity.kt"
click node_search "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/network/AniSubjectSearchService.kt"
click node_tracking "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/repository/subject/SubjectCollectionRepository.kt"
click node_episode "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/episode/SubjectMediaFetchSessions.kt"
click node_selector "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/mediasource/web/SelectorMediaSourceEngine.kt"
click node_rss "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/mediasource/rss/RssMediaSourceEngine.kt"
click node_danmaku "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/network/danmaku/AniDanmakuProvider.kt"
click node_cache "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/media/cache/MediaCache.kt"
click node_torrent_cache "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/media/cache/engine/TorrentMediaCacheEngine.kt"
click node_torrent "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/torrent/TorrentEngine.kt"
click node_torrent_service "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/androidMain/kotlin/domain/torrent/service/AniTorrentService.kt"
click node_watchtogether "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/watchtogether/SyncGuidanceEngine.kt"
click node_database "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/persistent/database/AniDatabase.kt"
click node_settings "https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/persistent/SettingsStore.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_android,node_desktop,node_ios,node_tv,node_user toneBlue
class node_search,node_tracking toneAmber
class node_episode,node_selector,node_rss,node_player,node_danmaku,node_cache,node_torrent_cache,node_watchtogether,node_catalogapi,node_watch_api toneMint
class node_torrent,node_torrent_service,node_database,node_settings toneRose
class node_bangumi,node_sources,node_danmaku_remote toneIndigo
```

## Components

### Client apps

- [Android app](https://github.com/open-ani/animeko/blob/main/app/android/src/default/kotlin/activity/MainActivity.kt): `app/android/src/default/kotlin/activity/MainActivity.kt`
- [Desktop app](https://github.com/open-ani/animeko/blob/main/app/desktop/src/main/kotlin/AniDesktop.kt): `app/desktop/src/main/kotlin/AniDesktop.kt`
- [iOS app](https://github.com/open-ani/animeko/blob/main/app/ios/Animeko/ContentView.swift): `app/ios/Animeko/ContentView.swift`
- [TV app](https://github.com/open-ani/animeko/blob/main/app/android/src/tv/kotlin/MainActivity.kt): `app/android/src/tv/kotlin/MainActivity.kt`

### Discovery and tracking

- [Subject search](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/network/AniSubjectSearchService.kt): `app/shared/app-data/src/commonMain/kotlin/data/network/AniSubjectSearchService.kt`
- [Collections and progress](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/repository/subject/SubjectCollectionRepository.kt): `app/shared/app-data/src/commonMain/kotlin/data/repository/subject/SubjectCollectionRepository.kt`

### Playback and sources

- [Episode sessions](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/episode/SubjectMediaFetchSessions.kt): `app/shared/app-data/src/commonMain/kotlin/domain/episode/SubjectMediaFetchSessions.kt`
- [Web source selector](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/mediasource/web/SelectorMediaSourceEngine.kt): `app/shared/app-data/src/commonMain/kotlin/domain/mediasource/web/SelectorMediaSourceEngine.kt`
- [RSS source engine](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/mediasource/rss/RssMediaSourceEngine.kt): `app/shared/app-data/src/commonMain/kotlin/domain/mediasource/rss/RssMediaSourceEngine.kt`
- **Cross-platform player**
- [Danmaku service](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/network/danmaku/AniDanmakuProvider.kt): `app/shared/app-data/src/commonMain/kotlin/data/network/danmaku/AniDanmakuProvider.kt`
- [Media cache](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/media/cache/MediaCache.kt): `app/shared/app-data/src/commonMain/kotlin/domain/media/cache/MediaCache.kt`
- [Torrent cache engine](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/media/cache/engine/TorrentMediaCacheEngine.kt): `app/shared/app-data/src/commonMain/kotlin/domain/media/cache/engine/TorrentMediaCacheEngine.kt`
- [Watch-together guidance](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/watchtogether/SyncGuidanceEngine.kt): `app/shared/app-data/src/commonMain/kotlin/domain/watchtogether/SyncGuidanceEngine.kt`

### State and platform services

- [Torrent engine](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/domain/torrent/TorrentEngine.kt): `app/shared/app-data/src/commonMain/kotlin/domain/torrent/TorrentEngine.kt`
- [Android torrent service](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/androidMain/kotlin/domain/torrent/service/AniTorrentService.kt): `app/shared/app-data/src/androidMain/kotlin/domain/torrent/service/AniTorrentService.kt`
- [App database](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/persistent/database/AniDatabase.kt): `app/shared/app-data/src/commonMain/kotlin/data/persistent/database/AniDatabase.kt`
- [User settings](https://github.com/open-ani/animeko/blob/main/app/shared/app-data/src/commonMain/kotlin/data/persistent/SettingsStore.kt): `app/shared/app-data/src/commonMain/kotlin/data/persistent/SettingsStore.kt`

### Other components

- **Viewer**
- **Animeko catalog API**
- **Bangumi services**
- **Online media sources**
- **Danmaku providers**
- **Watch-together API**

## Connections

- Viewer → Android app: uses
- Viewer → Desktop app: uses
- Viewer → iOS app: uses
- Viewer → TV app: uses
- Android app → Subject search: searches titles
- Desktop app → Subject search: searches titles
- iOS app → Subject search: searches titles
- TV app → Subject search: searches titles
- Subject search → Animeko catalog API: queries
- Viewer → Collections and progress: tracks shows
- Collections and progress → Bangumi services: syncs progress
- Viewer → Episode sessions: selects episode
- Episode sessions → Web source selector: fetches media
- Episode sessions → RSS source engine: fetches media
- Web source selector → Online media sources: requests pages
- RSS source engine → Online media sources: reads feeds
- Episode sessions → Cross-platform player: starts playback
- Cross-platform player → Danmaku service: loads comments
- Danmaku service → Danmaku providers: fetches and posts
- Viewer → Media cache: caches media
- Media cache → Torrent cache engine: delegates torrent cache
- Torrent cache engine → Torrent engine: downloads
- Android torrent service → Torrent engine: hosts engine
- Viewer → Watch-together guidance: joins session
- Watch-together guidance → Watch-together API: syncs playback
- Collections and progress → App database: stores local state
- Viewer → User settings: configures playback
