# nerojust/clean-architecture-android architecture

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

- Interactive diagram: https://gitdiagram.com/nerojust/clean-architecture-android
- Repository: https://github.com/nerojust/clean-architecture-android
- Video tour (about a minute): https://gitdiagram.com/nerojust/clean-architecture-android/video

## Overview

This is an Android GitHub repository browser: users search GitHub, browse results, and open a repository detail screen. Navigation routes list selections into detail; each feature’s MVI ViewModel invokes a domain use case, which accesses the repository abstraction. The data implementation calls GitHub’s API and maps responses into domain models. The README documents these architectural boundaries and the MVI flow; some feature, DI, and network internals were not sampled, so uncertain wiring is omitted.

Main entry points: [`data/src/main/kotlin/com/nerojust/clean_architecture/data/GitHubRepoRepositoryImpl.kt`](https://github.com/nerojust/clean-architecture-android/blob/main/data/src/main/kotlin/com/nerojust/clean_architecture/data/GitHubRepoRepositoryImpl.kt) (GitHub Repository), [`feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListScreen.kt`](https://github.com/nerojust/clean-architecture-android/blob/main/feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListScreen.kt) (Repository List UI), [`app/src/main/java/com/nerojust/clean_architecture/navigation/AppNavHost.kt`](https://github.com/nerojust/clean-architecture-android/blob/main/app/src/main/java/com/nerojust/clean_architecture/navigation/AppNavHost.kt) (App Navigation), [`core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/GitHubApiService.kt`](https://github.com/nerojust/clean-architecture-android/blob/main/core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/GitHubApiService.kt) (GitHub API Service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App Shell"]
  node_activity["Main Activity<br/>[MainActivity.kt]"]
  node_navigation["App Navigation<br/>[AppNavHost.kt]"]
end

subgraph group_features["Browse Features"]
  node_list_screen["Repository List UI<br/>[RepoListScreen.kt]"]
  node_list_vm["List ViewModel"]
  node_list_contract["List MVI Contract"]
  node_detail_screen["Repository Detail UI"]
  node_detail_vm["Detail ViewModel"]
  node_detail_contract["Detail MVI Contract"]
end

subgraph group_domain["Domain Layer"]
  node_search_usecase["Search Use Case"]
  node_detail_usecase["Detail Use Case"]
  node_repository_contract["Repository Contract<br/>[RepoRepository.kt]"]
  node_repo_model["Repository Model<br/>[Repo.kt]"]
end

subgraph group_data["Data Access"]
  node_repository_impl["GitHub Repository"]
  node_repo_mapper["DTO Mapper<br/>[RepoMapper.kt]"]
end

subgraph group_shared["Shared Platform"]
  node_api_service["GitHub API Service"]
  node_network_factory["Network Factory<br/>[NetworkFactory.kt]"]
  node_repo_dto["Repository DTOs<br/>[RepoDto.kt]"]
  node_dispatchers["Dispatcher Provider"]
  node_ui_components["State Components"]
end

node_user(("App User"))
node_github(("GitHub API"))

node_user -->|"opens app"| node_activity
node_activity -->|"shows host"| node_navigation
node_navigation -->|"starts list"| node_list_screen
node_list_screen -->|"sends intents"| node_list_vm
node_list_vm -->|"reduces state"| node_list_contract
node_list_screen -->|"renders states"| node_ui_components
node_list_vm -->|"invokes search"| node_search_usecase
node_list_screen -->|"opens selection"| node_navigation
node_navigation -->|"routes owner/name"| node_detail_screen
node_detail_screen -->|"sends load"| node_detail_vm
node_detail_vm -->|"reduces state"| node_detail_contract
node_detail_screen -->|"renders states"| node_ui_components
node_detail_vm -->|"loads repository"| node_detail_usecase
node_search_usecase -->|"searches repos"| node_repository_contract
node_detail_usecase -->|"gets repository"| node_repository_contract
node_repository_impl -->|"implements"| node_repository_contract
node_repository_impl -->|"requests data"| node_api_service
node_repository_impl -->|"uses IO context"| node_dispatchers
node_repository_impl -->|"maps responses"| node_repo_mapper
node_repo_mapper -->|"maps from DTO"| node_repo_dto
node_repo_mapper -->|"creates model"| node_repo_model
node_api_service -->|"returns DTOs"| node_repo_dto
node_api_service -->|"calls endpoints"| node_github
node_network_factory -->|"creates service"| node_api_service

click node_activity "https://github.com/nerojust/clean-architecture-android/blob/main/app/src/main/java/com/nerojust/clean_architecture/MainActivity.kt"
click node_navigation "https://github.com/nerojust/clean-architecture-android/blob/main/app/src/main/java/com/nerojust/clean_architecture/navigation/AppNavHost.kt"
click node_list_screen "https://github.com/nerojust/clean-architecture-android/blob/main/feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListScreen.kt"
click node_list_vm "https://github.com/nerojust/clean-architecture-android/blob/main/feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListViewModel.kt"
click node_list_contract "https://github.com/nerojust/clean-architecture-android/blob/main/feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListContract.kt"
click node_detail_screen "https://github.com/nerojust/clean-architecture-android/blob/main/feature/repodetail/src/main/kotlin/com/nerojust/clean_architecture/feature/repodetail/RepoDetailScreen.kt"
click node_detail_vm "https://github.com/nerojust/clean-architecture-android/blob/main/feature/repodetail/src/main/kotlin/com/nerojust/clean_architecture/feature/repodetail/RepoDetailViewModel.kt"
click node_detail_contract "https://github.com/nerojust/clean-architecture-android/blob/main/feature/repodetail/src/main/kotlin/com/nerojust/clean_architecture/feature/repodetail/RepoDetailContract.kt"
click node_search_usecase "https://github.com/nerojust/clean-architecture-android/blob/main/domain/src/main/kotlin/com/nerojust/clean_architecture/domain/usecase/SearchReposUseCase.kt"
click node_detail_usecase "https://github.com/nerojust/clean-architecture-android/blob/main/domain/src/main/kotlin/com/nerojust/clean_architecture/domain/usecase/GetRepoDetailUseCase.kt"
click node_repository_contract "https://github.com/nerojust/clean-architecture-android/blob/main/domain/src/main/kotlin/com/nerojust/clean_architecture/domain/repository/RepoRepository.kt"
click node_repo_model "https://github.com/nerojust/clean-architecture-android/blob/main/domain/src/main/kotlin/com/nerojust/clean_architecture/domain/model/Repo.kt"
click node_repository_impl "https://github.com/nerojust/clean-architecture-android/blob/main/data/src/main/kotlin/com/nerojust/clean_architecture/data/GitHubRepoRepositoryImpl.kt"
click node_repo_mapper "https://github.com/nerojust/clean-architecture-android/blob/main/data/src/main/kotlin/com/nerojust/clean_architecture/data/mapper/RepoMapper.kt"
click node_api_service "https://github.com/nerojust/clean-architecture-android/blob/main/core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/GitHubApiService.kt"
click node_network_factory "https://github.com/nerojust/clean-architecture-android/blob/main/core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/NetworkFactory.kt"
click node_repo_dto "https://github.com/nerojust/clean-architecture-android/blob/main/core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/dto/RepoDto.kt"
click node_dispatchers "https://github.com/nerojust/clean-architecture-android/blob/main/core/common/src/main/kotlin/com/nerojust/clean_architecture/core/common/DispatcherProvider.kt"
click node_ui_components "https://github.com/nerojust/clean-architecture-android/blob/main/core/ui/src/main/kotlin/com/nerojust/clean_architecture/core/ui/component/StateComposables.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_navigation,node_user toneBlue
class node_list_screen,node_list_vm,node_list_contract,node_detail_screen,node_detail_vm,node_detail_contract toneAmber
class node_search_usecase,node_detail_usecase,node_repository_contract,node_repo_model,node_github toneMint
class node_repository_impl,node_repo_mapper toneRose
class node_api_service,node_network_factory,node_repo_dto,node_dispatchers,node_ui_components toneIndigo
```

## Components

### App Shell

- [Main Activity](https://github.com/nerojust/clean-architecture-android/blob/main/app/src/main/java/com/nerojust/clean_architecture/MainActivity.kt): `app/src/main/java/com/nerojust/clean_architecture/MainActivity.kt`
- [App Navigation](https://github.com/nerojust/clean-architecture-android/blob/main/app/src/main/java/com/nerojust/clean_architecture/navigation/AppNavHost.kt): `app/src/main/java/com/nerojust/clean_architecture/navigation/AppNavHost.kt`

### Browse Features

- [Repository List UI](https://github.com/nerojust/clean-architecture-android/blob/main/feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListScreen.kt): `feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListScreen.kt`
- [List ViewModel](https://github.com/nerojust/clean-architecture-android/blob/main/feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListViewModel.kt): `feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListViewModel.kt`
- [List MVI Contract](https://github.com/nerojust/clean-architecture-android/blob/main/feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListContract.kt): `feature/repolist/src/main/kotlin/com/nerojust/clean_architecture/feature/repolist/RepoListContract.kt`
- [Repository Detail UI](https://github.com/nerojust/clean-architecture-android/blob/main/feature/repodetail/src/main/kotlin/com/nerojust/clean_architecture/feature/repodetail/RepoDetailScreen.kt): `feature/repodetail/src/main/kotlin/com/nerojust/clean_architecture/feature/repodetail/RepoDetailScreen.kt`
- [Detail ViewModel](https://github.com/nerojust/clean-architecture-android/blob/main/feature/repodetail/src/main/kotlin/com/nerojust/clean_architecture/feature/repodetail/RepoDetailViewModel.kt): `feature/repodetail/src/main/kotlin/com/nerojust/clean_architecture/feature/repodetail/RepoDetailViewModel.kt`
- [Detail MVI Contract](https://github.com/nerojust/clean-architecture-android/blob/main/feature/repodetail/src/main/kotlin/com/nerojust/clean_architecture/feature/repodetail/RepoDetailContract.kt): `feature/repodetail/src/main/kotlin/com/nerojust/clean_architecture/feature/repodetail/RepoDetailContract.kt`

### Domain Layer

- [Search Use Case](https://github.com/nerojust/clean-architecture-android/blob/main/domain/src/main/kotlin/com/nerojust/clean_architecture/domain/usecase/SearchReposUseCase.kt): `domain/src/main/kotlin/com/nerojust/clean_architecture/domain/usecase/SearchReposUseCase.kt`
- [Detail Use Case](https://github.com/nerojust/clean-architecture-android/blob/main/domain/src/main/kotlin/com/nerojust/clean_architecture/domain/usecase/GetRepoDetailUseCase.kt): `domain/src/main/kotlin/com/nerojust/clean_architecture/domain/usecase/GetRepoDetailUseCase.kt`
- [Repository Contract](https://github.com/nerojust/clean-architecture-android/blob/main/domain/src/main/kotlin/com/nerojust/clean_architecture/domain/repository/RepoRepository.kt): `domain/src/main/kotlin/com/nerojust/clean_architecture/domain/repository/RepoRepository.kt`
- [Repository Model](https://github.com/nerojust/clean-architecture-android/blob/main/domain/src/main/kotlin/com/nerojust/clean_architecture/domain/model/Repo.kt): `domain/src/main/kotlin/com/nerojust/clean_architecture/domain/model/Repo.kt`

### Data Access

- [GitHub Repository](https://github.com/nerojust/clean-architecture-android/blob/main/data/src/main/kotlin/com/nerojust/clean_architecture/data/GitHubRepoRepositoryImpl.kt): `data/src/main/kotlin/com/nerojust/clean_architecture/data/GitHubRepoRepositoryImpl.kt`
- [DTO Mapper](https://github.com/nerojust/clean-architecture-android/blob/main/data/src/main/kotlin/com/nerojust/clean_architecture/data/mapper/RepoMapper.kt): `data/src/main/kotlin/com/nerojust/clean_architecture/data/mapper/RepoMapper.kt`

### Shared Platform

- [GitHub API Service](https://github.com/nerojust/clean-architecture-android/blob/main/core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/GitHubApiService.kt): `core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/GitHubApiService.kt`
- [Network Factory](https://github.com/nerojust/clean-architecture-android/blob/main/core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/NetworkFactory.kt): `core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/NetworkFactory.kt`
- [Repository DTOs](https://github.com/nerojust/clean-architecture-android/blob/main/core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/dto/RepoDto.kt): `core/network/src/main/kotlin/com/nerojust/clean_architecture/core/network/dto/RepoDto.kt`
- [Dispatcher Provider](https://github.com/nerojust/clean-architecture-android/blob/main/core/common/src/main/kotlin/com/nerojust/clean_architecture/core/common/DispatcherProvider.kt): `core/common/src/main/kotlin/com/nerojust/clean_architecture/core/common/DispatcherProvider.kt`
- [State Components](https://github.com/nerojust/clean-architecture-android/blob/main/core/ui/src/main/kotlin/com/nerojust/clean_architecture/core/ui/component/StateComposables.kt): `core/ui/src/main/kotlin/com/nerojust/clean_architecture/core/ui/component/StateComposables.kt`

### Other components

- **App User**
- **GitHub API**

## Connections

- App User → Main Activity: opens app
- Main Activity → App Navigation: shows host
- App Navigation → Repository List UI: starts list
- Repository List UI → List ViewModel: sends intents
- List ViewModel → List MVI Contract: reduces state
- Repository List UI → State Components: renders states
- List ViewModel → Search Use Case: invokes search
- Repository List UI → App Navigation: opens selection
- App Navigation → Repository Detail UI: routes owner/name
- Repository Detail UI → Detail ViewModel: sends load
- Detail ViewModel → Detail MVI Contract: reduces state
- Repository Detail UI → State Components: renders states
- Detail ViewModel → Detail Use Case: loads repository
- Search Use Case → Repository Contract: searches repos
- Detail Use Case → Repository Contract: gets repository
- GitHub Repository → Repository Contract: implements
- GitHub Repository → GitHub API Service: requests data
- GitHub Repository → Dispatcher Provider: uses IO context
- GitHub Repository → DTO Mapper: maps responses
- DTO Mapper → Repository DTOs: maps from DTO
- DTO Mapper → Repository Model: creates model
- GitHub API Service → Repository DTOs: returns DTOs
- GitHub API Service → GitHub API: calls endpoints
- Network Factory → GitHub API Service: creates service
