# infinityabir/snap2do architecture

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

## Overview

Snap2Do is a native Android app that turns imported screenshots into reviewed, executable actions. Users import an image or sample preset, receive Gemini-produced structured analysis, review and edit proposed action fields, then confirm an action that launches a native Android intent; execution status is retained in local history. The graph reflects the README’s documented workflow and capabilities; implementation excerpts were not provided, so unsampled internals and unverified links are omitted.

Main entry points: [`app/src/main/java/com/example/ScreenshotActionApp.kt`](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/ScreenshotActionApp.kt) (App entry), [`app/src/main/java/com/example/data/local/AppDatabase.kt`](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/local/AppDatabase.kt) (Room database), [`app/src/main/java/com/example/ui/screens/importscreen`](https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/importscreen) (Screenshot import), [`app/src/main/java/com/example/ui/screens/action`](https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/action) (Action confirmation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["App experience"]
  node_app["App entry"]
  node_import["Screenshot import"]
  node_presets["Sample presets"]
  node_result["Analysis results"]
  node_confirm["Action confirmation"]
  node_history["History browsing"]
  node_settings["Onboarding settings"]
  node_paywall["Paywall"]
end

subgraph group_analysis["Screenshot analysis"]
  node_models["Analysis models<br/>[ActionModels.kt]"]
  node_repository["Analysis repository"]
  node_vision["Gemini vision"]
  node_gemini["Gemini service<br/>[GeminiService.kt]"]
end

subgraph group_actions["Action handling"]
  node_executor["Action executor<br/>[ActionExecutor.kt]"]
  node_validator["Field validator<br/>[Validator.kt]"]
end

subgraph group_storage["Local data"]
  node_room[("Room database<br/>[AppDatabase.kt]")]
  node_entities["Stored entities<br/>[Entities.kt]"]
  node_daos["Analysis and action DAOs<br/>[Daos.kt]"]
  node_preferences[("User preferences")]
end

node_user(("User"))
node_gemini_api{{"Gemini Vision API"}}
node_android_apps{{"Android apps"}}

node_user -->|"opens"| node_app
node_app -->|"navigates to"| node_import
node_user -->|"imports screenshot"| node_import
node_import -->|"offers samples"| node_presets
node_import -->|"submits image"| node_repository
node_repository -->|"requests analysis"| node_vision
node_vision -->|"uses service"| node_gemini
node_gemini -->|"sends image"| node_gemini_api
node_vision -->|"parses result"| node_models
node_repository -->|"stores analysis"| node_room
node_app -->|"navigates to"| node_result
node_result -->|"reviews proposal"| node_confirm
node_confirm -->|"validates fields"| node_validator
node_confirm -->|"confirms action"| node_executor
node_executor -->|"launches intents"| node_android_apps
node_executor -->|"saves execution status"| node_room
node_history -->|"browses history"| node_room
node_room -->|"uses DAOs"| node_daos
node_room -->|"stores entities"| node_entities
node_app -->|"navigates to"| node_history
node_app -->|"navigates to"| node_settings
node_app -->|"navigates to"| node_paywall
node_settings -->|"stores preferences"| node_preferences

click node_app "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/ScreenshotActionApp.kt"
click node_import "https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/importscreen"
click node_presets "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/model/SampleScreenshotPreset.kt"
click node_result "https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/analysis"
click node_confirm "https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/action"
click node_history "https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/history"
click node_settings "https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/settings"
click node_paywall "https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/paywall"
click node_models "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/model/ActionModels.kt"
click node_repository "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/repository/AnalysisRepository.kt"
click node_vision "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/remote/GeminiVisionServiceImpl.kt"
click node_gemini "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/remote/GeminiService.kt"
click node_executor "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/domain/ActionExecutor.kt"
click node_validator "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/domain/Validator.kt"
click node_room "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/local/AppDatabase.kt"
click node_entities "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/local/entity/Entities.kt"
click node_daos "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/local/dao/Daos.kt"
click node_preferences "https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/local/PreferencesManager.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_app,node_import,node_presets,node_result,node_confirm,node_history,node_settings,node_paywall,node_user toneBlue
class node_models,node_repository,node_vision,node_gemini toneAmber
class node_executor,node_validator,node_gemini_api toneMint
class node_room,node_entities,node_daos,node_preferences toneRose
class node_android_apps toneIndigo
```

## Components

### App experience

- [App entry](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/ScreenshotActionApp.kt): `app/src/main/java/com/example/ScreenshotActionApp.kt`
- [Screenshot import](https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/importscreen): `app/src/main/java/com/example/ui/screens/importscreen`
- [Sample presets](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/model/SampleScreenshotPreset.kt): `app/src/main/java/com/example/data/model/SampleScreenshotPreset.kt`
- [Analysis results](https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/analysis): `app/src/main/java/com/example/ui/screens/analysis`
- [Action confirmation](https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/action): `app/src/main/java/com/example/ui/screens/action`
- [History browsing](https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/history): `app/src/main/java/com/example/ui/screens/history`
- [Onboarding settings](https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/settings): `app/src/main/java/com/example/ui/screens/settings`
- [Paywall](https://github.com/infinityabir/snap2do/tree/main/app/src/main/java/com/example/ui/screens/paywall): `app/src/main/java/com/example/ui/screens/paywall`

### Screenshot analysis

- [Analysis models](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/model/ActionModels.kt): `app/src/main/java/com/example/data/model/ActionModels.kt`
- [Analysis repository](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/repository/AnalysisRepository.kt): `app/src/main/java/com/example/data/repository/AnalysisRepository.kt`
- [Gemini vision](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/remote/GeminiVisionServiceImpl.kt): `app/src/main/java/com/example/data/remote/GeminiVisionServiceImpl.kt`
- [Gemini service](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/remote/GeminiService.kt): `app/src/main/java/com/example/data/remote/GeminiService.kt`

### Action handling

- [Action executor](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/domain/ActionExecutor.kt): `app/src/main/java/com/example/domain/ActionExecutor.kt`
- [Field validator](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/domain/Validator.kt): `app/src/main/java/com/example/domain/Validator.kt`

### Local data

- [Room database](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/local/AppDatabase.kt): `app/src/main/java/com/example/data/local/AppDatabase.kt`
- [Stored entities](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/local/entity/Entities.kt): `app/src/main/java/com/example/data/local/entity/Entities.kt`
- [Analysis and action DAOs](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/local/dao/Daos.kt): `app/src/main/java/com/example/data/local/dao/Daos.kt`
- [User preferences](https://github.com/infinityabir/snap2do/blob/main/app/src/main/java/com/example/data/local/PreferencesManager.kt): `app/src/main/java/com/example/data/local/PreferencesManager.kt`

### Other components

- **User**
- **Gemini Vision API**
- **Android apps**

## Connections

- User → App entry: opens (evidence: `README.md`)
- App entry → Screenshot import: navigates to (evidence: `README.md`)
- User → Screenshot import: imports screenshot (evidence: `README.md`)
- Screenshot import → Sample presets: offers samples (evidence: `README.md`)
- Screenshot import → Analysis repository: submits image (evidence: `README.md`)
- Analysis repository → Gemini vision: requests analysis (evidence: `README.md`)
- Gemini vision → Gemini service: uses service (evidence: `README.md`)
- Gemini service → Gemini Vision API: sends image (evidence: `README.md`)
- Gemini vision → Analysis models: parses result (evidence: `README.md`)
- Analysis repository → Room database: stores analysis (evidence: `README.md`)
- App entry → Analysis results: navigates to (evidence: `README.md`)
- Analysis results → Action confirmation: reviews proposal (evidence: `README.md`)
- Action confirmation → Field validator: validates fields (evidence: `README.md`)
- Action confirmation → Action executor: confirms action (evidence: `README.md`)
- Action executor → Android apps: launches intents (evidence: `README.md`)
- Action executor → Room database: saves execution status (evidence: `README.md`)
- History browsing → Room database: browses history (evidence: `README.md`)
- Room database → Analysis and action DAOs: uses DAOs (evidence: `README.md`)
- Room database → Stored entities: stores entities (evidence: `README.md`)
- App entry → History browsing: navigates to (evidence: `README.md`)
- App entry → Onboarding settings: navigates to (evidence: `README.md`)
- App entry → Paywall: navigates to (evidence: `README.md`)
- Onboarding settings → User preferences: stores preferences (evidence: `README.md`)
