# wireapp/wire-android architecture

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

- Interactive diagram: https://gitdiagram.com/wireapp/wire-android
- Repository: https://github.com/wireapp/wire-android

## Overview

Wire for Android is a secure messaging client with account, conversation, calling, meeting, search, and file features. A typical user opens the app, authenticates, enters a session, then uses conversations or other account features; background services support pending-message sync, notifications, and offline downloads. The tree identifies these product areas, while the sampled excerpts substantiate only selected runtime links, so other feature connections are left out rather than inferred. Several paths below represent substantial subsystems by their exact enclosing directory.

Main entry points: [`app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt`](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt) (Notification manager), [`app/src/main/kotlin/com/wire/android/di/accountScoped`](https://github.com/wireapp/wire-android/tree/develop/app/src/main/kotlin/com/wire/android/di/accountScoped) (Account services), [`app/src/main/kotlin/com/wire/android/ui/WireActivity.kt`](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt) (App activity), [`app/src/main/kotlin/com/wire/android/ui/authentication`](https://github.com/wireapp/wire-android/tree/develop/app/src/main/kotlin/com/wire/android/ui/authentication) (Authentication flows)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["App and navigation"]
  node_activity["App activity<br/>[WireActivity.kt]"]
  node_navigation["Navigation runtime"]
  node_nav_controller["Route controller"]
end

subgraph group_accounts["Accounts and conversations"]
  node_authentication["Authentication flows"]
  node_account_scope["Account services"]
  node_search["Search features"]
end

subgraph group_communication["Communication"]
  node_conversation_ui["Conversation UI"]
  node_call_manager["Call coordination"]
  node_notifications["Notification manager"]
  node_message_notifs["Message notifications"]
  node_meeting_notifs["Meeting notifications"]
  node_call_notifs["Call notifications"]
  node_meetings["Meeting screens"]
end

subgraph group_files["Files and offline access"]
  node_cells["Cells feature"]
  node_download_controller["File download controller"]
  node_offline_manager["Offline download manager"]
end

subgraph group_platform["Background and platform"]
  node_offline_service["Offline download service"]
  node_pending_service["Pending-message service"]
  node_sync_lifecycle["Sync lifecycle"]
  node_channel_manager["Notification channels"]
  node_local_store[("Encrypted app data")]
end

node_user(("Wire user"))
node_server{{"Wire backend"}}

node_user -.->|"uses"| node_activity
node_activity -.->|"hosts"| node_navigation
node_navigation -.->|"delegates navigation"| node_nav_controller
node_activity -.->|"presents flows"| node_authentication
node_authentication -.->|"establishes session"| node_account_scope
node_account_scope -.->|"provides account features"| node_conversation_ui
node_conversation_ui -.->|"coordinates calls"| node_call_manager
node_call_manager -->|"observes call state"| node_account_scope
node_notifications -->|"uses"| node_message_notifs
node_notifications -->|"uses"| node_meeting_notifs
node_notifications -->|"uses"| node_call_notifs
node_notifications -->|"coordinates sync"| node_sync_lifecycle
node_notifications -.->|"uses channels"| node_channel_manager
node_account_scope -.->|"supports search"| node_search
node_account_scope -.->|"supports meetings"| node_meetings
node_cells -.->|"starts downloads"| node_download_controller
node_offline_manager -->|"uses"| node_download_controller
node_offline_service -->|"runs downloads"| node_offline_manager
node_pending_service -->|"syncs sessions"| node_sync_lifecycle
node_authentication -.->|"authenticates"| node_server
node_conversation_ui -.->|"exchanges messages"| node_server
node_download_controller -.->|"persists offline metadata"| node_local_store

click node_activity "https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt"
click node_navigation "https://github.com/wireapp/wire-android/tree/develop/app/src/main/kotlin/com/wire/android/navigation/runtime"
click node_nav_controller "https://github.com/wireapp/wire-android/blob/develop/core/navigation-kmp/src/commonMain/kotlin/com/wire/navigation/WireNavigationController.kt"
click node_authentication "https://github.com/wireapp/wire-android/tree/develop/app/src/main/kotlin/com/wire/android/ui/authentication"
click node_account_scope "https://github.com/wireapp/wire-android/tree/develop/app/src/main/kotlin/com/wire/android/di/accountScoped"
click node_conversation_ui "https://github.com/wireapp/wire-android/tree/develop/app/src/main/kotlin/com/wire/android/ui/home/conversations"
click node_call_manager "https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/ui/home/conversations/call/JoinOrStartCallManager.kt"
click node_notifications "https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt"
click node_message_notifs "https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt"
click node_meeting_notifs "https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/notification/MeetingNotificationManager.kt"
click node_call_notifs "https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/notification/CallNotificationManager.kt"
click node_search "https://github.com/wireapp/wire-android/tree/develop/core/search/src/main/kotlin/com/wire/android/search"
click node_meetings "https://github.com/wireapp/wire-android/blob/develop/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/AllMeetingsScreen.kt"
click node_cells "https://github.com/wireapp/wire-android/tree/develop/features/cells/src/main/java/com/wire/android/feature/cells"
click node_download_controller "https://github.com/wireapp/wire-android/blob/develop/features/cells/src/main/java/com/wire/android/feature/cells/ui/OfflineFileDownloadController.kt"
click node_offline_manager "https://github.com/wireapp/wire-android/blob/develop/features/cells/src/main/java/com/wire/android/feature/cells/ui/offline/OfflineDownloadManager.kt"
click node_offline_service "https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/services/OfflineDownloadService.kt"
click node_pending_service "https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/services/PendingMessagesForegroundService.kt"
click node_sync_lifecycle "https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/util/lifecycle/SyncLifecycleManager.kt"
click node_channel_manager "https://github.com/wireapp/wire-android/blob/develop/core/notification/src/main/kotlin/com/wire/android/notification/NotificationChannelsManager.kt"
click node_local_store "https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/datastore/EncryptionManager.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_nav_controller,node_user toneBlue
class node_authentication,node_account_scope,node_search toneAmber
class node_conversation_ui,node_call_manager,node_notifications,node_message_notifs,node_meeting_notifs,node_call_notifs,node_meetings toneMint
class node_cells,node_download_controller,node_offline_manager toneRose
class node_offline_service,node_pending_service,node_sync_lifecycle,node_channel_manager,node_local_store,node_server toneIndigo
```

## Components

### App and navigation

- [App activity](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/ui/WireActivity.kt): `app/src/main/kotlin/com/wire/android/ui/WireActivity.kt`
- [Navigation runtime](https://github.com/wireapp/wire-android/tree/develop/app/src/main/kotlin/com/wire/android/navigation/runtime): `app/src/main/kotlin/com/wire/android/navigation/runtime`
- [Route controller](https://github.com/wireapp/wire-android/blob/develop/core/navigation-kmp/src/commonMain/kotlin/com/wire/navigation/WireNavigationController.kt): `core/navigation-kmp/src/commonMain/kotlin/com/wire/navigation/WireNavigationController.kt`

### Accounts and conversations

- [Authentication flows](https://github.com/wireapp/wire-android/tree/develop/app/src/main/kotlin/com/wire/android/ui/authentication): `app/src/main/kotlin/com/wire/android/ui/authentication`
- [Account services](https://github.com/wireapp/wire-android/tree/develop/app/src/main/kotlin/com/wire/android/di/accountScoped): `app/src/main/kotlin/com/wire/android/di/accountScoped`
- [Search features](https://github.com/wireapp/wire-android/tree/develop/core/search/src/main/kotlin/com/wire/android/search): `core/search/src/main/kotlin/com/wire/android/search`

### Communication

- [Conversation UI](https://github.com/wireapp/wire-android/tree/develop/app/src/main/kotlin/com/wire/android/ui/home/conversations): `app/src/main/kotlin/com/wire/android/ui/home/conversations`
- [Call coordination](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/ui/home/conversations/call/JoinOrStartCallManager.kt): `app/src/main/kotlin/com/wire/android/ui/home/conversations/call/JoinOrStartCallManager.kt`
- [Notification manager](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt): `app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt`
- [Message notifications](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt): `app/src/main/kotlin/com/wire/android/notification/MessageNotificationManager.kt`
- [Meeting notifications](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/notification/MeetingNotificationManager.kt): `app/src/main/kotlin/com/wire/android/notification/MeetingNotificationManager.kt`
- [Call notifications](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/notification/CallNotificationManager.kt): `app/src/main/kotlin/com/wire/android/notification/CallNotificationManager.kt`
- [Meeting screens](https://github.com/wireapp/wire-android/blob/develop/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/AllMeetingsScreen.kt): `features/meetings/src/main/java/com/wire/android/feature/meetings/ui/AllMeetingsScreen.kt`

### Files and offline access

- [Cells feature](https://github.com/wireapp/wire-android/tree/develop/features/cells/src/main/java/com/wire/android/feature/cells): `features/cells/src/main/java/com/wire/android/feature/cells`
- [File download controller](https://github.com/wireapp/wire-android/blob/develop/features/cells/src/main/java/com/wire/android/feature/cells/ui/OfflineFileDownloadController.kt): `features/cells/src/main/java/com/wire/android/feature/cells/ui/OfflineFileDownloadController.kt`
- [Offline download manager](https://github.com/wireapp/wire-android/blob/develop/features/cells/src/main/java/com/wire/android/feature/cells/ui/offline/OfflineDownloadManager.kt): `features/cells/src/main/java/com/wire/android/feature/cells/ui/offline/OfflineDownloadManager.kt`

### Background and platform

- [Offline download service](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/services/OfflineDownloadService.kt): `app/src/main/kotlin/com/wire/android/services/OfflineDownloadService.kt`
- [Pending-message service](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/services/PendingMessagesForegroundService.kt): `app/src/main/kotlin/com/wire/android/services/PendingMessagesForegroundService.kt`
- [Sync lifecycle](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/util/lifecycle/SyncLifecycleManager.kt): `app/src/main/kotlin/com/wire/android/util/lifecycle/SyncLifecycleManager.kt`
- [Notification channels](https://github.com/wireapp/wire-android/blob/develop/core/notification/src/main/kotlin/com/wire/android/notification/NotificationChannelsManager.kt): `core/notification/src/main/kotlin/com/wire/android/notification/NotificationChannelsManager.kt`
- [Encrypted app data](https://github.com/wireapp/wire-android/blob/develop/app/src/main/kotlin/com/wire/android/datastore/EncryptionManager.kt): `app/src/main/kotlin/com/wire/android/datastore/EncryptionManager.kt`

### Other components

- **Wire user**
- **Wire backend**

## Connections

- Wire user → App activity: uses (evidence: `README.md`)
- App activity → Navigation runtime: hosts
- Navigation runtime → Route controller: delegates navigation
- App activity → Authentication flows: presents flows
- Authentication flows → Account services: establishes session
- Account services → Conversation UI: provides account features
- Conversation UI → Call coordination: coordinates calls (evidence: `app/src/main/kotlin/com/wire/android/ui/home/conversations/call/JoinOrStartCallManager.kt`)
- Call coordination → Account services: observes call state (evidence: `app/src/main/kotlin/com/wire/android/ui/home/conversations/call/JoinOrStartCallManager.kt`)
- Notification manager → Message notifications: uses (evidence: `app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt`)
- Notification manager → Meeting notifications: uses (evidence: `app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt`)
- Notification manager → Call notifications: uses (evidence: `app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt`)
- Notification manager → Sync lifecycle: coordinates sync (evidence: `app/src/main/kotlin/com/wire/android/notification/WireNotificationManager.kt`)
- Notification manager → Notification channels: uses channels
- Account services → Search features: supports search
- Account services → Meeting screens: supports meetings
- Cells feature → File download controller: starts downloads (evidence: `features/cells/src/main/java/com/wire/android/feature/cells/ui/offline/OfflineDownloadManager.kt`)
- Offline download manager → File download controller: uses (evidence: `features/cells/src/main/java/com/wire/android/feature/cells/ui/offline/OfflineDownloadManager.kt`)
- Offline download service → Offline download manager: runs downloads (evidence: `app/src/main/kotlin/com/wire/android/services/OfflineDownloadService.kt`)
- Pending-message service → Sync lifecycle: syncs sessions (evidence: `app/src/main/kotlin/com/wire/android/services/PendingMessagesForegroundService.kt`)
- Authentication flows → Wire backend: authenticates
- Conversation UI → Wire backend: exchanges messages
- File download controller → Encrypted app data: persists offline metadata
