# Dash Chat Architecture ## Requirements Before reading this document, please read the [list of Dash Chat requirements](https://hackmd.io/qtaaE4AlTGyBVarM5fNKdQ). ## Tech Stack - iroh: for QUIC direct p2p connections with NAT traversal. - p2panda: p2p framework for core data types and synchronization. - tauri: framework to produce native mobile and desktop apps from web based UIs and rust backends. - svelte for the UI. - tinySSB for LoRa? - Axum for servers. - Cassandra as a distributed database for internet servers? To learn more about the choice of p2p protocols see the [p2p Protocol Comparison](https://hackmd.io/Agc6m-3QTz2mIRpE9brytw). ## Architecture This is a graphical overview of all the components for Dash Chat: ```mermaid flowchart LR iroh iroh-->dash-router epidemic-broadcast-->dash-router dash-router-->tauri-app local-message-server-->tauri-app message-server-->internet-message-server message-server-->local-message-server subgraph transports iroh end subgraph routing protocols epidemic-broadcast end subgraph Infrastructure push-notifications-server internet-message-server dash-chat-bootstrap end ``` - Message server: asynchronous relaying of operations for when recipients are offline. - Two deployment strategies: - Internet message servers: servers hosted on the internet and run by Dash Chat. - Local message servers: bundled in the Dash Chat desktop app, turns a Dash Chat instance into a message server available in the LAN. - [Basic Message Server Design](https://hackmd.io/RKZc5e3ySJCcmMXV_Sjy1A) - [Local Mailbox Mode Design](/_pDV2AoTRPaF1R7437LOfQ) - Push Notifications Server: semi-centralized service that stores the service account key for Firebase Cloud Messaging, and pairs of public key <> FCM tokens. - [Basic Push Notifications Server Design](https://hackmd.io/9T7H8fs1Q5a9zFsbvci84Q) - Dash Router: mesh network component that allows hopping of messages between a network of intermediary peers until it gets to its recipients. - See [Peer Relay Design](https://hackmd.io/Q5jYDy9qTRCapymsHPC3jw) for a WIP document on Dash Router. ### Relaying operations See the [3 pillars of message delivery](https://hackmd.io/54Hq5l4sQyWKo0rnxElK5Q) document for a comprehensive categorization of the methods of operation relaying. ## p2panda Design https://github.com/p2panda/p2panda ### Topics In p2panda, peers subscribe and publish operations to and from topics. All peers subscribed to a certain topic will *eventually* receive all operations published in that topic. > Topic privacy is achieved via secrecy: knowing the topic ID is enough to receive all operations in that topic. - Inbox: - Each user can create ephemeral inbox topics to receive incoming contact requests. - Each QR code has a token that's configurable, only requests that come with an alive token will be processed. This token may have a name, so that you can revoke it later. - 1 time. - Time bound. ### Spaces > p2panda-node is not ready yet, which means that we can't use spaces as of Q1 2026. We'll wait until p2panda-node is finished to start using p2panda-spaces. Up until then, we are going to treat the spaces designed here as normal topics. https://p2panda.org/2025/07/28/access-control.html Spaces are topics with built-in encryption and authorization. They provide an authorization model with 4 levels: - `Manage`: administrator level, can add and remove members from the space. - `Write`: can publish operations to the space. - `Read`: can decrypt and read operations from the space. - `Pull`: can only receive the encrypted versions of the operations. These are the space we are going to have in Dash Chat: - DeviceGroup: each user has a private personal space that only linked devices join, where they store personal information like settings and contacts. - Announcements: each user has a profile space with their personal information. Contacts subscribe to it. - Profile. - Linked Devices. - Direct chat space: each direct message chat between two peers is its own space. - Each member of this space is the personal space of each peer. - Group chat space: each group chat is its own space. - The members of this space are the personal spaces of each of the users. We'll be using the [message encryption scheme](https://p2panda.org/2025/02/24/group-encryption.html#p2panda-message-encryption-with-double-ratchet) for all spaces. ### Operation Flows #### Adding a contact Assumption: an out of band code is shared between peers that already know each other before hand, only one way. This code is shared either through a QR code or via a link/text. See [Add Contact Link](https://hackmd.io/u2zNqTVAQ06C_ADad567SQ) for sequence diagram and a description on how add contact deep links work. #### Linking a device Linking a device is similar to adding a contact. See [Add Linked Device](/6GPAvWIzT_K-xcBAqKcYtw) #### Group Invites Group invites: a group invite link has you enter in a group with a "waiting" notice. The member that joins sends a push notification to the existing members of the group, waking them up and helping with the join process. Question: how do we see the profile for people that are in the same group as we are but we are not friends with? ## Unknowns Refer to [the Dash Chat unknowns document](https://hackmd.io/CqBDV7utQrSdP2ebDe5TTg).