# arkiv123/aevox-desktop architecture

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

- Interactive diagram: https://gitdiagram.com/arkiv123/aevox-desktop
- Repository: https://github.com/arkiv123/aevox-desktop

## Overview

AEVOX is a cross-platform video-conferencing app: a participant enters a name and room ID, chooses initial audio/video settings, joins a meeting, then communicates through live media and chat, with optional screen sharing. The sampled code shows React meeting coordination, browser WebRTC signaling, server-managed rooms, and an optional mediasoup SFU path. The README also claims end-to-end encryption and web support, but the sampled source does not establish how encryption is implemented or how those deployment modes differ.

Main entry points: [`server.js`](https://github.com/arkiv123/aevox-desktop/blob/main/server.js) (Socket server), [`src/components/MeetingRoom.jsx`](https://github.com/arkiv123/aevox-desktop/blob/main/src/components/MeetingRoom.jsx) (Meeting room), [`src/components/HomeScreen.jsx`](https://github.com/arkiv123/aevox-desktop/blob/main/src/components/HomeScreen.jsx) (Join screen), [`src/hooks/useChat.js`](https://github.com/arkiv123/aevox-desktop/blob/main/src/hooks/useChat.js) (Room chat)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Meeting client"]
  node_home["Join screen<br/>[HomeScreen.jsx]"]
  node_app["App state<br/>[App.jsx]"]
  node_meeting["Meeting room<br/>[MeetingRoom.jsx]"]
  node_chat["Room chat<br/>[useChat.js]"]
end

subgraph group_media["Live media"]
  node_localmedia["Local media<br/>[useLocalMedia.js]"]
  node_screenshare["Screen sharing<br/>[useScreenShare.js]"]
  node_webrtc["Peer connections<br/>[useWebRTC.js]"]
end

subgraph group_backend["Signaling backend"]
  node_server["Socket server<br/>[server.js]"]
  node_rooms["Room coordination<br/>[server.js]"]
  node_sfu["SFU media routing<br/>[sfu.js]"]
end

subgraph group_desktop["Desktop capture"]
  node_electron["Electron shell<br/>[main.js]"]
  node_bridge["Preload bridge<br/>[preload.js]"]
  node_capture["Desktop capture<br/>[main.js]"]
end

node_participant(("Participant"))
node_media_devices["Camera and mic"]
node_remote(("Other participants"))

node_participant -->|"enters details"| node_home
node_home -->|"previews media"| node_localmedia
node_home -->|"joins meeting"| node_app
node_app -->|"renders room"| node_meeting
node_meeting -->|"controls media"| node_localmedia
node_localmedia -->|"captures tracks"| node_media_devices
node_meeting -->|"controls sharing"| node_screenshare
node_screenshare -.->|"requests sources"| node_bridge
node_bridge -.->|"invokes IPC"| node_electron
node_electron -->|"gets sources"| node_capture
node_capture -->|"returns sources"| node_bridge
node_meeting -->|"shares active stream"| node_webrtc
node_webrtc -->|"signals room peers"| node_server
node_server -->|"dispatches peer events"| node_webrtc
node_meeting -->|"displays and sends"| node_chat
node_chat -->|"sends chat events"| node_server
node_server -->|"broadcasts messages"| node_chat
node_server -->|"handles room events"| node_rooms
node_rooms -->|"notifies room peers"| node_remote
node_server -.->|"creates and manages transports"| node_sfu
node_sfu -.->|"returns transport data"| node_server
node_remote -->|"joins by room ID"| node_server

click node_home "https://github.com/arkiv123/aevox-desktop/blob/main/src/components/HomeScreen.jsx"
click node_app "https://github.com/arkiv123/aevox-desktop/blob/main/src/App.jsx"
click node_meeting "https://github.com/arkiv123/aevox-desktop/blob/main/src/components/MeetingRoom.jsx"
click node_localmedia "https://github.com/arkiv123/aevox-desktop/blob/main/src/hooks/useLocalMedia.js"
click node_screenshare "https://github.com/arkiv123/aevox-desktop/blob/main/src/hooks/useScreenShare.js"
click node_webrtc "https://github.com/arkiv123/aevox-desktop/blob/main/src/hooks/useWebRTC.js"
click node_chat "https://github.com/arkiv123/aevox-desktop/blob/main/src/hooks/useChat.js"
click node_server "https://github.com/arkiv123/aevox-desktop/blob/main/server.js"
click node_rooms "https://github.com/arkiv123/aevox-desktop/blob/main/server.js"
click node_sfu "https://github.com/arkiv123/aevox-desktop/blob/main/src/server/sfu.js"
click node_electron "https://github.com/arkiv123/aevox-desktop/blob/main/main.js"
click node_bridge "https://github.com/arkiv123/aevox-desktop/blob/main/preload.js"
click node_capture "https://github.com/arkiv123/aevox-desktop/blob/main/main.js"

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_home,node_app,node_meeting,node_chat toneBlue
class node_localmedia,node_screenshare,node_webrtc toneAmber
class node_server,node_rooms,node_sfu toneMint
class node_electron,node_bridge,node_capture toneRose
class node_participant,node_media_devices,node_remote toneIndigo
```

## Components

### Meeting client

- [Join screen](https://github.com/arkiv123/aevox-desktop/blob/main/src/components/HomeScreen.jsx): `src/components/HomeScreen.jsx`
- [App state](https://github.com/arkiv123/aevox-desktop/blob/main/src/App.jsx): `src/App.jsx`
- [Meeting room](https://github.com/arkiv123/aevox-desktop/blob/main/src/components/MeetingRoom.jsx): `src/components/MeetingRoom.jsx`
- [Room chat](https://github.com/arkiv123/aevox-desktop/blob/main/src/hooks/useChat.js): `src/hooks/useChat.js`

### Live media

- [Local media](https://github.com/arkiv123/aevox-desktop/blob/main/src/hooks/useLocalMedia.js): `src/hooks/useLocalMedia.js`
- [Screen sharing](https://github.com/arkiv123/aevox-desktop/blob/main/src/hooks/useScreenShare.js): `src/hooks/useScreenShare.js`
- [Peer connections](https://github.com/arkiv123/aevox-desktop/blob/main/src/hooks/useWebRTC.js): `src/hooks/useWebRTC.js`

### Signaling backend

- [Socket server](https://github.com/arkiv123/aevox-desktop/blob/main/server.js): `server.js`
- [Room coordination](https://github.com/arkiv123/aevox-desktop/blob/main/server.js): `server.js`
- [SFU media routing](https://github.com/arkiv123/aevox-desktop/blob/main/src/server/sfu.js): `src/server/sfu.js`

### Desktop capture

- [Electron shell](https://github.com/arkiv123/aevox-desktop/blob/main/main.js): `main.js`
- [Preload bridge](https://github.com/arkiv123/aevox-desktop/blob/main/preload.js): `preload.js`
- [Desktop capture](https://github.com/arkiv123/aevox-desktop/blob/main/main.js): `main.js`

### Other components

- **Participant**
- **Camera and mic**
- **Other participants**

## Connections

- Participant → Join screen: enters details
- Join screen → Local media: previews media
- Join screen → App state: joins meeting
- App state → Meeting room: renders room
- Meeting room → Local media: controls media
- Local media → Camera and mic: captures tracks
- Meeting room → Screen sharing: controls sharing
- Screen sharing → Preload bridge: requests sources
- Preload bridge → Electron shell: invokes IPC
- Electron shell → Desktop capture: gets sources
- Desktop capture → Preload bridge: returns sources
- Meeting room → Peer connections: shares active stream
- Peer connections → Socket server: signals room peers
- Socket server → Peer connections: dispatches peer events
- Meeting room → Room chat: displays and sends
- Room chat → Socket server: sends chat events
- Socket server → Room chat: broadcasts messages
- Socket server → Room coordination: handles room events
- Room coordination → Other participants: notifies room peers
- Socket server → SFU media routing: creates and manages transports
- SFU media routing → Socket server: returns transport data
- Other participants → Socket server: joins by room ID
