# bible-translation-tools/biel-mobile-app architecture

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

- Interactive diagram: https://gitdiagram.com/bible-translation-tools/biel-mobile-app
- Repository: https://github.com/bible-translation-tools/biel-mobile-app

## Overview

BIEL is an Expo mobile app for browsing multilingual Bible catalogs, reading and listening to scripture, and keeping text/audio available offline. The evidenced entry workflow starts on the language screen, which loads a language list and routes a selection to the books screen; the tree indicates further reading, downloads-library, and playback capabilities. Download hooks and services appear to manage acquisition, while SQLite and document-directory files provide persistent catalog/download state. Source excerpts are limited, so links among unsampled routes and domain services are intentionally omitted.

Main entry points: [`src/app/index.tsx`](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/app/index.tsx) (Language home), [`src/services/book-download-runner.ts`](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/services/book-download-runner.ts) (Book download runner), [`src/app/books.tsx`](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/app/books.tsx) (Books screen), [`src/api/graphql/client.ts`](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/api/graphql/client.ts) (GraphQL client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["App experience"]
  node_home["Language home<br/>[index.tsx]"]
  node_books_route["Books screen<br/>[books.tsx]"]
  node_read_route["Reading screen<br/>[read.tsx]"]
  node_downloads_route["Downloads screen"]
  node_language_list["Language list<br/>[language-list.tsx]"]
  node_books_list["Books and chapters<br/>[book-list.tsx]"]
end

subgraph group_catalog["Scripture catalog"]
  node_language_hook["Language loading<br/>[use-languages.ts]"]
  node_books_hook["Book chapters"]
  node_graphql["GraphQL client<br/>[client.ts]"]
  node_api_service["Content services<br/>[content-fetch.ts]"]
end

subgraph group_content["Reading and playback"]
  node_reading_ui["Reading interface"]
  node_player_controls["Audio controls"]
  node_playback["Track playback"]
end

subgraph group_downloads["Offline downloads"]
  node_download_hooks["Download workflows"]
  node_download_runner["Book download runner"]
  node_offline_text["Offline text service<br/>[offline-text.ts]"]
  node_offline_audio["Offline audio service<br/>[offline-audio.ts]"]
end

subgraph group_persistence["Local persistence"]
  node_sqlite[("Download catalog<br/>[repository.ts]")]
  node_files[("Offline content files<br/>[offline-storage.ts]")]
end

node_reader(("App user"))
node_api_service_external{{"Bible content API"}}
node_track_player{{"Track Player"}}

node_reader -->|"opens app"| node_home
node_home -->|"renders"| node_language_list
node_home -->|"loads languages"| node_language_hook
node_home -->|"routes selection"| node_books_route
node_language_hook -->|"requests catalog"| node_graphql
node_graphql -->|"sends query"| node_api_service_external
node_reader -->|"chooses book"| node_books_route
node_books_route -->|"renders"| node_books_list
node_books_route -->|"loads chapters"| node_books_hook
node_books_hook -->|"requests data"| node_graphql
node_reader -->|"opens reading"| node_read_route
node_read_route -->|"renders"| node_reading_ui
node_reader -->|"opens downloads"| node_downloads_route
node_downloads_route -->|"manages downloads"| node_download_hooks
node_download_hooks -->|"starts tasks"| node_download_runner
node_download_runner -->|"fetches scripture"| node_offline_text
node_download_runner -->|"fetches audio"| node_offline_audio
node_offline_text -->|"writes text files"| node_files
node_offline_audio -->|"writes audio files"| node_files
node_download_runner -->|"records downloads"| node_sqlite
node_reader -->|"controls playback"| node_player_controls
node_player_controls -->|"dispatches controls"| node_playback
node_playback -->|"controls tracks"| node_track_player

click node_home "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/app/index.tsx"
click node_books_route "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/app/books.tsx"
click node_read_route "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/app/read.tsx"
click node_downloads_route "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/app/downloads-library.tsx"
click node_language_list "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/components/home/language-list.tsx"
click node_books_list "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/components/books/book-list.tsx"
click node_reading_ui "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/components/reading/reading-chapter-list.tsx"
click node_player_controls "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/components/reading/media-player-controls.tsx"
click node_language_hook "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/hooks/use-languages.ts"
click node_books_hook "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/hooks/use-book-chapters.ts"
click node_graphql "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/api/graphql/client.ts"
click node_api_service "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/api/services/content-fetch.ts"
click node_download_hooks "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/hooks/use-content-download.ts"
click node_download_runner "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/services/book-download-runner.ts"
click node_offline_text "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/api/services/offline-text.ts"
click node_offline_audio "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/api/services/offline-audio.ts"
click node_playback "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/services/track-player/chapter-playback.ts"
click node_sqlite "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/db/repository.ts"
click node_files "https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/constants/offline-storage.ts"

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_home,node_books_route,node_read_route,node_downloads_route,node_language_list,node_books_list,node_reader toneBlue
class node_language_hook,node_books_hook,node_graphql,node_api_service toneAmber
class node_reading_ui,node_player_controls,node_playback,node_api_service_external toneMint
class node_download_hooks,node_download_runner,node_offline_text,node_offline_audio toneRose
class node_sqlite,node_files,node_track_player toneIndigo
```

## Components

### App experience

- [Language home](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/app/index.tsx): `src/app/index.tsx`
- [Books screen](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/app/books.tsx): `src/app/books.tsx`
- [Reading screen](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/app/read.tsx): `src/app/read.tsx`
- [Downloads screen](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/app/downloads-library.tsx): `src/app/downloads-library.tsx`
- [Language list](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/components/home/language-list.tsx): `src/components/home/language-list.tsx`
- [Books and chapters](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/components/books/book-list.tsx): `src/components/books/book-list.tsx`

### Scripture catalog

- [Language loading](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/hooks/use-languages.ts): `src/hooks/use-languages.ts`
- [Book chapters](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/hooks/use-book-chapters.ts): `src/hooks/use-book-chapters.ts`
- [GraphQL client](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/api/graphql/client.ts): `src/api/graphql/client.ts`
- [Content services](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/api/services/content-fetch.ts): `src/api/services/content-fetch.ts`

### Reading and playback

- [Reading interface](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/components/reading/reading-chapter-list.tsx): `src/components/reading/reading-chapter-list.tsx`
- [Audio controls](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/components/reading/media-player-controls.tsx): `src/components/reading/media-player-controls.tsx`
- [Track playback](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/services/track-player/chapter-playback.ts): `src/services/track-player/chapter-playback.ts`

### Offline downloads

- [Download workflows](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/hooks/use-content-download.ts): `src/hooks/use-content-download.ts`
- [Book download runner](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/services/book-download-runner.ts): `src/services/book-download-runner.ts`
- [Offline text service](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/api/services/offline-text.ts): `src/api/services/offline-text.ts`
- [Offline audio service](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/api/services/offline-audio.ts): `src/api/services/offline-audio.ts`

### Local persistence

- [Download catalog](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/db/repository.ts): `src/db/repository.ts`
- [Offline content files](https://github.com/bible-translation-tools/biel-mobile-app/blob/main/src/constants/offline-storage.ts): `src/constants/offline-storage.ts`

### Other components

- **App user**
- **Bible content API**
- **Track Player**

## Connections

- App user → Language home: opens app
- Language home → Language list: renders
- Language home → Language loading: loads languages
- Language home → Books screen: routes selection
- Language loading → GraphQL client: requests catalog
- GraphQL client → Bible content API: sends query
- App user → Books screen: chooses book
- Books screen → Books and chapters: renders
- Books screen → Book chapters: loads chapters
- Book chapters → GraphQL client: requests data
- App user → Reading screen: opens reading
- Reading screen → Reading interface: renders
- App user → Downloads screen: opens downloads
- Downloads screen → Download workflows: manages downloads
- Download workflows → Book download runner: starts tasks
- Book download runner → Offline text service: fetches scripture
- Book download runner → Offline audio service: fetches audio
- Offline text service → Offline content files: writes text files
- Offline audio service → Offline content files: writes audio files
- Book download runner → Download catalog: records downloads
- App user → Audio controls: controls playback
- Audio controls → Track playback: dispatches controls
- Track playback → Track Player: controls tracks
