# lukelzlz/legado-server architecture

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

- Interactive diagram: https://gitdiagram.com/lukelzlz/legado-server
- Repository: https://github.com/lukelzlz/legado-server

## Overview

Legado Server is a private, self-hosted reading service with a React web client. The main workflow is a reader or browser using the client to search network book sources, open and read books, and persist shelf and reading state through the Ktor API. Separate product branches support local-book import, backup restore, content cleanup, speech, offline reading, progress sync, and WebDAV. The README documents the major capabilities; some subsystem links rely on that documentation because their implementation files were not sampled.

Main entry points: [`server/src/main/kotlin/io/legado/server/Routes.kt`](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/Routes.kt) (Ktor Routes), [`web/src/api.ts`](https://github.com/lukelzlz/legado-server/blob/main/web/src/api.ts) (Web API Client), [`web/src/ReaderScreen.tsx`](https://github.com/lukelzlz/legado-server/blob/main/web/src/ReaderScreen.tsx) (Reader UI), [`server/src/main/kotlin/io/legado/server/RuleRunner.kt`](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/RuleRunner.kt) (Source Rule Engine)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Web Reading Client"]
  node_reader["Reader UI<br/>[ReaderScreen.tsx]"]
  node_search["Search and Shelf<br/>[searchStore.ts]"]
  node_sourceui["Source Management"]
  node_offlineui[("Offline and PWA<br/>[offlineStorage.ts]")]
  node_ui_shared["Reader Settings<br/>[readerSettings.ts]"]
  node_api["Web API Client<br/>[api.ts]"]
end

subgraph group_server["API and Source Services"]
  node_router["Ktor Routes<br/>[Routes.kt]"]
  node_auth["Session Auth<br/>[Auth.kt]"]
  node_source_rules["Source Rule Engine<br/>[RuleRunner.kt]"]
  node_source_codec["Source Codec<br/>[SourceCodec.kt]"]
  node_network_security["Network Security<br/>[NetworkSecurity.kt]"]
end

subgraph group_reading["Reading Capabilities"]
  node_content["Content Cleanup"]
  node_js["JavaScript Sandbox<br/>[JsSandbox.kt]"]
  node_localbook["Local Book Parser<br/>[LocalBookParser.kt]"]
  node_backup["Backup Restore<br/>[BackupImporter.kt]"]
  node_tts_sessions["TTS Sessions"]
  node_tts["Edge TTS<br/>[EdgeTtsService.kt]"]
  node_cache["Book Cache"]
end

subgraph group_state["Persistence and Sync"]
  node_db[("SQLite Database<br/>[Database.kt]")]
  node_progress["Progress Sync"]
  node_webdav["WebDAV Server<br/>[WebDavServer.kt]"]
  node_subscription["Source Subscriptions"]
end

subgraph group_integrations["External Integrations"]
  node_web_sources{{"Network Book Sources"}}
  node_edge_cloud{{"Edge TTS Service"}}
end

node_browser(("Browser Reader"))
node_mobile(("Legado Mobile"))
node_webdav_clients(("WebDAV Clients"))

node_browser -->|"opens"| node_reader
node_reader -->|"requests chapters"| node_api
node_search -->|"searches sources"| node_api
node_sourceui -->|"manages groups"| node_api
node_api -->|"calls REST API"| node_router
node_router -->|"checks sessions"| node_auth
node_router -->|"runs source rules"| node_source_rules
node_source_rules -->|"fetches source data"| node_web_sources
node_source_rules -->|"executes scripts"| node_js
node_router -->|"processes content"| node_content
node_content -->|"runs replacement scripts"| node_js
node_router -->|"parses uploads"| node_localbook
node_router -->|"imports backups"| node_backup
node_reader -->|"uses settings"| node_ui_shared
node_reader -->|"reads offline chapters"| node_offlineui
node_offlineui -->|"queues progress"| node_api
node_router -->|"manages sessions"| node_tts_sessions
node_tts_sessions -->|"streams synthesis"| node_tts
node_tts -->|"requests audio"| node_edge_cloud
node_router -->|"schedules caching"| node_cache
node_cache -->|"updates cache state"| node_db
node_router -->|"reads and writes"| node_db
node_router -->|"syncs progress"| node_progress
node_mobile -->|"syncs progress"| node_webdav
node_webdav_clients -->|"mounts files"| node_webdav
node_router -->|"serves WebDAV"| node_webdav
node_router -->|"updates subscriptions"| node_subscription
node_subscription -->|"loads subscriptions"| node_db
node_subscription -->|"validates targets"| node_network_security
node_source_rules -->|"validates requests"| node_network_security
node_source_codec -->|"encodes source data"| node_db

click node_reader "https://github.com/lukelzlz/legado-server/blob/main/web/src/ReaderScreen.tsx"
click node_search "https://github.com/lukelzlz/legado-server/blob/main/web/src/searchStore.ts"
click node_sourceui "https://github.com/lukelzlz/legado-server/blob/main/web/src/SourceGroupManagerModal.tsx"
click node_offlineui "https://github.com/lukelzlz/legado-server/blob/main/web/src/offlineStorage.ts"
click node_ui_shared "https://github.com/lukelzlz/legado-server/blob/main/web/src/readerSettings.ts"
click node_api "https://github.com/lukelzlz/legado-server/blob/main/web/src/api.ts"
click node_router "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/Routes.kt"
click node_auth "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/Auth.kt"
click node_source_rules "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/RuleRunner.kt"
click node_source_codec "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/SourceCodec.kt"
click node_network_security "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/NetworkSecurity.kt"
click node_content "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/ContentProcessor.kt"
click node_js "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/JsSandbox.kt"
click node_localbook "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/LocalBookParser.kt"
click node_backup "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/BackupImporter.kt"
click node_tts_sessions "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/TtsSessionService.kt"
click node_tts "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/EdgeTtsService.kt"
click node_cache "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/BookCacheService.kt"
click node_db "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/Database.kt"
click node_progress "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/BookProgressSync.kt"
click node_webdav "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/WebDavServer.kt"
click node_subscription "https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/SubscriptionService.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_search,node_sourceui,node_offlineui,node_ui_shared,node_api,node_browser,node_webdav_clients toneBlue
class node_router,node_auth,node_source_rules,node_source_codec,node_network_security toneAmber
class node_content,node_js,node_localbook,node_backup,node_tts_sessions,node_tts,node_cache toneMint
class node_db,node_progress,node_webdav,node_subscription toneRose
class node_web_sources,node_edge_cloud,node_mobile toneIndigo
```

## Components

### Web Reading Client

- [Reader UI](https://github.com/lukelzlz/legado-server/blob/main/web/src/ReaderScreen.tsx): `web/src/ReaderScreen.tsx`
- [Search and Shelf](https://github.com/lukelzlz/legado-server/blob/main/web/src/searchStore.ts): `web/src/searchStore.ts`
- [Source Management](https://github.com/lukelzlz/legado-server/blob/main/web/src/SourceGroupManagerModal.tsx): `web/src/SourceGroupManagerModal.tsx`
- [Offline and PWA](https://github.com/lukelzlz/legado-server/blob/main/web/src/offlineStorage.ts): `web/src/offlineStorage.ts`
- [Reader Settings](https://github.com/lukelzlz/legado-server/blob/main/web/src/readerSettings.ts): `web/src/readerSettings.ts`
- [Web API Client](https://github.com/lukelzlz/legado-server/blob/main/web/src/api.ts): `web/src/api.ts`

### API and Source Services

- [Ktor Routes](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/Routes.kt): `server/src/main/kotlin/io/legado/server/Routes.kt`
- [Session Auth](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/Auth.kt): `server/src/main/kotlin/io/legado/server/Auth.kt`
- [Source Rule Engine](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/RuleRunner.kt): `server/src/main/kotlin/io/legado/server/RuleRunner.kt`
- [Source Codec](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/SourceCodec.kt): `server/src/main/kotlin/io/legado/server/SourceCodec.kt`
- [Network Security](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/NetworkSecurity.kt): `server/src/main/kotlin/io/legado/server/NetworkSecurity.kt`

### Reading Capabilities

- [Content Cleanup](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/ContentProcessor.kt): `server/src/main/kotlin/io/legado/server/ContentProcessor.kt`
- [JavaScript Sandbox](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/JsSandbox.kt): `server/src/main/kotlin/io/legado/server/JsSandbox.kt`
- [Local Book Parser](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/LocalBookParser.kt): `server/src/main/kotlin/io/legado/server/LocalBookParser.kt`
- [Backup Restore](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/BackupImporter.kt): `server/src/main/kotlin/io/legado/server/BackupImporter.kt`
- [TTS Sessions](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/TtsSessionService.kt): `server/src/main/kotlin/io/legado/server/TtsSessionService.kt`
- [Edge TTS](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/EdgeTtsService.kt): `server/src/main/kotlin/io/legado/server/EdgeTtsService.kt`
- [Book Cache](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/BookCacheService.kt): `server/src/main/kotlin/io/legado/server/BookCacheService.kt`

### Persistence and Sync

- [SQLite Database](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/Database.kt): `server/src/main/kotlin/io/legado/server/Database.kt`
- [Progress Sync](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/BookProgressSync.kt): `server/src/main/kotlin/io/legado/server/BookProgressSync.kt`
- [WebDAV Server](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/WebDavServer.kt): `server/src/main/kotlin/io/legado/server/WebDavServer.kt`
- [Source Subscriptions](https://github.com/lukelzlz/legado-server/blob/main/server/src/main/kotlin/io/legado/server/SubscriptionService.kt): `server/src/main/kotlin/io/legado/server/SubscriptionService.kt`

### External Integrations

- **Network Book Sources**
- **Edge TTS Service**

### Other components

- **Browser Reader**
- **Legado Mobile**
- **WebDAV Clients**

## Connections

- Browser Reader → Reader UI: opens
- Reader UI → Web API Client: requests chapters (evidence: `web/src/ReaderScreen.tsx`)
- Search and Shelf → Web API Client: searches sources (evidence: `web/src/searchStore.ts`)
- Source Management → Web API Client: manages groups (evidence: `web/src/SourceGroupManagerModal.tsx`)
- Web API Client → Ktor Routes: calls REST API (evidence: `web/src/api.ts`)
- Ktor Routes → Session Auth: checks sessions (evidence: `server/src/main/kotlin/io/legado/server/Routes.kt`)
- Ktor Routes → Source Rule Engine: runs source rules (evidence: `server/src/main/kotlin/io/legado/server/Routes.kt`)
- Source Rule Engine → Network Book Sources: fetches source data
- Source Rule Engine → JavaScript Sandbox: executes scripts (evidence: `server/src/main/kotlin/io/legado/server/RuleRunner.kt`)
- Ktor Routes → Content Cleanup: processes content (evidence: `server/src/main/kotlin/io/legado/server/Routes.kt`)
- Content Cleanup → JavaScript Sandbox: runs replacement scripts (evidence: `server/src/main/kotlin/io/legado/server/ContentProcessor.kt`)
- Ktor Routes → Local Book Parser: parses uploads (evidence: `server/src/main/kotlin/io/legado/server/Routes.kt`)
- Ktor Routes → Backup Restore: imports backups
- Reader UI → Reader Settings: uses settings (evidence: `web/src/ReaderScreen.tsx`)
- Reader UI → Offline and PWA: reads offline chapters (evidence: `web/src/ReaderScreen.tsx`)
- Offline and PWA → Web API Client: queues progress (evidence: `web/src/api.ts`)
- Ktor Routes → TTS Sessions: manages sessions (evidence: `server/src/main/kotlin/io/legado/server/Routes.kt`)
- TTS Sessions → Edge TTS: streams synthesis (evidence: `server/src/main/kotlin/io/legado/server/TtsSessionService.kt`)
- Edge TTS → Edge TTS Service: requests audio
- Ktor Routes → Book Cache: schedules caching (evidence: `server/src/main/kotlin/io/legado/server/Routes.kt`)
- Book Cache → SQLite Database: updates cache state (evidence: `server/src/main/kotlin/io/legado/server/BookCacheService.kt`)
- Ktor Routes → SQLite Database: reads and writes (evidence: `server/src/main/kotlin/io/legado/server/Routes.kt`)
- Ktor Routes → Progress Sync: syncs progress (evidence: `server/src/main/kotlin/io/legado/server/Routes.kt`)
- Legado Mobile → WebDAV Server: syncs progress
- WebDAV Clients → WebDAV Server: mounts files
- Ktor Routes → WebDAV Server: serves WebDAV
- Ktor Routes → Source Subscriptions: updates subscriptions (evidence: `server/src/main/kotlin/io/legado/server/Routes.kt`)
- Source Subscriptions → SQLite Database: loads subscriptions (evidence: `server/src/main/kotlin/io/legado/server/SubscriptionService.kt`)
- Source Subscriptions → Network Security: validates targets (evidence: `server/src/main/kotlin/io/legado/server/SubscriptionService.kt`)
- Source Rule Engine → Network Security: validates requests (evidence: `server/src/main/kotlin/io/legado/server/RuleRunner.kt`)
- Source Codec → SQLite Database: encodes source data (evidence: `server/src/main/kotlin/io/legado/server/Database.kt`)
