# ethran/notable architecture

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

## Overview

Notable is an Android handwriting notebook app, aimed especially at Onyx BOOX devices. Users organize notebooks and folders, open pages, write or edit on a scrollable canvas, then import or export documents; an additional sync subsystem coordinates notebook data with WebDAV. The tree and README establish these product capabilities, while sampled source confirms key responsibilities in page caching, canvas refresh, import/export, and sync. Some UI-to-service wiring is not shown in the excerpts, so uncertain links are omitted.

Main entry points: [`app/src/main/java/com/ethran/notable/data/AppRepository.kt`](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/data/AppRepository.kt) (App repository), [`app/src/main/java/com/ethran/notable/editor/EditorView.kt`](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/EditorView.kt) (Editor view), [`app/src/main/java/com/ethran/notable/io/ExportEngine.kt`](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/io/ExportEngine.kt) (Export engine), [`app/src/main/java/com/ethran/notable/editor/canvas/DrawCanvas.kt`](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/canvas/DrawCanvas.kt) (Canvas input)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App and library"]
  node_activity["App entry<br/>[MainActivity.kt]"]
  node_home["Notebook library<br/>[HomeView.kt]"]
  node_libraryvm["Library state"]
end

subgraph group_editor["Writing and editing"]
  node_editorview["Editor view<br/>[EditorView.kt]"]
  node_editorm["Editor state<br/>[EditorViewModel.kt]"]
  node_gestures["Gesture handling"]
  node_canvas["Canvas input<br/>[DrawCanvas.kt]"]
  node_refresh["Canvas refresh"]
  node_renderer["Stroke rendering<br/>[StrokeRenderer.kt]"]
  node_images["Image handling<br/>[ImageHandler.kt]"]
end

subgraph group_data["Notebook data"]
  node_pagedata["Page cache<br/>[PageDataManager.kt]"]
  node_repository["App repository<br/>[AppRepository.kt]"]
  node_database[("Notebook database<br/>[Db.kt]")]
  node_settings["App settings<br/>[AppSettings.kt]"]
end

subgraph group_files["Import and export"]
  node_import["Import engine<br/>[ImportEngine.kt]"]
  node_export["Export engine<br/>[ExportEngine.kt]"]
  node_content["Page renderer"]
end

subgraph group_sync["Synchronization"]
  node_orchestrator["Sync orchestration"]
  node_reconcile["Notebook reconciliation"]
  node_notebooksync["Notebook transfer"]
end

node_user(("User"))
node_fileuser(("Selected files"))
node_webdav[("WebDAV server")]

node_user -->|"opens"| node_activity
node_activity -->|"shows"| node_home
node_home -->|"requests library"| node_libraryvm
node_user -->|"edits pages"| node_editorview
node_editorview -->|"uses state"| node_editorm
node_editorview -->|"receives gestures"| node_gestures
node_editorview -->|"hosts input"| node_canvas
node_canvas -->|"renders strokes"| node_renderer
node_canvas -->|"refreshes surface"| node_refresh
node_images -->|"draws image"| node_canvas
node_pagedata -->|"loads and saves"| node_repository
node_repository -->|"reads and writes"| node_database
node_user -->|"imports"| node_import
node_fileuser -->|"provides URI"| node_import
node_import -->|"creates notebook data"| node_repository
node_user -->|"exports"| node_export
node_export -->|"renders pages"| node_content
node_export -->|"reads notebook data"| node_repository
node_export -->|"writes output"| node_fileuser
node_user -->|"requests sync"| node_orchestrator
node_orchestrator -->|"reconciles notebooks"| node_reconcile
node_reconcile -->|"uploads or downloads"| node_notebooksync
node_notebooksync -->|"transfers files"| node_webdav
node_orchestrator -->|"uses local data"| node_repository

