# jegly/box architecture

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

- Interactive diagram: https://gitdiagram.com/jegly/box
- Repository: https://github.com/jegly/box

## Overview

Box is a security-focused Android app for running on-device AI models and task-specific AI experiences. The main workflow is user launch and authentication, model discovery/import or download, task selection, local inference, and presentation of results; chat history and settings persist locally. The README also describes image generation, speech, vision, document analysis, agent skills, and accelerated inference. Several of those implementations are not sampled, so their components are included at tree-supported paths, but their connections are left unverified rather than inferred.

Main entry points: [`Android/src/app/src/main/java/com/box/gallery/MainActivity.kt`](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/box/gallery/MainActivity.kt) (App entry), [`Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/modelmanager/ModelManagerViewModel.kt`](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/modelmanager/ModelManagerViewModel.kt) (Model manager), [`Android/src/app/src/main/java/com/google/ai/edge/gallery/engine/LlamaCppEngine.kt`](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/engine/LlamaCppEngine.kt) (LLM inference), [`Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/SkillManagerBottomSheet.kt`](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/SkillManagerBottomSheet.kt) (Skill manager UI)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App and security"]
  node_activity["App entry<br/>[MainActivity.kt]"]
  node_lock["Biometric lock<br/>[AppLockManager.kt]"]
  node_encryption["DB encryption"]
  node_audit["Security audit"]
  node_navigation["App navigation<br/>[GalleryNavGraph.kt]"]
end

subgraph group_models["Models and inference"]
  node_modelmanager["Model manager"]
  node_modelcatalog["Model catalog<br/>[Model.kt]"]
  node_modeldownload["Model downloads"]
  node_downloadworker["Download worker<br/>[DownloadWorker.kt]"]
  node_llmengine["LLM inference<br/>[LlamaCppEngine.kt]"]
  node_smollm["GGUF runtime<br/>[SmolLM.kt]"]
end

subgraph group_experiences["AI experiences"]
  node_chat["LLM chat<br/>[LlmChatScreen.kt]"]
  node_singleturn["Single-turn prompts"]
  node_imagegen["Image generation<br/>[ImageGenScreen.kt]"]
  node_whisper["Speech recognition<br/>[WhisperScreen.kt]"]
  node_customtasks["Custom tasks"]
end

subgraph group_persistence["Local persistence"]
  node_history["Chat history<br/>[ChatRepository.kt]"]
  node_chatdb[("Chat database<br/>[BoxChatDatabase.kt]")]
  node_settings[("App settings")]
end

subgraph group_skills["Agent skills"]
  node_skillmanager["Skill management"]
  node_skillui["Skill manager UI"]
  node_agenttools["Agent tools<br/>[AgentTools.kt]"]
  node_agentchat["Agent chat<br/>[AgentChatScreen.kt]"]
end

node_user(("User"))

node_user -->|"launches"| node_activity
node_activity -->|"initializes"| node_lock
node_activity -->|"initializes"| node_encryption
node_lock -->|"logs events"| node_audit
node_activity -.->|"hosts"| node_navigation
node_activity -->|"uses"| node_modelmanager
node_modelmanager -->|"loads models"| node_modelcatalog
node_modelmanager -->|"requests downloads"| node_modeldownload
node_modeldownload -->|"enqueues work"| node_downloadworker
node_llmengine -->|"delegates inference"| node_smollm
node_chat -.->|"runs model"| node_llmengine
node_singleturn -.->|"runs model"| node_llmengine
node_user -.->|"selects or imports"| node_modelmanager
node_user -.->|"chats"| node_chat
node_user -.->|"submits prompt"| node_singleturn
node_user -.->|"creates images"| node_imagegen
node_user -.->|"provides speech"| node_whisper
node_user -.->|"runs task"| node_customtasks
node_history -->|"reads and writes"| node_chatdb
node_user -.->|"manages skills"| node_skillui
node_skillui -->|"updates state"| node_skillmanager
node_skillmanager -->|"persists skills"| node_settings
node_agentchat -.->|"uses tools"| node_agenttools
node_agentchat -.->|"opens manager"| node_skillui

