# rh-id/a-jarwis architecture

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

- Interactive diagram: https://gitdiagram.com/rh-id/a-jarwis
- Repository: https://github.com/rh-id/a-jarwis

## Overview

Jarwis is an Android on-device AI utility. Users choose images and either detect/optionally select faces to blur, or choose neural-style themes; background work processes the images and saves results to the gallery. The app also downloads required models on demand, verifies them, and reports progress to the UI. The graph reflects documented workflows and sampled call sites; some worker, command, and UI implementations were not excerpted, so their documented links are marked unverified where needed.

Main entry points: [`ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/workmanager`](https://github.com/rh-id/a-jarwis/tree/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/workmanager) (Background workers), [`app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/HomeWorkflow.java`](https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/HomeWorkflow.java) (Home workflow), [`ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/ModelDownloader.java`](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/ModelDownloader.java) (Model downloader), [`ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/FaceEngine.java`](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/FaceEngine.java) (Face engine)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App UI and commands"]
  node_home["Home workflow<br/>[HomeWorkflow.java]"]
  node_face_select["Face selection"]
  node_theme_select["Theme selection"]
  node_blur_cmd["Face blur command"]
  node_st_cmd["Style command"]
  node_download_ui["Model download dialog"]
end

subgraph group_ml["ML processing"]
  node_face_engine["Face engine<br/>[FaceEngine.java]"]
  node_st_engine["Style engine<br/>[STEngine.java]"]
  node_workers["Background workers"]
  node_engine_instance["OpenCV model runtime"]
  node_st_processor["Style processor<br/>[STProcessor.java]"]
end

subgraph group_models["Model management"]
  node_catalog["Model catalog<br/>[ModelCatalog.java]"]
  node_model_types["Model definitions<br/>[ModelType.java]"]
  node_model_worker["Download worker"]
  node_downloader["Model downloader"]
  node_notifier["Download notifier"]
end

subgraph group_shared["Shared services"]
  node_file_helper["File and media helpers<br/>[FileHelper.java]"]
  node_settings[("Settings")]
end

node_user(("User"))
node_huggingface["Model repositories"]
node_gallery[("Device gallery")]

node_user -->|"selects images"| node_home
node_home -->|"invokes"| node_blur_cmd
node_home -->|"invokes"| node_st_cmd
node_home -.->|"routes to"| node_face_select
node_home -.->|"routes to"| node_theme_select
node_blur_cmd -.->|"enqueues blur"| node_face_engine
node_st_cmd -.->|"enqueues style"| node_st_engine
node_face_engine -->|"enqueues work"| node_workers
node_st_engine -->|"enqueues work"| node_workers
node_workers -.->|"runs detection"| node_face_engine
node_workers -.->|"runs styles"| node_st_engine
node_face_engine -->|"uses models"| node_engine_instance
node_st_engine -->|"gets processors"| node_engine_instance
node_engine_instance -->|"creates"| node_st_processor
node_engine_instance -->|"checks availability"| node_catalog
node_catalog -->|"maps types"| node_model_types
node_workers -.->|"saves results"| node_file_helper
node_workers -.->|"exports images"| node_gallery
node_user -.->|"requests feature"| node_download_ui
node_download_ui -->|"enqueues download"| node_model_worker
node_model_worker -->|"runs download"| node_downloader
node_downloader -.->|"downloads models"| node_huggingface
node_downloader -.->|"emits status"| node_notifier
node_model_worker -->|"reports failures"| node_notifier
node_download_ui -->|"observes progress"| node_notifier
node_downloader -.->|"installs models"| node_catalog
node_blur_cmd -.->|"stages image"| node_file_helper
node_workers -.->|"none"| node_settings

click node_home "https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/HomeWorkflow.java"
click node_face_select "https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/SelectFaceImagePage.java"
click node_theme_select "https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/SelectSTThemePage.java"
click node_blur_cmd "https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/provider/command/BlurFaceCommand.java"
click node_st_cmd "https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/provider/command/STApplyCommand.java"
click node_download_ui "https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/ModelDownloadDialog.java"
click node_face_engine "https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/FaceEngine.java"
click node_st_engine "https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/STEngine.java"
click node_workers "https://github.com/rh-id/a-jarwis/tree/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/workmanager"
click node_engine_instance "https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/MLEngineInstance.java"
click node_st_processor "https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/STProcessor.java"
click node_catalog "https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/model/ModelCatalog.java"
click node_model_types "https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/model/ModelType.java"
click node_model_worker "https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/workmanager/ModelDownloadWorker.java"
click node_downloader "https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/ModelDownloader.java"
click node_notifier "https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/notifier/ModelChangeNotifier.java"
click node_file_helper "https://github.com/rh-id/a-jarwis/blob/master/base/src/main/java/m/co/rh/id/a_jarwis/base/provider/component/helper/FileHelper.java"
click node_settings "https://github.com/rh-id/a-jarwis/blob/master/settings/src/main/java/m/co/rh/id/a_jarwis/settings/provider/component/SettingsSharedPreferences.java"

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_face_select,node_theme_select,node_blur_cmd,node_st_cmd,node_download_ui,node_user toneBlue
class node_face_engine,node_st_engine,node_workers,node_engine_instance,node_st_processor,node_gallery toneAmber
class node_catalog,node_model_types,node_model_worker,node_downloader,node_notifier toneMint
class node_file_helper,node_settings toneRose
class node_huggingface toneIndigo
```

## Components

### App UI and commands

- [Home workflow](https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/HomeWorkflow.java): `app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/HomeWorkflow.java`
- [Face selection](https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/SelectFaceImagePage.java): `app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/SelectFaceImagePage.java`
- [Theme selection](https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/SelectSTThemePage.java): `app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/SelectSTThemePage.java`
- [Face blur command](https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/provider/command/BlurFaceCommand.java): `app/src/main/java/m/co/rh/id/a_jarwis/app/provider/command/BlurFaceCommand.java`
- [Style command](https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/provider/command/STApplyCommand.java): `app/src/main/java/m/co/rh/id/a_jarwis/app/provider/command/STApplyCommand.java`
- [Model download dialog](https://github.com/rh-id/a-jarwis/blob/master/app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/ModelDownloadDialog.java): `app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/ModelDownloadDialog.java`

### ML processing

- [Face engine](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/FaceEngine.java): `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/FaceEngine.java`
- [Style engine](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/STEngine.java): `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/STEngine.java`
- [Background workers](https://github.com/rh-id/a-jarwis/tree/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/workmanager): `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/workmanager`
- [OpenCV model runtime](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/MLEngineInstance.java): `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/MLEngineInstance.java`
- [Style processor](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/STProcessor.java): `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/STProcessor.java`

### Model management

- [Model catalog](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/model/ModelCatalog.java): `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/model/ModelCatalog.java`
- [Model definitions](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/model/ModelType.java): `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/model/ModelType.java`
- [Download worker](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/workmanager/ModelDownloadWorker.java): `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/workmanager/ModelDownloadWorker.java`
- [Model downloader](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/ModelDownloader.java): `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/ModelDownloader.java`
- [Download notifier](https://github.com/rh-id/a-jarwis/blob/master/ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/notifier/ModelChangeNotifier.java): `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/notifier/ModelChangeNotifier.java`

### Shared services

- [File and media helpers](https://github.com/rh-id/a-jarwis/blob/master/base/src/main/java/m/co/rh/id/a_jarwis/base/provider/component/helper/FileHelper.java): `base/src/main/java/m/co/rh/id/a_jarwis/base/provider/component/helper/FileHelper.java`
- [Settings](https://github.com/rh-id/a-jarwis/blob/master/settings/src/main/java/m/co/rh/id/a_jarwis/settings/provider/component/SettingsSharedPreferences.java): `settings/src/main/java/m/co/rh/id/a_jarwis/settings/provider/component/SettingsSharedPreferences.java`

### Other components

- **User**
- **Model repositories**
- **Device gallery**

## Connections

- User → Home workflow: selects images
- Home workflow → Face blur command: invokes (evidence: `app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/HomeWorkflow.java`)
- Home workflow → Style command: invokes (evidence: `app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/HomeWorkflow.java`)
- Home workflow → Face selection: routes to
- Home workflow → Theme selection: routes to
- Face blur command → Face engine: enqueues blur (evidence: `app/src/main/java/m/co/rh/id/a_jarwis/app/provider/command/BlurFaceCommand.java`)
- Style command → Style engine: enqueues style
- Face engine → Background workers: enqueues work (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/FaceEngine.java`)
- Style engine → Background workers: enqueues work (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/STEngine.java`)
- Background workers → Face engine: runs detection (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/FaceEngine.java`)
- Background workers → Style engine: runs styles (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/STEngine.java`)
- Face engine → OpenCV model runtime: uses models (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/FaceEngine.java`)
- Style engine → OpenCV model runtime: gets processors (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/STEngine.java`)
- OpenCV model runtime → Style processor: creates (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/MLEngineInstance.java`)
- OpenCV model runtime → Model catalog: checks availability (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/MLEngineInstance.java`)
- Model catalog → Model definitions: maps types (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/model/ModelCatalog.java`)
- Background workers → File and media helpers: saves results
- Background workers → Device gallery: exports images
- User → Model download dialog: requests feature
- Model download dialog → Download worker: enqueues download (evidence: `app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/ModelDownloadDialog.java`)
- Download worker → Model downloader: runs download (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/workmanager/ModelDownloadWorker.java`)
- Model downloader → Model repositories: downloads models
- Model downloader → Download notifier: emits status (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/ModelDownloader.java`)
- Download worker → Download notifier: reports failures (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/workmanager/ModelDownloadWorker.java`)
- Model download dialog → Download notifier: observes progress (evidence: `app/src/main/java/m/co/rh/id/a_jarwis/app/ui/page/common/ModelDownloadDialog.java`)
- Model downloader → Model catalog: installs models (evidence: `ml-engine/src/main/java/m/co/rh/id/a_jarwis/ml_engine/provider/component/ModelDownloader.java`)
- Face blur command → File and media helpers: stages image (evidence: `app/src/main/java/m/co/rh/id/a_jarwis/app/provider/command/BlurFaceCommand.java`)
- Background workers → Settings: none
