# briar/briar-desktop architecture

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

## Overview

Briar Desktop is a Compose-based desktop client for Briar secure messaging. The user-facing journey begins at startup and account access, then enters the main interface for contacts and private conversations; the repository also has distinct screens and view models for forums, blogs, private and threaded groups, mailbox setup, and settings. The sampled conversation view model shows message composition, optional image compression, and message-item creation. Several feature connections are inferred from the file tree rather than inspected source, so those links are marked dashed and unevidenced.

Main entry points: [`briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt`](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt) (Private conversation), [`briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt`](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt) (Contact list), [`briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/Main.kt`](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/Main.kt) (Application entry), [`briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt`](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt) (Main interface)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_startup["Startup and shell"]
  node_entry["Application entry<br/>[Main.kt]"]
  node_core["Core wiring"]
  node_shell["Main interface<br/>[MainScreen.kt]"]
  node_navigation["Sidebar navigation<br/>[BriarSidebar.kt]"]
end

subgraph group_people["Contacts and chat"]
  node_contacts["Contact list<br/>[ContactList.kt]"]
  node_addcontact["Add contact"]
  node_conversation["Private conversation"]
  node_messageview["Conversation screen"]
  node_imagecompress["Image compression<br/>[ImageCompressor.kt]"]
  node_avatar["Avatar loading<br/>[AvatarManager.kt]"]
  node_profile["Profile display<br/>[ProfileCircle.kt]"]
end

subgraph group_communities["Community content"]
  node_forums["Forum discussions<br/>[ForumScreen.kt]"]
  node_forumchat["Forum conversation"]
  node_blogs["Blog and feeds<br/>[FeedScreen.kt]"]
  node_blogsharing["Blog sharing"]
  node_privategroups["Private groups"]
  node_threadedgroups["Threaded groups"]
end

subgraph group_account["Account and services"]
  node_login["Login and registration<br/>[LoginScreen.kt]"]
  node_mailbox["Mailbox setup<br/>[MailboxScreen.kt]"]
  node_settings["Preferences<br/>[SettingsScreen.kt]"]
  node_encryptedsettings["Encrypted settings"]
end

node_user(("Desktop user"))

node_user -->|"starts app"| node_entry
node_entry -->|"initializes core"| node_core
node_user -.->|"authenticates"| node_login
node_login -.->|"enters app"| node_shell
node_shell -.->|"shows navigation"| node_navigation
node_navigation -.->|"opens contacts"| node_contacts
node_contacts -.->|"adds contact"| node_addcontact
node_contacts -.->|"opens chat"| node_conversation
node_conversation -->|"compresses image"| node_imagecompress
node_conversation -.->|"updates messages"| node_messageview
node_conversation -->|"creates message items"| node_messageview
node_avatar -.->|"supplies avatar"| node_profile
node_user -.->|"views forums"| node_forums
node_forums -.->|"opens discussion"| node_forumchat
node_user -.->|"views feeds"| node_blogs
node_blogs -.->|"shares blog"| node_blogsharing
node_user -.->|"views groups"| node_privategroups
node_user -.->|"views threads"| node_threadedgroups
node_user -.->|"configures mailbox"| node_mailbox
node_user -.->|"changes settings"| node_settings
node_settings -.->|"persists preferences"| node_encryptedsettings

click node_entry "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/Main.kt"
click node_core "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/DesktopCoreModule.kt"
click node_shell "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt"
click node_navigation "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt"
click node_login "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/LoginScreen.kt"
click node_contacts "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt"
click node_addcontact "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/add/remote/AddContactViewModel.kt"
click node_conversation "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt"
click node_messageview "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt"
click node_imagecompress "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/ImageCompressor.kt"
click node_avatar "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/AvatarManager.kt"
click node_profile "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ProfileCircle.kt"
click node_forums "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumScreen.kt"
click node_forumchat "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumConversationViewModel.kt"
click node_blogs "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/FeedScreen.kt"
click node_blogsharing "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/sharing/BlogSharingViewModel.kt"
click node_privategroups "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupScreen.kt"
click node_threadedgroups "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupScreen.kt"
click node_mailbox "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/mailbox/MailboxScreen.kt"
click node_settings "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/settings/SettingsScreen.kt"
click node_encryptedsettings "https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/settings/EncryptedSettingsImpl.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_entry,node_core,node_shell,node_navigation,node_user toneBlue
class node_contacts,node_addcontact,node_conversation,node_messageview,node_imagecompress,node_avatar,node_profile toneAmber
class node_forums,node_forumchat,node_blogs,node_blogsharing,node_privategroups,node_threadedgroups toneMint
class node_login,node_mailbox,node_settings,node_encryptedsettings toneRose
```

## Components

### Startup and shell

- [Application entry](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/Main.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/Main.kt`
- [Core wiring](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/DesktopCoreModule.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/DesktopCoreModule.kt`
- [Main interface](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt`
- [Sidebar navigation](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt`

### Contacts and chat

- [Contact list](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ContactList.kt`
- [Add contact](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/add/remote/AddContactViewModel.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/add/remote/AddContactViewModel.kt`
- [Private conversation](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt`
- [Conversation screen](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationScreen.kt`
- [Image compression](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/ImageCompressor.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/ImageCompressor.kt`
- [Avatar loading](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/AvatarManager.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/AvatarManager.kt`
- [Profile display](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ProfileCircle.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/contact/ProfileCircle.kt`

### Community content

- [Forum discussions](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumScreen.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/ForumScreen.kt`
- [Forum conversation](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumConversationViewModel.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/forum/conversation/ForumConversationViewModel.kt`
- [Blog and feeds](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/FeedScreen.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/FeedScreen.kt`
- [Blog sharing](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/sharing/BlogSharingViewModel.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/sharing/BlogSharingViewModel.kt`
- [Private groups](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupScreen.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/privategroup/PrivateGroupScreen.kt`
- [Threaded groups](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupScreen.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/threadedgroup/ThreadedGroupScreen.kt`

### Account and services

- [Login and registration](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/LoginScreen.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/LoginScreen.kt`
- [Mailbox setup](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/mailbox/MailboxScreen.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/mailbox/MailboxScreen.kt`
- [Preferences](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/settings/SettingsScreen.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/settings/SettingsScreen.kt`
- [Encrypted settings](https://github.com/briar/briar-desktop/blob/main/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/settings/EncryptedSettingsImpl.kt): `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/settings/EncryptedSettingsImpl.kt`

### Other components

- **Desktop user**

## Connections

- Desktop user → Application entry: starts app (evidence: `README.md`)
- Application entry → Core wiring: initializes core (evidence: `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/Main.kt`)
- Desktop user → Login and registration: authenticates
- Login and registration → Main interface: enters app
- Main interface → Sidebar navigation: shows navigation
- Sidebar navigation → Contact list: opens contacts
- Contact list → Add contact: adds contact
- Contact list → Private conversation: opens chat
- Private conversation → Image compression: compresses image (evidence: `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt`)
- Private conversation → Conversation screen: updates messages
- Private conversation → Conversation screen: creates message items (evidence: `briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationViewModel.kt`)
- Avatar loading → Profile display: supplies avatar
- Desktop user → Forum discussions: views forums
- Forum discussions → Forum conversation: opens discussion
- Desktop user → Blog and feeds: views feeds
- Blog and feeds → Blog sharing: shares blog
- Desktop user → Private groups: views groups
- Desktop user → Threaded groups: views threads
- Desktop user → Mailbox setup: configures mailbox
- Desktop user → Preferences: changes settings
- Preferences → Encrypted settings: persists preferences
