# getknit/knit architecture

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

## Overview

Knit is an Android offline mesh messenger. A user composes a Nearby, direct, or group message; the mesh carries it between phones, and the receiving app processes and stores it for conversation display. Direct and group content is end-to-end encrypted, while Nearby is public. The repository also includes calls, attachments and transfers, moderation, link previews, and a Wear OS status companion. The README documents the product flow; source excerpts and index references support selected internal links, so unsampled implementation details are not expanded into guessed call chains.

Main entry points: [`app/src/main/java/app/getknit/knit/mesh/InboundPipeline.kt`](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/mesh/InboundPipeline.kt) (Inbound pipeline), [`app/src/main/java/app/getknit/knit/mesh/MeshService.kt`](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/mesh/MeshService.kt) (Mesh service), [`app/src/main/java/app/getknit/knit/data/KnitDatabase.kt`](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/KnitDatabase.kt) (Encrypted database), [`app/src/main/java/app/getknit/knit/MainActivity.kt`](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/MainActivity.kt) (App entry)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Android app"]
  node_main["App entry<br/>[MainActivity.kt]"]
  node_database[("Encrypted database<br/>[KnitDatabase.kt]")]
  node_messages["Message repository"]
  node_conversations["Conversation model<br/>[Conversations.kt]"]
  node_settings["Settings<br/>[SettingsStore.kt]"]
end

subgraph group_mesh["Mesh messaging"]
  node_meshservice["Mesh service<br/>[MeshService.kt]"]
  node_inbound["Inbound pipeline<br/>[InboundPipeline.kt]"]
  node_forward["Store and forward"]
  node_ratchet["Message ratchets<br/>[RatchetEngine.kt]"]
end

subgraph group_content["Content services"]
  node_attachments["Attachment storage<br/>[AttachmentStore.kt]"]
  node_transfers["File transfers<br/>[TransferManager.kt]"]
  node_moderation["Image screening"]
  node_previews["Link previews"]
end

subgraph group_calling["Voice calls"]
  node_calls["Call manager<br/>[CallManager.kt]"]
  node_callservice["Call service<br/>[CallService.kt]"]
end

subgraph group_wear["Wear OS companion"]
  node_wearactivity["Watch status app<br/>[StatusActivity.kt]"]
  node_wearreader["Phone status reader"]
  node_wearrefresh["Status refresh<br/>[StatusRefresh.kt]"]
  node_tile["Watch tile<br/>[MeshTileService.kt]"]
  node_complications["Watch complications"]
end

node_user(("Phone user"))
node_phone(("Phone mesh"))

node_user -.->|"uses"| node_main
node_main -->|"starts mesh"| node_meshservice
node_meshservice -->|"reads settings"| node_settings
node_phone -.->|"connects over radios"| node_meshservice
node_meshservice -.->|"relays messages"| node_phone
node_inbound -->|"delivers messages"| node_messages
node_inbound -->|"uses custody"| node_forward
node_inbound -->|"handles blobs"| node_attachments
node_inbound -->|"uses database"| node_database
node_ratchet -.->|"persists ratchet state"| node_database
node_messages -.->|"stores messages"| node_database
node_main -.->|"shows conversations"| node_conversations
node_user -.->|"starts calls"| node_calls
node_callservice -->|"observes call state"| node_calls
node_user -.->|"sends files"| node_transfers
node_user -.->|"requests preview"| node_previews
node_moderation -.->|"stores verdicts"| node_database
node_wearactivity -->|"requests refresh"| node_wearrefresh
node_tile -->|"kicks refresh"| node_wearrefresh
node_wearrefresh -->|"reads phone status"| node_wearreader
node_complications -->|"reads cached status"| node_wearreader

