# air5005/pagenest architecture

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

- Interactive diagram: https://gitdiagram.com/air5005/pagenest
- Repository: https://github.com/air5005/pagenest

## Overview

YiNest is an Android reading app whose central workflow is importing books into a personal library, opening them in the reader, and retaining progress and reading annotations. Its other major user-facing branches are online discovery and download, plus speech playback through system or Azure engines. The graph combines README-documented capabilities with the supplied source excerpts; several UI-to-repository and discovery-to-import connections are documented at product level, while unsampled implementation details are not expanded into speculative call chains.

Main entry points: [`app/src/main/java/com/wxn/reader/presentation/mainReader/MainReadScreen.kt`](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/presentation/mainReader/MainReadScreen.kt) (Reader), [`app/src/main/java/com/air5005/pagenest/speech/engine/SpeechEngineRouter.kt`](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/engine/SpeechEngineRouter.kt) (Engine routing), [`app/src/main/java/com/wxn/reader/presentation/home/HomeScreen.kt`](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/presentation/home/HomeScreen.kt) (Library and shelves), [`app/src/main/java/com/air5005/pagenest/discovery/ui/DiscoveryScreen.kt`](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/ui/DiscoveryScreen.kt) (Discovery and details)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_library["Library and reading"]
  node_reader["Reader<br/>[MainReadScreen.kt]"]
  node_reader_pages["Page controller"]
  node_details["Book details"]
  node_library_ui["Library and shelves<br/>[HomeScreen.kt]"]
  node_book_import["Book import"]
  node_book_store["Private book files"]
  node_catalog[("Library data<br/>[AppDatabase.kt]")]
  node_reader_state["Reading progress"]
end

subgraph group_discovery["Online discovery"]
  node_discovery_ui["Discovery and details<br/>[DiscoveryScreen.kt]"]
  node_discovery_repo["Catalog repository"]
  node_catalog_sources["Catalog sources"]
  node_openlibrary["Metadata enrichment"]
  node_download["Secure downloader"]
  node_online_import["Download import"]
end

subgraph group_speech["Speech reading"]
  node_speech_ui["Speech controls"]
  node_speech_settings["Speech settings"]
  node_speech_content["Content segmentation"]
  node_speech_router["Engine routing"]
  node_system_tts["System TTS<br/>[SystemTtsEngine.kt]"]
  node_azure_tts["Azure speech"]
  node_speech_service["Playback service"]
  node_speech_controller["Speech session"]
end

subgraph group_app["App experience"]
  node_diagnostics["Diagnostics"]
  node_skin["Appearance settings<br/>[SkinService.kt]"]
  node_navigation["App navigation<br/>[SetupNavGraph.kt]"]
end

node_user(("Reader"))
node_online_catalogs(("Online catalogs"))
node_azure_service(("Azure service"))

node_user -->|"opens app"| node_navigation
node_navigation -->|"navigates"| node_library_ui
node_library_ui -->|"imports books"| node_book_import
node_book_import -->|"stores privately"| node_book_store
node_book_import -->|"records book"| node_catalog
node_library_ui -->|"loads library"| node_catalog
node_library_ui -->|"opens book"| node_reader
node_reader -->|"loads pages"| node_reader_pages
node_reader -->|"saves progress"| node_reader_state
node_reader -->|"reads annotations"| node_catalog
node_reader -->|"opens details"| node_details
node_user -->|"searches books"| node_discovery_ui
node_discovery_ui -->|"requests catalog"| node_discovery_repo
node_discovery_repo -->|"queries sources"| node_catalog_sources
node_catalog_sources -->|"fetches listings"| node_online_catalogs
node_discovery_repo -->|"enriches metadata"| node_openlibrary
node_discovery_ui -->|"downloads selection"| node_download
node_download -->|"fetches file"| node_online_catalogs
node_discovery_ui -->|"imports download"| node_online_import
node_online_import -->|"delegates import"| node_book_import
node_reader -->|"starts speech"| node_speech_ui
node_speech_ui -->|"applies preferences"| node_speech_settings
node_speech_settings -->|"routes requests"| node_speech_router
node_speech_router -->|"uses segments"| node_speech_content
node_speech_router -->|"speaks offline"| node_system_tts
node_speech_router -->|"speaks online"| node_azure_tts
node_azure_tts -.->|"requests synthesis"| node_azure_service
node_speech_router -->|"provides audio"| node_speech_controller
node_speech_service -->|"controls session"| node_speech_controller
node_reader_pages -->|"loads speech pages"| node_speech_content
node_navigation -->|"opens diagnostics"| node_diagnostics
node_navigation -->|"opens appearance"| node_skin

