# bayang/jelu architecture

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

- Interactive diagram: https://gitdiagram.com/bayang/jelu
- Repository: https://github.com/bayang/jelu

## Overview

JELU is a self-hosted personal reading tracker: users manage books and reading activity through a Vue interface, which calls the backend API; services then apply domain logic and persist data. The product also supports reviews, metadata lookup, imports/exports, search, and multi-user access. The graph emphasizes relationships visible in the excerpts or README; some capabilities are included from documentation, but their internal wiring was not sampled, so those connections are omitted or marked unverified.

Main entry points: [`src/jelu-ui/src/services/DataService.ts`](https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/services/DataService.ts) (API client), [`src/jelu-ui/src/App.vue`](https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/App.vue) (JELU interface), [`src/jelu-ui/src/router.ts`](https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/router.ts) (Page routing), [`src/main/kotlin/io/github/bayang/jelu/service/BookService.kt`](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/BookService.kt) (Book service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Web client"]
  node_webapp["JELU interface<br/>[App.vue]"]
  node_navigation["Page routing<br/>[router.ts]"]
  node_clientdata["API client<br/>[DataService.ts]"]
  node_booksui["Book pages<br/>[BookDetail.vue]"]
  node_reviewsui["Review pages<br/>[ReviewList.vue]"]
  node_importui["Import screens<br/>[Imports.vue]"]
end

subgraph group_api["API and domain"]
  node_api["HTTP API<br/>[BooksController.kt]"]
  node_reviewapi["Review API"]
end

subgraph group_library["Library features"]
  node_booklogic["Book service<br/>[BookService.kt]"]
  node_reviewlogic["Review service<br/>[ReviewService.kt]"]
  node_importlogic["CSV import"]
  node_metadata["Metadata lookup"]
  node_exportlogic["CSV export"]
  node_metadataproviders["Metadata providers"]
end

subgraph group_data["Persistence and search"]
  node_bookstore[("Book repository<br/>[BookRepository.kt]")]
  node_reviewstore[("Review repository")]
  node_searchindex["Search indexing"]
  node_lucene["Lucene tools<br/>[LuceneHelper.kt]"]
  node_database[("SQLite data<br/>[BookTable.kt]")]
end

node_reader(("Reader"))
node_external(("Metadata sources"))
node_csvfile["CSV files"]

node_reader -->|"uses"| node_webapp
node_webapp -->|"routes through"| node_navigation
node_webapp -->|"uses"| node_clientdata
node_navigation -->|"routes to"| node_booksui
node_navigation -->|"routes to"| node_reviewsui
node_booksui -.->|"requests data"| node_clientdata
node_reviewsui -->|"requests data"| node_clientdata
node_clientdata -->|"calls API"| node_api
node_api -->|"delegates to"| node_booklogic
node_booklogic -->|"queries and updates"| node_bookstore
node_bookstore -.->|"persists"| node_database
node_clientdata -->|"calls reviews"| node_reviewapi
node_reviewapi -->|"delegates to"| node_reviewlogic
node_reviewlogic -->|"reads and writes"| node_reviewstore
node_reviewstore -.->|"persists"| node_database
node_reader -->|"starts import"| node_importui
node_importui -.->|"submits import"| node_importlogic
node_importlogic -->|"fetches metadata"| node_metadata
node_metadata -->|"dispatches to"| node_metadataproviders
node_metadataproviders -.->|"queries sources"| node_external
node_reader -.->|"requests export"| node_exportlogic
node_exportlogic -->|"writes CSV"| node_csvfile
node_booklogic -->|"updates index"| node_searchindex
node_searchindex -->|"loads books"| node_bookstore
node_searchindex -->|"writes index"| node_lucene

click node_webapp "https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/App.vue"
click node_navigation "https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/router.ts"
click node_clientdata "https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/services/DataService.ts"
click node_booksui "https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/components/BookDetail.vue"
click node_reviewsui "https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/components/ReviewList.vue"
click node_api "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/controllers/BooksController.kt"
click node_booklogic "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/BookService.kt"
click node_bookstore "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/dao/BookRepository.kt"
click node_reviewapi "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/controllers/ReviewsController.kt"
click node_reviewlogic "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/ReviewService.kt"
click node_reviewstore "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/dao/ReviewRepository.kt"
click node_importui "https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/components/Imports.vue"
click node_importlogic "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/imports/CsvImportService.kt"
click node_metadata "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/metadata/FetchMetadataService.kt"
click node_exportlogic "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/exports/CsvExportService.kt"
click node_searchindex "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/SearchIndexService.kt"
click node_lucene "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/search/LuceneHelper.kt"
click node_database "https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/dao/BookTable.kt"
click node_metadataproviders "https://github.com/bayang/jelu/tree/main/src/main/kotlin/io/github/bayang/jelu/service/metadata/providers"

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_webapp,node_navigation,node_clientdata,node_booksui,node_reviewsui,node_importui toneBlue
class node_api,node_reviewapi toneAmber
class node_booklogic,node_reviewlogic,node_importlogic,node_metadata,node_exportlogic,node_metadataproviders toneMint
class node_bookstore,node_reviewstore,node_searchindex,node_lucene,node_database toneRose
class node_reader,node_external,node_csvfile toneIndigo
```

## Components

### Web client

- [JELU interface](https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/App.vue): `src/jelu-ui/src/App.vue`
- [Page routing](https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/router.ts): `src/jelu-ui/src/router.ts`
- [API client](https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/services/DataService.ts): `src/jelu-ui/src/services/DataService.ts`
- [Book pages](https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/components/BookDetail.vue): `src/jelu-ui/src/components/BookDetail.vue`
- [Review pages](https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/components/ReviewList.vue): `src/jelu-ui/src/components/ReviewList.vue`
- [Import screens](https://github.com/bayang/jelu/blob/main/src/jelu-ui/src/components/Imports.vue): `src/jelu-ui/src/components/Imports.vue`

### API and domain

- [HTTP API](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/controllers/BooksController.kt): `src/main/kotlin/io/github/bayang/jelu/controllers/BooksController.kt`
- [Review API](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/controllers/ReviewsController.kt): `src/main/kotlin/io/github/bayang/jelu/controllers/ReviewsController.kt`

### Library features

- [Book service](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/BookService.kt): `src/main/kotlin/io/github/bayang/jelu/service/BookService.kt`
- [Review service](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/ReviewService.kt): `src/main/kotlin/io/github/bayang/jelu/service/ReviewService.kt`
- [CSV import](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/imports/CsvImportService.kt): `src/main/kotlin/io/github/bayang/jelu/service/imports/CsvImportService.kt`
- [Metadata lookup](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/metadata/FetchMetadataService.kt): `src/main/kotlin/io/github/bayang/jelu/service/metadata/FetchMetadataService.kt`
- [CSV export](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/exports/CsvExportService.kt): `src/main/kotlin/io/github/bayang/jelu/service/exports/CsvExportService.kt`
- [Metadata providers](https://github.com/bayang/jelu/tree/main/src/main/kotlin/io/github/bayang/jelu/service/metadata/providers): `src/main/kotlin/io/github/bayang/jelu/service/metadata/providers`

### Persistence and search

- [Book repository](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/dao/BookRepository.kt): `src/main/kotlin/io/github/bayang/jelu/dao/BookRepository.kt`
- [Review repository](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/dao/ReviewRepository.kt): `src/main/kotlin/io/github/bayang/jelu/dao/ReviewRepository.kt`
- [Search indexing](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/service/SearchIndexService.kt): `src/main/kotlin/io/github/bayang/jelu/service/SearchIndexService.kt`
- [Lucene tools](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/search/LuceneHelper.kt): `src/main/kotlin/io/github/bayang/jelu/search/LuceneHelper.kt`
- [SQLite data](https://github.com/bayang/jelu/blob/main/src/main/kotlin/io/github/bayang/jelu/dao/BookTable.kt): `src/main/kotlin/io/github/bayang/jelu/dao/BookTable.kt`

### Other components

- **Reader**
- **Metadata sources**
- **CSV files**

## Connections

- Reader → JELU interface: uses (evidence: `README.md`)
- JELU interface → Page routing: routes through (evidence: `src/jelu-ui/src/main.ts`)
- JELU interface → API client: uses (evidence: `src/jelu-ui/src/App.vue`)
- Page routing → Book pages: routes to (evidence: `src/jelu-ui/src/router.ts`)
- Page routing → Review pages: routes to (evidence: `src/jelu-ui/src/router.ts`)
- Book pages → API client: requests data
- Review pages → API client: requests data (evidence: `src/jelu-ui/src/components/ReviewList.vue`)
- API client → HTTP API: calls API (evidence: `src/jelu-ui/src/services/DataService.ts`)
- HTTP API → Book service: delegates to (evidence: `src/main/kotlin/io/github/bayang/jelu/controllers/BooksController.kt`)
- Book service → Book repository: queries and updates (evidence: `src/main/kotlin/io/github/bayang/jelu/service/BookService.kt`)
- Book repository → SQLite data: persists (evidence: `src/main/kotlin/io/github/bayang/jelu/dao/BookRepository.kt`)
- API client → Review API: calls reviews (evidence: `src/jelu-ui/src/services/DataService.ts`)
- Review API → Review service: delegates to (evidence: `src/main/kotlin/io/github/bayang/jelu/controllers/ReviewsController.kt`)
- Review service → Review repository: reads and writes (evidence: `src/main/kotlin/io/github/bayang/jelu/service/ReviewService.kt`)
- Review repository → SQLite data: persists
- Reader → Import screens: starts import (evidence: `README.md`)
- Import screens → CSV import: submits import
- CSV import → Metadata lookup: fetches metadata (evidence: `src/main/kotlin/io/github/bayang/jelu/service/imports/CsvImportService.kt`)
- Metadata lookup → Metadata providers: dispatches to (evidence: `src/main/kotlin/io/github/bayang/jelu/service/metadata/FetchMetadataService.kt`)
- Metadata providers → Metadata sources: queries sources
- Reader → CSV export: requests export
- CSV export → CSV files: writes CSV (evidence: `src/main/kotlin/io/github/bayang/jelu/service/exports/CsvExportService.kt`)
- Book service → Search indexing: updates index (evidence: `src/main/kotlin/io/github/bayang/jelu/service/BookService.kt`)
- Search indexing → Book repository: loads books (evidence: `src/main/kotlin/io/github/bayang/jelu/service/SearchIndexService.kt`)
- Search indexing → Lucene tools: writes index (evidence: `src/main/kotlin/io/github/bayang/jelu/service/SearchIndexService.kt`)