click node_activity "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/MainActivity.kt"
click node_home "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/ui/views/HomeView.kt"
click node_libraryvm "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/ui/viewmodels/LibraryViewModel.kt"
click node_editorview "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/EditorView.kt"
click node_editorm "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/EditorViewModel.kt"
click node_gestures "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/gestures/EditorGestureReceiver.kt"
click node_canvas "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/canvas/DrawCanvas.kt"
click node_refresh "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/canvas/CanvasRefreshManager.kt"
click node_renderer "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/drawing/StrokeRenderer.kt"
click node_images "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/utils/ImageHandler.kt"
click node_pagedata "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/data/PageDataManager.kt"
click node_repository "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/data/AppRepository.kt"
click node_database "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/data/db/Db.kt"
click node_settings "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/data/datastore/AppSettings.kt"
click node_import "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/io/ImportEngine.kt"
click node_export "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/io/ExportEngine.kt"
click node_content "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/io/PageContentRenderer.kt"
click node_orchestrator "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/sync/SyncOrchestrator.kt"
click node_reconcile "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/sync/NotebookReconciliationService.kt"
click node_notebooksync "https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/sync/NotebookSyncService.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_activity,node_home,node_libraryvm,node_user toneBlue
class node_editorview,node_editorm,node_gestures,node_canvas,node_refresh,node_renderer,node_images,node_webdav toneAmber
class node_pagedata,node_repository,node_database,node_settings toneMint
class node_import,node_export,node_content toneRose
class node_orchestrator,node_reconcile,node_notebooksync,node_fileuser toneIndigo
```

## Components

### App and library

- [App entry](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/MainActivity.kt): `app/src/main/java/com/ethran/notable/MainActivity.kt`
- [Notebook library](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/ui/views/HomeView.kt): `app/src/main/java/com/ethran/notable/ui/views/HomeView.kt`
- [Library state](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/ui/viewmodels/LibraryViewModel.kt): `app/src/main/java/com/ethran/notable/ui/viewmodels/LibraryViewModel.kt`

### Writing and editing

- [Editor view](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/EditorView.kt): `app/src/main/java/com/ethran/notable/editor/EditorView.kt`
- [Editor state](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/EditorViewModel.kt): `app/src/main/java/com/ethran/notable/editor/EditorViewModel.kt`
- [Gesture handling](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/gestures/EditorGestureReceiver.kt): `app/src/main/java/com/ethran/notable/gestures/EditorGestureReceiver.kt`
- [Canvas input](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/canvas/DrawCanvas.kt): `app/src/main/java/com/ethran/notable/editor/canvas/DrawCanvas.kt`
- [Canvas refresh](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/canvas/CanvasRefreshManager.kt): `app/src/main/java/com/ethran/notable/editor/canvas/CanvasRefreshManager.kt`
- [Stroke rendering](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/drawing/StrokeRenderer.kt): `app/src/main/java/com/ethran/notable/editor/drawing/StrokeRenderer.kt`
- [Image handling](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/editor/utils/ImageHandler.kt): `app/src/main/java/com/ethran/notable/editor/utils/ImageHandler.kt`

### Notebook data

- [Page cache](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/data/PageDataManager.kt): `app/src/main/java/com/ethran/notable/data/PageDataManager.kt`
- [App repository](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/data/AppRepository.kt): `app/src/main/java/com/ethran/notable/data/AppRepository.kt`
- [Notebook database](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/data/db/Db.kt): `app/src/main/java/com/ethran/notable/data/db/Db.kt`
- [App settings](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/data/datastore/AppSettings.kt): `app/src/main/java/com/ethran/notable/data/datastore/AppSettings.kt`

### Import and export

- [Import engine](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/io/ImportEngine.kt): `app/src/main/java/com/ethran/notable/io/ImportEngine.kt`
- [Export engine](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/io/ExportEngine.kt): `app/src/main/java/com/ethran/notable/io/ExportEngine.kt`
- [Page renderer](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/io/PageContentRenderer.kt): `app/src/main/java/com/ethran/notable/io/PageContentRenderer.kt`

### Synchronization

- [Sync orchestration](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/sync/SyncOrchestrator.kt): `app/src/main/java/com/ethran/notable/sync/SyncOrchestrator.kt`
- [Notebook reconciliation](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/sync/NotebookReconciliationService.kt): `app/src/main/java/com/ethran/notable/sync/NotebookReconciliationService.kt`
- [Notebook transfer](https://github.com/ethran/notable/blob/main/app/src/main/java/com/ethran/notable/sync/NotebookSyncService.kt): `app/src/main/java/com/ethran/notable/sync/NotebookSyncService.kt`

### Other components

- **User**
- **Selected files**
- **WebDAV server**

## Connections

- User → App entry: opens
- App entry → Notebook library: shows
- Notebook library → Library state: requests library
- User → Editor view: edits pages
- Editor view → Editor state: uses state
- Editor view → Gesture handling: receives gestures
- Editor view → Canvas input: hosts input
- Canvas input → Stroke rendering: renders strokes
- Canvas input → Canvas refresh: refreshes surface
- Image handling → Canvas input: draws image
- Page cache → App repository: loads and saves
- App repository → Notebook database: reads and writes
- User → Import engine: imports
- Selected files → Import engine: provides URI
- Import engine → App repository: creates notebook data
- User → Export engine: exports
- Export engine → Page renderer: renders pages
- Export engine → App repository: reads notebook data
- Export engine → Selected files: writes output
- User → Sync orchestration: requests sync
- Sync orchestration → Notebook reconciliation: reconciles notebooks
- Notebook reconciliation → Notebook transfer: uploads or downloads
- Notebook transfer → WebDAV server: transfers files
- Sync orchestration → App repository: uses local data