click node_reader "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/presentation/mainReader/MainReadScreen.kt"
click node_reader_pages "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/presentation/mainReader/PageViewController.kt"
click node_details "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/presentation/bookDetails/bookDetailsScreen.kt"
click node_library_ui "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/presentation/home/HomeScreen.kt"
click node_book_import "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/library/importing/BookImportService.kt"
click node_book_store "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/library/importing/PrivateBookStore.kt"
click node_catalog "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/data/source/local/AppDatabase.kt"
click node_reader_state "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/domain/use_case/reading_progress/SetReadingProgressUseCase.kt"
click node_discovery_ui "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/ui/DiscoveryScreen.kt"
click node_discovery_repo "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/repository/DiscoveryCatalogRepository.kt"
click node_catalog_sources "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/source/OnlineCatalogSource.kt"
click node_openlibrary "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/openlibrary/OpenLibraryEnricher.kt"
click node_download "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/download/SecureBookDownloader.kt"
click node_online_import "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/importing/OnlineBookImportCoordinator.kt"
click node_speech_ui "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/ui/SpeechControlSheet.kt"
click node_speech_settings "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/settings/ReaderSpeechManager.kt"
click node_speech_content "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/content/SpeechContentSource.kt"
click node_speech_router "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/engine/SpeechEngineRouter.kt"
click node_system_tts "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/engine/SystemTtsEngine.kt"
click node_azure_tts "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/engine/AzureSpeechEngine.kt"
click node_speech_service "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/playback/SpeechPlaybackService.kt"
click node_speech_controller "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/playback/SpeechController.kt"
click node_diagnostics "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/diagnostics/DiagnosticsScreen.kt"
click node_skin "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/skin/SkinService.kt"
click node_navigation "https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/navigation/SetupNavGraph.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_reader,node_reader_pages,node_details,node_library_ui,node_book_import,node_book_store,node_catalog,node_reader_state toneBlue
class node_discovery_ui,node_discovery_repo,node_catalog_sources,node_openlibrary,node_download,node_online_import toneAmber
class node_speech_ui,node_speech_settings,node_speech_content,node_speech_router,node_system_tts,node_azure_tts,node_speech_service,node_speech_controller toneMint
class node_diagnostics,node_skin,node_navigation toneRose
class node_user,node_online_catalogs,node_azure_service toneIndigo
```

## Components

### Library and reading

- [Reader](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/presentation/mainReader/MainReadScreen.kt): `app/src/main/java/com/wxn/reader/presentation/mainReader/MainReadScreen.kt`
- [Page controller](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/presentation/mainReader/PageViewController.kt): `app/src/main/java/com/wxn/reader/presentation/mainReader/PageViewController.kt`
- [Book details](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/presentation/bookDetails/bookDetailsScreen.kt): `app/src/main/java/com/wxn/reader/presentation/bookDetails/bookDetailsScreen.kt`
- [Library and shelves](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/presentation/home/HomeScreen.kt): `app/src/main/java/com/wxn/reader/presentation/home/HomeScreen.kt`
- [Book import](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/library/importing/BookImportService.kt): `app/src/main/java/com/air5005/pagenest/library/importing/BookImportService.kt`
- [Private book files](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/library/importing/PrivateBookStore.kt): `app/src/main/java/com/air5005/pagenest/library/importing/PrivateBookStore.kt`
- [Library data](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/data/source/local/AppDatabase.kt): `app/src/main/java/com/wxn/reader/data/source/local/AppDatabase.kt`
- [Reading progress](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/domain/use_case/reading_progress/SetReadingProgressUseCase.kt): `app/src/main/java/com/wxn/reader/domain/use_case/reading_progress/SetReadingProgressUseCase.kt`

### Online discovery

- [Discovery and details](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/ui/DiscoveryScreen.kt): `app/src/main/java/com/air5005/pagenest/discovery/ui/DiscoveryScreen.kt`
- [Catalog repository](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/repository/DiscoveryCatalogRepository.kt): `app/src/main/java/com/air5005/pagenest/discovery/repository/DiscoveryCatalogRepository.kt`
- [Catalog sources](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/source/OnlineCatalogSource.kt): `app/src/main/java/com/air5005/pagenest/discovery/source/OnlineCatalogSource.kt`
- [Metadata enrichment](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/openlibrary/OpenLibraryEnricher.kt): `app/src/main/java/com/air5005/pagenest/discovery/openlibrary/OpenLibraryEnricher.kt`
- [Secure downloader](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/download/SecureBookDownloader.kt): `app/src/main/java/com/air5005/pagenest/discovery/download/SecureBookDownloader.kt`
- [Download import](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/discovery/importing/OnlineBookImportCoordinator.kt): `app/src/main/java/com/air5005/pagenest/discovery/importing/OnlineBookImportCoordinator.kt`

### Speech reading

- [Speech controls](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/ui/SpeechControlSheet.kt): `app/src/main/java/com/air5005/pagenest/speech/ui/SpeechControlSheet.kt`
- [Speech settings](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/settings/ReaderSpeechManager.kt): `app/src/main/java/com/air5005/pagenest/speech/settings/ReaderSpeechManager.kt`
- [Content segmentation](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/content/SpeechContentSource.kt): `app/src/main/java/com/air5005/pagenest/speech/content/SpeechContentSource.kt`
- [Engine routing](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/engine/SpeechEngineRouter.kt): `app/src/main/java/com/air5005/pagenest/speech/engine/SpeechEngineRouter.kt`
- [System TTS](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/engine/SystemTtsEngine.kt): `app/src/main/java/com/air5005/pagenest/speech/engine/SystemTtsEngine.kt`
- [Azure speech](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/engine/AzureSpeechEngine.kt): `app/src/main/java/com/air5005/pagenest/speech/engine/AzureSpeechEngine.kt`
- [Playback service](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/playback/SpeechPlaybackService.kt): `app/src/main/java/com/air5005/pagenest/speech/playback/SpeechPlaybackService.kt`
- [Speech session](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/speech/playback/SpeechController.kt): `app/src/main/java/com/air5005/pagenest/speech/playback/SpeechController.kt`

### App experience

- [Diagnostics](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/diagnostics/DiagnosticsScreen.kt): `app/src/main/java/com/air5005/pagenest/diagnostics/DiagnosticsScreen.kt`
- [Appearance settings](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/air5005/pagenest/skin/SkinService.kt): `app/src/main/java/com/air5005/pagenest/skin/SkinService.kt`
- [App navigation](https://github.com/air5005/pagenest/blob/master/app/src/main/java/com/wxn/reader/navigation/SetupNavGraph.kt): `app/src/main/java/com/wxn/reader/navigation/SetupNavGraph.kt`

### Other components

- **Reader**
- **Online catalogs**
- **Azure service**

## Connections

- Reader → App navigation: opens app
- App navigation → Library and shelves: navigates
- Library and shelves → Book import: imports books
- Book import → Private book files: stores privately
- Book import → Library data: records book
- Library and shelves → Library data: loads library
- Library and shelves → Reader: opens book
- Reader → Page controller: loads pages
- Reader → Reading progress: saves progress
- Reader → Library data: reads annotations
- Reader → Book details: opens details
- Reader → Discovery and details: searches books
- Discovery and details → Catalog repository: requests catalog
- Catalog repository → Catalog sources: queries sources
- Catalog sources → Online catalogs: fetches listings
- Catalog repository → Metadata enrichment: enriches metadata
- Discovery and details → Secure downloader: downloads selection
- Secure downloader → Online catalogs: fetches file
- Discovery and details → Download import: imports download
- Download import → Book import: delegates import
- Reader → Speech controls: starts speech
- Speech controls → Speech settings: applies preferences
- Speech settings → Engine routing: routes requests
- Engine routing → Content segmentation: uses segments
- Engine routing → System TTS: speaks offline
- Engine routing → Azure speech: speaks online
- Azure speech → Azure service: requests synthesis
- Engine routing → Speech session: provides audio
- Playback service → Speech session: controls session
- Page controller → Content segmentation: loads speech pages
- App navigation → Diagnostics: opens diagnostics
- App navigation → Appearance settings: opens appearance
