# wep-56/ezvenera architecture

> Architecture diagram of the GitHub repository wep-56/ezvenera, 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/wep-56/ezvenera
- Repository: https://github.com/wep-56/ezvenera

## Overview

EZVenera is a Flutter comic-reading app for Windows and Android, built around compatible Venera plugins. The main user journey is to choose a source, browse or search for comics, open a comic and chapter, then read its pages. The map also includes local reading, downloads, personal library state, settings, and backup/sync capabilities documented in the README. The tree identifies these subsystems, but most Dart implementation was not sampled, so detailed call wiring is shown only where the documented workflow supports it.

Main entry points: [`lib/src/shell/main_shell.dart`](https://github.com/wep-56/ezvenera/blob/main/lib/src/shell/main_shell.dart) (Navigation shell), [`lib/src/plugin_runtime/plugin_runtime.dart`](https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/plugin_runtime.dart) (Plugin runtime), [`lib/src/pages/search_page.dart`](https://github.com/wep-56/ezvenera/blob/main/lib/src/pages/search_page.dart) (Catalog and search), [`lib/src/pages/comic_details_page.dart`](https://github.com/wep-56/ezvenera/blob/main/lib/src/pages/comic_details_page.dart) (Comic details)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["App experience"]
  node_bootstrap["App bootstrap<br/>[app_bootstrap.dart]"]
  node_app["App shell<br/>[app.dart]"]
  node_navigation["Navigation shell<br/>[main_shell.dart]"]
  node_source_pages["Source browsing<br/>[sources_page.dart]"]
  node_catalog_pages["Catalog and search<br/>[search_page.dart]"]
  node_comic_details["Comic details"]
end

subgraph group_sources["Plugin sources"]
  node_plugin_runtime["Plugin runtime"]
  node_source_parser["Source parser"]
  node_source_repository["Source repository"]
  node_source_index["Source index<br/>[source_index.dart]"]
  node_runtime_controller["Runtime controller"]
  node_js_engine["Plugin JS engine"]
  node_image_services["Plugin image services"]
end

subgraph group_reading["Reading and library"]
  node_reader_page["Online reader<br/>[reader_page.dart]"]
  node_reader_support["Reader support"]
  node_downloads["Downloads"]
  node_local_library["Local comics"]
  node_favorites_history["Favorites and history"]
end

subgraph group_account["Settings and backup"]
  node_settings["Settings and updates"]
  node_backup["Backup and restore"]
  node_webdav_sync["WebDAV sync"]
end

node_reader(("Comic reader"))
node_device_storage[("Device storage")]
node_webdav(("WebDAV service"))

node_reader -->|"launches"| node_bootstrap
node_bootstrap -->|"starts"| node_app
node_app -->|"presents"| node_navigation
node_navigation -->|"opens"| node_source_pages
node_navigation -->|"opens"| node_catalog_pages
node_catalog_pages -->|"selects comic"| node_comic_details
node_source_pages -->|"uses sources"| node_plugin_runtime
node_catalog_pages -->|"searches"| node_plugin_runtime
node_comic_details -->|"loads details"| node_plugin_runtime
node_plugin_runtime -->|"accesses sources"| node_source_repository
node_source_repository -->|"parses plugins"| node_source_parser
node_source_repository -->|"indexes sources"| node_source_index
node_plugin_runtime -->|"dispatches calls"| node_runtime_controller
node_runtime_controller -->|"executes plugin"| node_js_engine
node_comic_details -->|"opens chapter"| node_reader_page
node_reader_page -->|"loads pages"| node_plugin_runtime
node_reader_page -->|"uses cache"| node_reader_support
node_plugin_runtime -->|"loads images"| node_image_services
node_navigation -->|"opens downloads"| node_downloads
node_downloads -->|"stores files"| node_device_storage
node_navigation -->|"opens local comics"| node_local_library
node_local_library -->|"reads comics"| node_device_storage
node_navigation -->|"opens library"| node_favorites_history
node_favorites_history -->|"persists state"| node_device_storage
node_navigation -->|"opens settings"| node_settings
node_navigation -->|"starts backup"| node_backup
node_backup -->|"reads and writes"| node_device_storage
node_backup -->|"syncs backups"| node_webdav_sync
node_webdav_sync -.->|"uploads and restores"| node_webdav

click node_bootstrap "https://github.com/wep-56/ezvenera/blob/main/lib/src/bootstrap/app_bootstrap.dart"
click node_app "https://github.com/wep-56/ezvenera/blob/main/lib/src/app.dart"
click node_navigation "https://github.com/wep-56/ezvenera/blob/main/lib/src/shell/main_shell.dart"
click node_source_pages "https://github.com/wep-56/ezvenera/blob/main/lib/src/pages/sources_page.dart"
click node_catalog_pages "https://github.com/wep-56/ezvenera/blob/main/lib/src/pages/search_page.dart"
click node_comic_details "https://github.com/wep-56/ezvenera/blob/main/lib/src/pages/comic_details_page.dart"
click node_plugin_runtime "https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/plugin_runtime.dart"
click node_source_parser "https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/parser/plugin_source_parser.dart"
click node_source_repository "https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/repository/plugin_source_repository.dart"
click node_source_index "https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/repository/source_index.dart"
click node_runtime_controller "https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/plugin_runtime_controller.dart"
click node_js_engine "https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/engine/plugin_js_engine.dart"
click node_image_services "https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/services/plugin_image_loader.dart"
click node_reader_page "https://github.com/wep-56/ezvenera/blob/main/lib/src/pages/reader_page.dart"
click node_reader_support "https://github.com/wep-56/ezvenera/blob/main/lib/src/reader/reader_image_cache.dart"
click node_downloads "https://github.com/wep-56/ezvenera/blob/main/lib/src/downloads/download_controller.dart"
click node_local_library "https://github.com/wep-56/ezvenera/blob/main/lib/src/local_library/local_library_controller.dart"
click node_favorites_history "https://github.com/wep-56/ezvenera/blob/main/lib/src/library/favorite_controller.dart"
click node_settings "https://github.com/wep-56/ezvenera/blob/main/lib/src/settings/settings_controller.dart"
click node_backup "https://github.com/wep-56/ezvenera/blob/main/lib/src/backup/backup_service.dart"
click node_webdav_sync "https://github.com/wep-56/ezvenera/blob/main/lib/src/backup/webdav_auto_sync.dart"

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_bootstrap,node_app,node_navigation,node_source_pages,node_catalog_pages,node_comic_details toneBlue
class node_plugin_runtime,node_source_parser,node_source_repository,node_source_index,node_runtime_controller,node_js_engine,node_image_services,node_device_storage toneAmber
class node_reader_page,node_reader_support,node_downloads,node_local_library,node_favorites_history toneMint
class node_settings,node_backup,node_webdav_sync toneRose
class node_reader,node_webdav toneIndigo
```

## Components

### App experience

- [App bootstrap](https://github.com/wep-56/ezvenera/blob/main/lib/src/bootstrap/app_bootstrap.dart): `lib/src/bootstrap/app_bootstrap.dart`
- [App shell](https://github.com/wep-56/ezvenera/blob/main/lib/src/app.dart): `lib/src/app.dart`
- [Navigation shell](https://github.com/wep-56/ezvenera/blob/main/lib/src/shell/main_shell.dart): `lib/src/shell/main_shell.dart`
- [Source browsing](https://github.com/wep-56/ezvenera/blob/main/lib/src/pages/sources_page.dart): `lib/src/pages/sources_page.dart`
- [Catalog and search](https://github.com/wep-56/ezvenera/blob/main/lib/src/pages/search_page.dart): `lib/src/pages/search_page.dart`
- [Comic details](https://github.com/wep-56/ezvenera/blob/main/lib/src/pages/comic_details_page.dart): `lib/src/pages/comic_details_page.dart`

### Plugin sources

- [Plugin runtime](https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/plugin_runtime.dart): `lib/src/plugin_runtime/plugin_runtime.dart`
- [Source parser](https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/parser/plugin_source_parser.dart): `lib/src/plugin_runtime/parser/plugin_source_parser.dart`
- [Source repository](https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/repository/plugin_source_repository.dart): `lib/src/plugin_runtime/repository/plugin_source_repository.dart`
- [Source index](https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/repository/source_index.dart): `lib/src/plugin_runtime/repository/source_index.dart`
- [Runtime controller](https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/plugin_runtime_controller.dart): `lib/src/plugin_runtime/plugin_runtime_controller.dart`
- [Plugin JS engine](https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/engine/plugin_js_engine.dart): `lib/src/plugin_runtime/engine/plugin_js_engine.dart`
- [Plugin image services](https://github.com/wep-56/ezvenera/blob/main/lib/src/plugin_runtime/services/plugin_image_loader.dart): `lib/src/plugin_runtime/services/plugin_image_loader.dart`

### Reading and library

- [Online reader](https://github.com/wep-56/ezvenera/blob/main/lib/src/pages/reader_page.dart): `lib/src/pages/reader_page.dart`
- [Reader support](https://github.com/wep-56/ezvenera/blob/main/lib/src/reader/reader_image_cache.dart): `lib/src/reader/reader_image_cache.dart`
- [Downloads](https://github.com/wep-56/ezvenera/blob/main/lib/src/downloads/download_controller.dart): `lib/src/downloads/download_controller.dart`
- [Local comics](https://github.com/wep-56/ezvenera/blob/main/lib/src/local_library/local_library_controller.dart): `lib/src/local_library/local_library_controller.dart`
- [Favorites and history](https://github.com/wep-56/ezvenera/blob/main/lib/src/library/favorite_controller.dart): `lib/src/library/favorite_controller.dart`

### Settings and backup

- [Settings and updates](https://github.com/wep-56/ezvenera/blob/main/lib/src/settings/settings_controller.dart): `lib/src/settings/settings_controller.dart`
- [Backup and restore](https://github.com/wep-56/ezvenera/blob/main/lib/src/backup/backup_service.dart): `lib/src/backup/backup_service.dart`
- [WebDAV sync](https://github.com/wep-56/ezvenera/blob/main/lib/src/backup/webdav_auto_sync.dart): `lib/src/backup/webdav_auto_sync.dart`

### Other components

- **Comic reader**
- **Device storage**
- **WebDAV service**

## Connections

- Comic reader → App bootstrap: launches
- App bootstrap → App shell: starts
- App shell → Navigation shell: presents
- Navigation shell → Source browsing: opens
- Navigation shell → Catalog and search: opens
- Catalog and search → Comic details: selects comic
- Source browsing → Plugin runtime: uses sources
- Catalog and search → Plugin runtime: searches
- Comic details → Plugin runtime: loads details
- Plugin runtime → Source repository: accesses sources
- Source repository → Source parser: parses plugins
- Source repository → Source index: indexes sources
- Plugin runtime → Runtime controller: dispatches calls
- Runtime controller → Plugin JS engine: executes plugin
- Comic details → Online reader: opens chapter
- Online reader → Plugin runtime: loads pages
- Online reader → Reader support: uses cache
- Plugin runtime → Plugin image services: loads images
- Navigation shell → Downloads: opens downloads
- Downloads → Device storage: stores files
- Navigation shell → Local comics: opens local comics
- Local comics → Device storage: reads comics
- Navigation shell → Favorites and history: opens library
- Favorites and history → Device storage: persists state
- Navigation shell → Settings and updates: opens settings
- Navigation shell → Backup and restore: starts backup
- Backup and restore → Device storage: reads and writes
- Backup and restore → WebDAV sync: syncs backups
- WebDAV sync → WebDAV service: uploads and restores
