# shrimpsejati/yozoramanga architecture

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

- Interactive diagram: https://gitdiagram.com/shrimpsejati/yozoramanga
- Repository: https://github.com/shrimpsejati/yozoramanga

## Overview

Yozora Manga is an Android manga reader whose central workflow is selecting a source, finding a title, opening its details and chapters, then reading pages while saving progress locally. The UI also exposes home recommendations and updates, library, history, downloads, and source/account controls. SourceManager selects a MangaSource implementation; the README documents MangaDex, Mangakakalot, and West Manga capabilities. MainActivity initialization and sampled SearchScreen/ReaderScreen code support the depicted wiring; unsampled screen internals are represented only where documented.

Main entry points: [`app/src/main/java/com/yozora/manga/ui/navigation/YozoraMangaNavHost.kt`](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/navigation/YozoraMangaNavHost.kt) (Navigation Host), [`app/src/main/java/com/yozora/manga/data/SourceManager.kt`](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/SourceManager.kt) (Source Manager), [`app/src/main/java/com/yozora/manga/MainActivity.kt`](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/MainActivity.kt) (App Startup), [`app/src/main/java/com/yozora/manga/data/LocalStore.kt`](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/LocalStore.kt) (Local Preferences)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App and Navigation"]
  node_activity["App Startup<br/>[MainActivity.kt]"]
  node_nav["Navigation Host"]
end

subgraph group_discovery["Discovery and Reading"]
  node_home["Home<br/>[HomeScreen.kt]"]
  node_search["Search<br/>[SearchScreen.kt]"]
  node_detail["Manga Detail<br/>[DetailScreen.kt]"]
  node_chapterreader["Chapter Reader<br/>[ReaderScreen.kt]"]
  node_library["Library<br/>[LibraryScreen.kt]"]
  node_history["Reading History<br/>[HistoryScreen.kt]"]
  node_downloads["Downloads<br/>[DownloadsScreen.kt]"]
  node_account["Account<br/>[AccountScreen.kt]"]
end

subgraph group_sources["Manga Sources"]
  node_manager["Source Manager<br/>[SourceManager.kt]"]
  node_contract["Source Contract<br/>[MangaSource.kt]"]
  node_mangadex["MangaDex<br/>[MangaDexSource.kt]"]
  node_mangakakalot["Mangakakalot"]
  node_westmanga["West Manga<br/>[WestMangaSource.kt]"]
end

subgraph group_state["Local State"]
  node_store[("Local Preferences<br/>[LocalStore.kt]")]
  node_models["Manga Models<br/>[Models.kt]"]
end

subgraph group_support["Network Support"]
  node_images["Image Loading"]
  node_challenge["Challenge State"]
  node_challengeweb["Challenge WebView"]
  node_challengeui["Challenge Dialog"]
  node_mangakimages["Mangakakalot Images"]
  node_westimages["West Manga Images"]
end

node_reader(("Reader"))
node_network{{"Manga Services"}}

node_reader -->|"opens app"| node_activity
node_activity -->|"sets content"| node_nav
node_nav -->|"routes"| node_home
node_nav -->|"routes"| node_search
node_nav -->|"routes"| node_detail
node_nav -->|"routes"| node_chapterreader
node_nav -->|"routes"| node_library
node_nav -->|"routes"| node_history
node_nav -->|"routes"| node_downloads
node_nav -->|"routes"| node_account
node_activity -->|"initializes"| node_manager
node_activity -->|"creates"| node_store
node_manager -->|"loads selection"| node_store
node_manager -->|"persists selection"| node_store
node_account -->|"selects source"| node_manager
node_home -->|"requests manga"| node_manager
node_search -->|"searches active source"| node_manager
node_detail -->|"loads title"| node_manager
node_chapterreader -->|"loads chapters and pages"| node_manager
node_home -->|"reads saved progress"| node_store
node_search -->|"reads and saves history"| node_store
node_search -->|"updates bookmarks"| node_store
node_chapterreader -->|"saves progress and settings"| node_store
node_library -->|"reads bookmarks"| node_store
node_history -->|"reads history"| node_store
node_manager -->|"selects implementation"| node_contract
node_contract -->|"implemented by"| node_mangadex
node_contract -->|"implemented by"| node_mangakakalot
node_contract -->|"implemented by"| node_westmanga
node_mangadex -->|"calls API"| node_network
node_mangakakalot -->|"fetches and scrapes"| node_network
node_westmanga -->|"calls source services"| node_network
node_mangadex -->|"produces"| node_models
node_mangakakalot -->|"produces"| node_models
node_westmanga -->|"produces"| node_models
node_activity -->|"registers fetcher"| node_images
node_activity -->|"registers fetcher"| node_mangakimages
node_activity -->|"registers fetcher"| node_westimages
node_mangakimages -->|"fetches images"| node_network
node_westimages -->|"fetches images"| node_network
node_images -->|"fetches images"| node_network
node_mangakakalot -.->|"requests rendered HTML"| node_challengeweb
node_challengeweb -->|"signals challenge"| node_challenge
node_challenge -->|"notifies pending challenge"| node_challengeui
node_activity -->|"displays dialog"| node_challengeui
node_challengeui -->|"resolves or cancels"| node_challenge
node_challengeui -.->|"opens challenge page"| node_network