click node_activity "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/box/gallery/MainActivity.kt"
click node_lock "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/security/AppLockManager.kt"
click node_encryption "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/security/BiometricEncryptionManager.kt"
click node_audit "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/security/SecurityAuditLog.kt"
click node_navigation "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/navigation/GalleryNavGraph.kt"
click node_modelmanager "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/modelmanager/ModelManagerViewModel.kt"
click node_modelcatalog "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/data/Model.kt"
click node_modeldownload "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/data/DownloadRepository.kt"
click node_downloadworker "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/worker/DownloadWorker.kt"
click node_llmengine "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/engine/LlamaCppEngine.kt"
click node_smollm "https://github.com/jegly/box/blob/main/Android/src/smollm/src/main/java/com/jegly/offlineLLM/smollm/SmolLM.kt"
click node_chat "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/llmchat/LlmChatScreen.kt"
click node_singleturn "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/llmsingleturn/LlmSingleTurnScreen.kt"
click node_imagegen "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/imagegen/ImageGenScreen.kt"
click node_whisper "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/whisper/WhisperScreen.kt"
click node_customtasks "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/mobileactions/MobileActionsScreen.kt"
click node_history "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/data/local/ChatRepository.kt"
click node_chatdb "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/data/local/BoxChatDatabase.kt"
click node_settings "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/data/DataStoreRepository.kt"
click node_skillmanager "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/SkillManagerViewModel.kt"
click node_skillui "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/SkillManagerBottomSheet.kt"
click node_agenttools "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/AgentTools.kt"
click node_agentchat "https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/AgentChatScreen.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_lock,node_encryption,node_audit,node_navigation,node_user toneBlue
class node_modelmanager,node_modelcatalog,node_modeldownload,node_downloadworker,node_llmengine,node_smollm toneAmber
class node_chat,node_singleturn,node_imagegen,node_whisper,node_customtasks toneMint
class node_history,node_chatdb,node_settings toneRose
class node_skillmanager,node_skillui,node_agenttools,node_agentchat toneIndigo
```

## Components

### App and security

- [App entry](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/box/gallery/MainActivity.kt): `Android/src/app/src/main/java/com/box/gallery/MainActivity.kt`
- [Biometric lock](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/security/AppLockManager.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/security/AppLockManager.kt`
- [DB encryption](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/security/BiometricEncryptionManager.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/security/BiometricEncryptionManager.kt`
- [Security audit](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/security/SecurityAuditLog.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/security/SecurityAuditLog.kt`
- [App navigation](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/navigation/GalleryNavGraph.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/navigation/GalleryNavGraph.kt`

### Models and inference

- [Model manager](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/modelmanager/ModelManagerViewModel.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/modelmanager/ModelManagerViewModel.kt`
- [Model catalog](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/data/Model.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/data/Model.kt`
- [Model downloads](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/data/DownloadRepository.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/data/DownloadRepository.kt`
- [Download worker](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/worker/DownloadWorker.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/worker/DownloadWorker.kt`
- [LLM inference](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/engine/LlamaCppEngine.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/engine/LlamaCppEngine.kt`
- [GGUF runtime](https://github.com/jegly/box/blob/main/Android/src/smollm/src/main/java/com/jegly/offlineLLM/smollm/SmolLM.kt): `Android/src/smollm/src/main/java/com/jegly/offlineLLM/smollm/SmolLM.kt`

### AI experiences

- [LLM chat](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/llmchat/LlmChatScreen.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/llmchat/LlmChatScreen.kt`
- [Single-turn prompts](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/llmsingleturn/LlmSingleTurnScreen.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/llmsingleturn/LlmSingleTurnScreen.kt`
- [Image generation](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/imagegen/ImageGenScreen.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/imagegen/ImageGenScreen.kt`
- [Speech recognition](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/whisper/WhisperScreen.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/whisper/WhisperScreen.kt`
- [Custom tasks](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/mobileactions/MobileActionsScreen.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/mobileactions/MobileActionsScreen.kt`

### Local persistence

- [Chat history](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/data/local/ChatRepository.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/data/local/ChatRepository.kt`
- [Chat database](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/data/local/BoxChatDatabase.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/data/local/BoxChatDatabase.kt`
- [App settings](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/data/DataStoreRepository.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/data/DataStoreRepository.kt`

### Agent skills

- [Skill management](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/SkillManagerViewModel.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/SkillManagerViewModel.kt`
- [Skill manager UI](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/SkillManagerBottomSheet.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/SkillManagerBottomSheet.kt`
- [Agent tools](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/AgentTools.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/AgentTools.kt`
- [Agent chat](https://github.com/jegly/box/blob/main/Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/AgentChatScreen.kt): `Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/AgentChatScreen.kt`

### Other components

- **User**

## Connections

- User → App entry: launches (evidence: `Android/src/app/src/main/java/com/box/gallery/MainActivity.kt`)
- App entry → Biometric lock: initializes (evidence: `Android/src/app/src/main/java/com/box/gallery/MainActivity.kt`)
- App entry → DB encryption: initializes (evidence: `Android/src/app/src/main/java/com/box/gallery/MainActivity.kt`)
- Biometric lock → Security audit: logs events (evidence: `Android/src/app/src/main/java/com/google/ai/edge/gallery/security/AppLockManager.kt`)
- App entry → App navigation: hosts
- App entry → Model manager: uses (evidence: `Android/src/app/src/main/java/com/box/gallery/MainActivity.kt`)
- Model manager → Model catalog: loads models (evidence: `Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/modelmanager/ModelManagerViewModel.kt`)
- Model manager → Model downloads: requests downloads (evidence: `Android/src/app/src/main/java/com/google/ai/edge/gallery/ui/modelmanager/ModelManagerViewModel.kt`)
- Model downloads → Download worker: enqueues work (evidence: `Android/src/app/src/main/java/com/google/ai/edge/gallery/data/DownloadRepository.kt`)
- LLM inference → GGUF runtime: delegates inference (evidence: `Android/src/app/src/main/java/com/google/ai/edge/gallery/engine/LlamaCppEngine.kt`)
- LLM chat → LLM inference: runs model
- Single-turn prompts → LLM inference: runs model
- User → Model manager: selects or imports
- User → LLM chat: chats
- User → Single-turn prompts: submits prompt
- User → Image generation: creates images
- User → Speech recognition: provides speech
- User → Custom tasks: runs task
- Chat history → Chat database: reads and writes (evidence: `Android/src/app/src/main/java/com/google/ai/edge/gallery/data/local/ChatRepository.kt`)
- User → Skill manager UI: manages skills
- Skill manager UI → Skill management: updates state (evidence: `Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/SkillManagerBottomSheet.kt`)
- Skill management → App settings: persists skills (evidence: `Android/src/app/src/main/java/com/google/ai/edge/gallery/customtasks/agentchat/SkillManagerViewModel.kt`)
- Agent chat → Agent tools: uses tools
- Agent chat → Skill manager UI: opens manager