click node_main "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/MainActivity.kt"
click node_meshservice "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/mesh/MeshService.kt"
click node_inbound "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/mesh/InboundPipeline.kt"
click node_forward "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/forward/ForwardRepository.kt"
click node_ratchet "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/mesh/crypto/ratchet/RatchetEngine.kt"
click node_database "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/KnitDatabase.kt"
click node_messages "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/MessageRepository.kt"
click node_conversations "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/message/Conversations.kt"
click node_settings "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/settings/SettingsStore.kt"
click node_attachments "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/AttachmentStore.kt"
click node_transfers "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/transfer/TransferManager.kt"
click node_moderation "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/moderation/ImageScreeningService.kt"
click node_previews "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/linkpreview/LinkPreviewService.kt"
click node_calls "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/call/CallManager.kt"
click node_callservice "https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/ui/call/CallService.kt"
click node_wearactivity "https://github.com/getknit/knit/blob/main/wear/src/main/java/app/getknit/knit/wear/StatusActivity.kt"
click node_wearreader "https://github.com/getknit/knit/blob/main/wear/src/main/java/app/getknit/knit/wear/PhoneStatusReader.kt"
click node_wearrefresh "https://github.com/getknit/knit/blob/main/wear/src/main/java/app/getknit/knit/wear/StatusRefresh.kt"
click node_tile "https://github.com/getknit/knit/blob/main/wear/src/main/java/app/getknit/knit/wear/MeshTileService.kt"
click node_complications "https://github.com/getknit/knit/blob/main/wear/src/main/java/app/getknit/knit/wear/StatusComplicationService.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_main,node_database,node_messages,node_conversations,node_settings,node_user toneBlue
class node_meshservice,node_inbound,node_forward,node_ratchet toneAmber
class node_attachments,node_transfers,node_moderation,node_previews toneMint
class node_calls,node_callservice toneRose
class node_wearactivity,node_wearreader,node_wearrefresh,node_tile,node_complications,node_phone toneIndigo
```

## Components

### Android app

- [App entry](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/MainActivity.kt): `app/src/main/java/app/getknit/knit/MainActivity.kt`
- [Encrypted database](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/KnitDatabase.kt): `app/src/main/java/app/getknit/knit/data/KnitDatabase.kt`
- [Message repository](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/MessageRepository.kt): `app/src/main/java/app/getknit/knit/data/MessageRepository.kt`
- [Conversation model](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/message/Conversations.kt): `app/src/main/java/app/getknit/knit/data/message/Conversations.kt`
- [Settings](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/settings/SettingsStore.kt): `app/src/main/java/app/getknit/knit/data/settings/SettingsStore.kt`

### Mesh messaging

- [Mesh service](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/mesh/MeshService.kt): `app/src/main/java/app/getknit/knit/mesh/MeshService.kt`
- [Inbound pipeline](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/mesh/InboundPipeline.kt): `app/src/main/java/app/getknit/knit/mesh/InboundPipeline.kt`
- [Store and forward](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/forward/ForwardRepository.kt): `app/src/main/java/app/getknit/knit/data/forward/ForwardRepository.kt`
- [Message ratchets](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/mesh/crypto/ratchet/RatchetEngine.kt): `app/src/main/java/app/getknit/knit/mesh/crypto/ratchet/RatchetEngine.kt`

### Content services

- [Attachment storage](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/data/AttachmentStore.kt): `app/src/main/java/app/getknit/knit/data/AttachmentStore.kt`
- [File transfers](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/transfer/TransferManager.kt): `app/src/main/java/app/getknit/knit/transfer/TransferManager.kt`
- [Image screening](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/moderation/ImageScreeningService.kt): `app/src/main/java/app/getknit/knit/moderation/ImageScreeningService.kt`
- [Link previews](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/linkpreview/LinkPreviewService.kt): `app/src/main/java/app/getknit/knit/linkpreview/LinkPreviewService.kt`

### Voice calls

- [Call manager](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/call/CallManager.kt): `app/src/main/java/app/getknit/knit/call/CallManager.kt`
- [Call service](https://github.com/getknit/knit/blob/main/app/src/main/java/app/getknit/knit/ui/call/CallService.kt): `app/src/main/java/app/getknit/knit/ui/call/CallService.kt`

### Wear OS companion

- [Watch status app](https://github.com/getknit/knit/blob/main/wear/src/main/java/app/getknit/knit/wear/StatusActivity.kt): `wear/src/main/java/app/getknit/knit/wear/StatusActivity.kt`
- [Phone status reader](https://github.com/getknit/knit/blob/main/wear/src/main/java/app/getknit/knit/wear/PhoneStatusReader.kt): `wear/src/main/java/app/getknit/knit/wear/PhoneStatusReader.kt`
- [Status refresh](https://github.com/getknit/knit/blob/main/wear/src/main/java/app/getknit/knit/wear/StatusRefresh.kt): `wear/src/main/java/app/getknit/knit/wear/StatusRefresh.kt`
- [Watch tile](https://github.com/getknit/knit/blob/main/wear/src/main/java/app/getknit/knit/wear/MeshTileService.kt): `wear/src/main/java/app/getknit/knit/wear/MeshTileService.kt`
- [Watch complications](https://github.com/getknit/knit/blob/main/wear/src/main/java/app/getknit/knit/wear/StatusComplicationService.kt): `wear/src/main/java/app/getknit/knit/wear/StatusComplicationService.kt`

### Other components

- **Phone user**
- **Phone mesh**

## Connections

- Phone user → App entry: uses (evidence: `README.md`)
- App entry → Mesh service: starts mesh (evidence: `app/src/main/java/app/getknit/knit/mesh/MeshService.kt`)
- Mesh service → Settings: reads settings (evidence: `app/src/main/java/app/getknit/knit/mesh/MeshService.kt`)
- Phone mesh → Mesh service: connects over radios (evidence: `README.md`)
- Mesh service → Phone mesh: relays messages (evidence: `README.md`)
- Inbound pipeline → Message repository: delivers messages (evidence: `app/src/main/java/app/getknit/knit/mesh/InboundPipeline.kt`)
- Inbound pipeline → Store and forward: uses custody (evidence: `app/src/main/java/app/getknit/knit/mesh/InboundPipeline.kt`)
- Inbound pipeline → Attachment storage: handles blobs (evidence: `app/src/main/java/app/getknit/knit/mesh/InboundPipeline.kt`)
- Inbound pipeline → Encrypted database: uses database (evidence: `app/src/main/java/app/getknit/knit/mesh/InboundPipeline.kt`)
- Message ratchets → Encrypted database: persists ratchet state
- Message repository → Encrypted database: stores messages
- App entry → Conversation model: shows conversations (evidence: `README.md`)
- Phone user → Call manager: starts calls (evidence: `README.md`)
- Call service → Call manager: observes call state (evidence: `app/src/main/java/app/getknit/knit/ui/call/CallService.kt`)
- Phone user → File transfers: sends files (evidence: `README.md`)
- Phone user → Link previews: requests preview (evidence: `README.md`)
- Image screening → Encrypted database: stores verdicts
- Watch status app → Status refresh: requests refresh (evidence: `wear/src/main/java/app/getknit/knit/wear/StatusActivity.kt`)
- Watch tile → Status refresh: kicks refresh (evidence: `wear/src/main/java/app/getknit/knit/wear/MeshTileService.kt`)
- Status refresh → Phone status reader: reads phone status (evidence: `wear/src/main/java/app/getknit/knit/wear/StatusRefresh.kt`)
- Watch complications → Phone status reader: reads cached status (evidence: `wear/src/main/java/app/getknit/knit/wear/StatusComplicationService.kt`)