click node_activity "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/MainActivity.kt"
click node_nav "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/navigation/YozoraMangaNavHost.kt"
click node_home "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/HomeScreen.kt"
click node_search "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/SearchScreen.kt"
click node_detail "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/DetailScreen.kt"
click node_chapterreader "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/ReaderScreen.kt"
click node_library "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/LibraryScreen.kt"
click node_history "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/HistoryScreen.kt"
click node_downloads "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/DownloadsScreen.kt"
click node_account "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/AccountScreen.kt"
click node_manager "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/SourceManager.kt"
click node_contract "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/MangaSource.kt"
click node_mangadex "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/MangaDexSource.kt"
click node_mangakakalot "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/MangakakalotSource.kt"
click node_westmanga "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/WestMangaSource.kt"
click node_store "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/LocalStore.kt"
click node_models "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/Models.kt"
click node_images "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/CronetImageFetcher.kt"
click node_challenge "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/CloudflareChallengeState.kt"
click node_challengeweb "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/CloudflareWebView.kt"
click node_challengeui "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/components/CloudflareChallengeDialog.kt"
click node_mangakimages "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/MangakakalotImageFetcher.kt"
click node_westimages "https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/WestMangaImageFetcher.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_nav toneBlue
class node_home,node_search,node_detail,node_chapterreader,node_library,node_history,node_downloads,node_account toneAmber
class node_manager,node_contract,node_mangadex,node_mangakakalot,node_westmanga toneMint
class node_store,node_models toneRose
class node_images,node_challenge,node_challengeweb,node_challengeui,node_mangakimages,node_westimages,node_reader,node_network toneIndigo
```

## Components

### App and Navigation

- [App Startup](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/MainActivity.kt): `app/src/main/java/com/yozora/manga/MainActivity.kt`
- [Navigation Host](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/navigation/YozoraMangaNavHost.kt): `app/src/main/java/com/yozora/manga/ui/navigation/YozoraMangaNavHost.kt`

### Discovery and Reading

- [Home](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/HomeScreen.kt): `app/src/main/java/com/yozora/manga/ui/screens/HomeScreen.kt`
- [Search](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/SearchScreen.kt): `app/src/main/java/com/yozora/manga/ui/screens/SearchScreen.kt`
- [Manga Detail](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/DetailScreen.kt): `app/src/main/java/com/yozora/manga/ui/screens/DetailScreen.kt`
- [Chapter Reader](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/ReaderScreen.kt): `app/src/main/java/com/yozora/manga/ui/screens/ReaderScreen.kt`
- [Library](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/LibraryScreen.kt): `app/src/main/java/com/yozora/manga/ui/screens/LibraryScreen.kt`
- [Reading History](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/HistoryScreen.kt): `app/src/main/java/com/yozora/manga/ui/screens/HistoryScreen.kt`
- [Downloads](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/DownloadsScreen.kt): `app/src/main/java/com/yozora/manga/ui/screens/DownloadsScreen.kt`
- [Account](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/screens/AccountScreen.kt): `app/src/main/java/com/yozora/manga/ui/screens/AccountScreen.kt`

### Manga Sources

- [Source Manager](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/SourceManager.kt): `app/src/main/java/com/yozora/manga/data/SourceManager.kt`
- [Source Contract](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/MangaSource.kt): `app/src/main/java/com/yozora/manga/data/MangaSource.kt`
- [MangaDex](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/MangaDexSource.kt): `app/src/main/java/com/yozora/manga/data/MangaDexSource.kt`
- [Mangakakalot](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/MangakakalotSource.kt): `app/src/main/java/com/yozora/manga/data/MangakakalotSource.kt`
- [West Manga](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/WestMangaSource.kt): `app/src/main/java/com/yozora/manga/data/WestMangaSource.kt`

### Local State

- [Local Preferences](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/LocalStore.kt): `app/src/main/java/com/yozora/manga/data/LocalStore.kt`
- [Manga Models](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/Models.kt): `app/src/main/java/com/yozora/manga/data/Models.kt`

### Network Support

- [Image Loading](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/CronetImageFetcher.kt): `app/src/main/java/com/yozora/manga/data/CronetImageFetcher.kt`
- [Challenge State](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/CloudflareChallengeState.kt): `app/src/main/java/com/yozora/manga/data/CloudflareChallengeState.kt`
- [Challenge WebView](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/CloudflareWebView.kt): `app/src/main/java/com/yozora/manga/data/CloudflareWebView.kt`
- [Challenge Dialog](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/ui/components/CloudflareChallengeDialog.kt): `app/src/main/java/com/yozora/manga/ui/components/CloudflareChallengeDialog.kt`
- [Mangakakalot Images](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/MangakakalotImageFetcher.kt): `app/src/main/java/com/yozora/manga/data/MangakakalotImageFetcher.kt`
- [West Manga Images](https://github.com/shrimpsejati/yozoramanga/blob/main/app/src/main/java/com/yozora/manga/data/WestMangaImageFetcher.kt): `app/src/main/java/com/yozora/manga/data/WestMangaImageFetcher.kt`

### Other components

- **Reader**
- **Manga Services**

## Connections

- Reader → App Startup: opens app
- App Startup → Navigation Host: sets content
- Navigation Host → Home: routes
- Navigation Host → Search: routes
- Navigation Host → Manga Detail: routes
- Navigation Host → Chapter Reader: routes
- Navigation Host → Library: routes
- Navigation Host → Reading History: routes
- Navigation Host → Downloads: routes
- Navigation Host → Account: routes
- App Startup → Source Manager: initializes
- App Startup → Local Preferences: creates
- Source Manager → Local Preferences: loads selection
- Source Manager → Local Preferences: persists selection
- Account → Source Manager: selects source
- Home → Source Manager: requests manga
- Search → Source Manager: searches active source
- Manga Detail → Source Manager: loads title
- Chapter Reader → Source Manager: loads chapters and pages
- Home → Local Preferences: reads saved progress
- Search → Local Preferences: reads and saves history
- Search → Local Preferences: updates bookmarks
- Chapter Reader → Local Preferences: saves progress and settings
- Library → Local Preferences: reads bookmarks
- Reading History → Local Preferences: reads history
- Source Manager → Source Contract: selects implementation
- Source Contract → MangaDex: implemented by
- Source Contract → Mangakakalot: implemented by
- Source Contract → West Manga: implemented by
- MangaDex → Manga Services: calls API
- Mangakakalot → Manga Services: fetches and scrapes
- West Manga → Manga Services: calls source services
- MangaDex → Manga Models: produces
- Mangakakalot → Manga Models: produces
- West Manga → Manga Models: produces
- App Startup → Image Loading: registers fetcher
- App Startup → Mangakakalot Images: registers fetcher
- App Startup → West Manga Images: registers fetcher
- Mangakakalot Images → Manga Services: fetches images
- West Manga Images → Manga Services: fetches images
- Image Loading → Manga Services: fetches images
- Mangakakalot → Challenge WebView: requests rendered HTML
- Challenge WebView → Challenge State: signals challenge
- Challenge State → Challenge Dialog: notifies pending challenge
- App Startup → Challenge Dialog: displays dialog
- Challenge Dialog → Challenge State: resolves or cancels
- Challenge Dialog → Manga Services: opens challenge page
