# yetote/aifriend architecture

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

- Interactive diagram: https://gitdiagram.com/yetote/aifriend
- Repository: https://github.com/yetote/aifriend

## Overview

AIFriend is an Android app for creating and managing AI companions, chatting with them individually or in multi-agent rooms, and persisting those conversations locally. The user journey starts at the home screen, branches into companion setup or room setup, then routes chat requests through feature view models to provider implementations and storage. The README also documents model discovery, context budgeting, avatar handling, room discussion controls, and export/search capabilities. Several feature implementations were not excerpted, so their internal links are omitted where the evidence does not establish them.

Main entry points: [`feature/home/src/main/java/com/feature/home/route/HomeRoute.kt`](https://github.com/yetote/aifriend/blob/main/feature/home/src/main/java/com/feature/home/route/HomeRoute.kt) (Home Routing), [`feature/home/src/main/java/com/feature/home/vm/HomeViewModel.kt`](https://github.com/yetote/aifriend/blob/main/feature/home/src/main/java/com/feature/home/vm/HomeViewModel.kt) (Home State), [`feature/agent/src/main/java/com/feature/agent/vm/AgentViewModel.kt`](https://github.com/yetote/aifriend/blob/main/feature/agent/src/main/java/com/feature/agent/vm/AgentViewModel.kt) (Agent Chat), [`feature/room/src/main/java/com/feature/room/vm/RoomViewModel.kt`](https://github.com/yetote/aifriend/blob/main/feature/room/src/main/java/com/feature/room/vm/RoomViewModel.kt) (Room Chat)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_presentation["App and UI"]
  node_activity["App Activity<br/>[MainActivity.kt]"]
  node_home_route["Home Routing<br/>[HomeRoute.kt]"]
  node_home_ui["Home Screen<br/>[UIFriendPage.kt]"]
  node_agent_ui["Agent UI"]
  node_room_ui["Room UI"]
  node_avatar_ui["Avatar Components<br/>[UIAvatar.kt]"]
end

subgraph group_features["User Workflows"]
  node_home_vm["Home State<br/>[HomeViewModel.kt]"]
  node_agent_vm["Agent Chat<br/>[AgentViewModel.kt]"]
  node_room_vm["Room Chat<br/>[RoomViewModel.kt]"]
  node_context["Context Budget<br/>[ContextBudget.kt]"]
  node_friend_model["Friend Model<br/>[Friend.kt]"]
  node_room_model["Room Model<br/>[Room.kt]"]
end

subgraph group_ai["AI Providers"]
  node_ai_factory["AI Factory<br/>[AIFactory.kt]"]
  node_ai_providers["Provider Clients"]
  node_ai_contract["AI Contract<br/>[IAI.kt]"]
  node_chat_message["Chat Messages<br/>[ChatMessage.kt]"]
end

subgraph group_persistence["Local Persistence"]
  node_friend_storage["Friend Storage"]
  node_room_storage["Room Storage<br/>[RoomRepository.kt]"]
  node_profile_storage["Profile Storage"]
  node_avatar_store["Avatar Files<br/>[AvatarStore.kt]"]
  node_legacy_migration["Legacy Import<br/>[LegacyMigration.kt]"]
  node_database[("Room Database<br/>[AppDatabase.kt]")]
end

subgraph group_platform["Networking and Shared"]
  node_web_repository["Web Repository<br/>[WebRepository.kt]"]
  node_network_client["Ktor Client<br/>[KtorClient.kt]"]
end

node_user(("User"))

node_user -->|"opens"| node_activity
node_activity -->|"mounts"| node_home_route
node_home_route -->|"renders"| node_home_ui
node_home_route -->|"observes"| node_home_vm
node_home_route -->|"routes agent"| node_agent_vm
node_home_route -->|"routes room"| node_room_vm
node_home_vm -->|"supplies state"| node_home_ui
node_home_route -->|"opens crop UI"| node_avatar_ui
node_room_vm -->|"renders through route"| node_room_ui
node_agent_vm -.->|"serves feature UI"| node_agent_ui
node_agent_vm -->|"loads and saves"| node_friend_storage
node_home_vm -->|"loads and deletes"| node_friend_storage
node_home_vm -->|"loads and updates"| node_room_storage
node_room_vm -->|"reads and writes"| node_room_storage
node_home_vm -->|"stores profile"| node_profile_storage
node_home_vm -->|"stores avatars"| node_avatar_store
node_agent_vm -->|"creates client"| node_ai_factory
node_room_vm -->|"creates client"| node_ai_factory
node_ai_factory -->|"selects provider"| node_ai_providers
node_ai_providers -.->|"implements"| node_ai_contract
node_agent_vm -.->|"trims history"| node_context
node_room_vm -.->|"budgets context"| node_context
node_agent_vm -->|"builds messages"| node_chat_message
node_room_vm -->|"builds messages"| node_chat_message
node_friend_storage -->|"uses DAOs"| node_database
node_room_storage -->|"uses DAOs"| node_database
node_profile_storage -->|"uses DAO"| node_database
node_legacy_migration -->|"imports legacy data"| node_database
node_web_repository -->|"uses HTTP client"| node_network_client
node_ai_providers -.->|"calls model APIs"| node_web_repository
node_avatar_ui -.->|"avatar workflow"| node_avatar_store

click node_activity "https://github.com/yetote/aifriend/blob/main/app/src/main/java/com/yetote/aifriend/MainActivity.kt"
click node_home_route "https://github.com/yetote/aifriend/blob/main/feature/home/src/main/java/com/feature/home/route/HomeRoute.kt"
click node_home_ui "https://github.com/yetote/aifriend/blob/main/ui/home/src/main/java/com/ui/home/UIFriendPage.kt"
click node_agent_ui "https://github.com/yetote/aifriend/tree/main/ui/agent"
click node_room_ui "https://github.com/yetote/aifriend/tree/main/ui/room"
click node_avatar_ui "https://github.com/yetote/aifriend/blob/main/ui/common/src/main/java/com/ui/common/UIAvatar.kt"
click node_home_vm "https://github.com/yetote/aifriend/blob/main/feature/home/src/main/java/com/feature/home/vm/HomeViewModel.kt"
click node_agent_vm "https://github.com/yetote/aifriend/blob/main/feature/agent/src/main/java/com/feature/agent/vm/AgentViewModel.kt"
click node_room_vm "https://github.com/yetote/aifriend/blob/main/feature/room/src/main/java/com/feature/room/vm/RoomViewModel.kt"
click node_context "https://github.com/yetote/aifriend/blob/main/feature/agent/src/main/java/com/feature/agent/data/ContextBudget.kt"
click node_friend_model "https://github.com/yetote/aifriend/blob/main/feature/agent/src/main/java/com/feature/agent/model/Friend.kt"
click node_room_model "https://github.com/yetote/aifriend/blob/main/feature/room/src/main/java/com/feature/room/model/Room.kt"
click node_ai_factory "https://github.com/yetote/aifriend/blob/main/core/ai/src/main/java/com/core/ai/factory/AIFactory.kt"
click node_ai_providers "https://github.com/yetote/aifriend/tree/main/core/ai/src/main/java/com/core/ai/entity"
click node_ai_contract "https://github.com/yetote/aifriend/blob/main/core/ai/src/main/java/com/core/ai/entity/IAI.kt"
click node_chat_message "https://github.com/yetote/aifriend/blob/main/core/ai/src/main/java/com/core/ai/model/ChatMessage.kt"
click node_web_repository "https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/WebRepository.kt"
click node_network_client "https://github.com/yetote/aifriend/blob/main/core/network/src/main/java/com/core/network/KtorClient.kt"
click node_friend_storage "https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/FriendRepository.kt"
click node_room_storage "https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/RoomRepository.kt"
click node_profile_storage "https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/ProfileRepository.kt"
click node_avatar_store "https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/AvatarStore.kt"
click node_legacy_migration "https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/LegacyMigration.kt"
click node_database "https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/db/AppDatabase.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_route,node_home_ui,node_agent_ui,node_room_ui,node_avatar_ui,node_user toneBlue
class node_home_vm,node_agent_vm,node_room_vm,node_context,node_friend_model,node_room_model toneAmber
class node_ai_factory,node_ai_providers,node_ai_contract,node_chat_message toneMint
class node_friend_storage,node_room_storage,node_profile_storage,node_avatar_store,node_legacy_migration,node_database toneRose
class node_web_repository,node_network_client toneIndigo
```

## Components

### App and UI

- [App Activity](https://github.com/yetote/aifriend/blob/main/app/src/main/java/com/yetote/aifriend/MainActivity.kt): `app/src/main/java/com/yetote/aifriend/MainActivity.kt`
- [Home Routing](https://github.com/yetote/aifriend/blob/main/feature/home/src/main/java/com/feature/home/route/HomeRoute.kt): `feature/home/src/main/java/com/feature/home/route/HomeRoute.kt`
- [Home Screen](https://github.com/yetote/aifriend/blob/main/ui/home/src/main/java/com/ui/home/UIFriendPage.kt): `ui/home/src/main/java/com/ui/home/UIFriendPage.kt`
- [Agent UI](https://github.com/yetote/aifriend/tree/main/ui/agent): `ui/agent`
- [Room UI](https://github.com/yetote/aifriend/tree/main/ui/room): `ui/room`
- [Avatar Components](https://github.com/yetote/aifriend/blob/main/ui/common/src/main/java/com/ui/common/UIAvatar.kt): `ui/common/src/main/java/com/ui/common/UIAvatar.kt`

### User Workflows

- [Home State](https://github.com/yetote/aifriend/blob/main/feature/home/src/main/java/com/feature/home/vm/HomeViewModel.kt): `feature/home/src/main/java/com/feature/home/vm/HomeViewModel.kt`
- [Agent Chat](https://github.com/yetote/aifriend/blob/main/feature/agent/src/main/java/com/feature/agent/vm/AgentViewModel.kt): `feature/agent/src/main/java/com/feature/agent/vm/AgentViewModel.kt`
- [Room Chat](https://github.com/yetote/aifriend/blob/main/feature/room/src/main/java/com/feature/room/vm/RoomViewModel.kt): `feature/room/src/main/java/com/feature/room/vm/RoomViewModel.kt`
- [Context Budget](https://github.com/yetote/aifriend/blob/main/feature/agent/src/main/java/com/feature/agent/data/ContextBudget.kt): `feature/agent/src/main/java/com/feature/agent/data/ContextBudget.kt`
- [Friend Model](https://github.com/yetote/aifriend/blob/main/feature/agent/src/main/java/com/feature/agent/model/Friend.kt): `feature/agent/src/main/java/com/feature/agent/model/Friend.kt`
- [Room Model](https://github.com/yetote/aifriend/blob/main/feature/room/src/main/java/com/feature/room/model/Room.kt): `feature/room/src/main/java/com/feature/room/model/Room.kt`

### AI Providers

- [AI Factory](https://github.com/yetote/aifriend/blob/main/core/ai/src/main/java/com/core/ai/factory/AIFactory.kt): `core/ai/src/main/java/com/core/ai/factory/AIFactory.kt`
- [Provider Clients](https://github.com/yetote/aifriend/tree/main/core/ai/src/main/java/com/core/ai/entity): `core/ai/src/main/java/com/core/ai/entity`
- [AI Contract](https://github.com/yetote/aifriend/blob/main/core/ai/src/main/java/com/core/ai/entity/IAI.kt): `core/ai/src/main/java/com/core/ai/entity/IAI.kt`
- [Chat Messages](https://github.com/yetote/aifriend/blob/main/core/ai/src/main/java/com/core/ai/model/ChatMessage.kt): `core/ai/src/main/java/com/core/ai/model/ChatMessage.kt`

### Local Persistence

- [Friend Storage](https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/FriendRepository.kt): `core/repository/src/main/java/com/core/repository/storage/FriendRepository.kt`
- [Room Storage](https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/RoomRepository.kt): `core/repository/src/main/java/com/core/repository/storage/RoomRepository.kt`
- [Profile Storage](https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/ProfileRepository.kt): `core/repository/src/main/java/com/core/repository/storage/ProfileRepository.kt`
- [Avatar Files](https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/AvatarStore.kt): `core/repository/src/main/java/com/core/repository/storage/AvatarStore.kt`
- [Legacy Import](https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/LegacyMigration.kt): `core/repository/src/main/java/com/core/repository/storage/LegacyMigration.kt`
- [Room Database](https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/storage/db/AppDatabase.kt): `core/repository/src/main/java/com/core/repository/storage/db/AppDatabase.kt`

### Networking and Shared

- [Web Repository](https://github.com/yetote/aifriend/blob/main/core/repository/src/main/java/com/core/repository/WebRepository.kt): `core/repository/src/main/java/com/core/repository/WebRepository.kt`
- [Ktor Client](https://github.com/yetote/aifriend/blob/main/core/network/src/main/java/com/core/network/KtorClient.kt): `core/network/src/main/java/com/core/network/KtorClient.kt`

### Other components

- **User**

## Connections

- User → App Activity: opens
- App Activity → Home Routing: mounts (evidence: `app/src/main/java/com/yetote/aifriend/MainActivity.kt`)
- Home Routing → Home Screen: renders (evidence: `feature/home/src/main/java/com/feature/home/route/HomeRoute.kt`)
- Home Routing → Home State: observes (evidence: `feature/home/src/main/java/com/feature/home/route/HomeRoute.kt`)
- Home Routing → Agent Chat: routes agent (evidence: `feature/home/src/main/java/com/feature/home/route/HomeRoute.kt`)
- Home Routing → Room Chat: routes room (evidence: `feature/home/src/main/java/com/feature/home/route/HomeRoute.kt`)
- Home State → Home Screen: supplies state (evidence: `feature/home/src/main/java/com/feature/home/route/HomeRoute.kt`)
- Home Routing → Avatar Components: opens crop UI (evidence: `feature/home/src/main/java/com/feature/home/route/HomeRoute.kt`)
- Room Chat → Room UI: renders through route (evidence: `feature/room/src/main/java/com/feature/room/route/RoomRoute.kt`)
- Agent Chat → Agent UI: serves feature UI
- Agent Chat → Friend Storage: loads and saves (evidence: `feature/agent/src/main/java/com/feature/agent/vm/AgentViewModel.kt`)
- Home State → Friend Storage: loads and deletes (evidence: `feature/home/src/main/java/com/feature/home/vm/HomeViewModel.kt`)
- Home State → Room Storage: loads and updates (evidence: `feature/home/src/main/java/com/feature/home/vm/HomeViewModel.kt`)
- Room Chat → Room Storage: reads and writes (evidence: `feature/room/src/main/java/com/feature/room/vm/RoomViewModel.kt`)
- Home State → Profile Storage: stores profile (evidence: `feature/home/src/main/java/com/feature/home/vm/HomeViewModel.kt`)
- Home State → Avatar Files: stores avatars (evidence: `feature/home/src/main/java/com/feature/home/vm/HomeViewModel.kt`)
- Agent Chat → AI Factory: creates client (evidence: `feature/agent/src/main/java/com/feature/agent/vm/AgentViewModel.kt`)
- Room Chat → AI Factory: creates client (evidence: `feature/room/src/main/java/com/feature/room/vm/RoomViewModel.kt`)
- AI Factory → Provider Clients: selects provider (evidence: `core/ai/src/main/java/com/core/ai/factory/AIFactory.kt`)
- Provider Clients → AI Contract: implements
- Agent Chat → Context Budget: trims history
- Room Chat → Context Budget: budgets context
- Agent Chat → Chat Messages: builds messages (evidence: `feature/agent/src/main/java/com/feature/agent/vm/AgentViewModel.kt`)
- Room Chat → Chat Messages: builds messages (evidence: `feature/room/src/main/java/com/feature/room/vm/RoomViewModel.kt`)
- Friend Storage → Room Database: uses DAOs (evidence: `core/repository/src/main/java/com/core/repository/storage/FriendRepository.kt`)
- Room Storage → Room Database: uses DAOs (evidence: `core/repository/src/main/java/com/core/repository/storage/RoomRepository.kt`)
- Profile Storage → Room Database: uses DAO (evidence: `core/repository/src/main/java/com/core/repository/storage/ProfileRepository.kt`)
- Legacy Import → Room Database: imports legacy data (evidence: `core/repository/src/main/java/com/core/repository/storage/LegacyMigration.kt`)
- Web Repository → Ktor Client: uses HTTP client (evidence: `core/repository/src/main/java/com/core/repository/WebRepository.kt`)
- Provider Clients → Web Repository: calls model APIs
- Avatar Components → Avatar Files: avatar workflow
