# ad1th/renderd architecture

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

- Interactive diagram: https://gitdiagram.com/ad1th/renderd
- Repository: https://github.com/ad1th/renderd

## Overview

Renderd streams a macOS desktop to a Windows viewer over a peer-to-peer QUIC connection. The host captures and encodes frames, then sends fragmented datagrams; the viewer discovers or connects to the host, reassembles and decodes frames, and presents them while returning control and timing feedback. Pairing, configuration, adaptive bitrate, clock synchronization, and reconnect behavior support that workflow. The README documents the broader feature set; sampled app and transport sources confirm orchestration and QUIC endpoint behavior, but many subsystem details are unsampled.

Main entry points: [`crates/renderd-viewer/src/app.rs`](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/app.rs) (Viewer App), [`crates/renderd-host/src/app.rs`](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/app.rs) (Host App), [`crates/renderd-host/src/network/control.rs`](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/network/control.rs) (Control Dispatcher), [`crates/renderd-viewer/src/network/control.rs`](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/network/control.rs) (Viewer Control)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_host["macOS Host"]
  node_host_app["Host App<br/>[app.rs]"]
  node_capture["Capture Pipeline<br/>[capture.rs]"]
  node_encoder["Encode Pipeline<br/>[encode.rs]"]
  node_host_session["Host Session<br/>[mod.rs]"]
  node_host_control["Control Dispatcher<br/>[control.rs]"]
  node_host_data["Data Sender<br/>[data.rs]"]
  node_host_abr["ABR Manager<br/>[abr.rs]"]
  node_host_clock["Clock Controller<br/>[clock.rs]"]
  node_host_ui["Host UI<br/>[mod.rs]"]
end

subgraph group_viewer["Windows Viewer"]
  node_viewer_app["Viewer App<br/>[app.rs]"]
  node_discovery["Host Discovery<br/>[mod.rs]"]
  node_viewer_pairing["Pairing<br/>[mod.rs]"]
  node_viewer_control["Viewer Control<br/>[control.rs]"]
  node_viewer_data["Datagram Receiver<br/>[data.rs]"]
  node_frame_queue["Frame Queue<br/>[frame_queue.rs]"]
  node_decoder["Video Decoder<br/>[decoder.rs]"]
  node_renderer["Renderer<br/>[renderer.rs]"]
  node_viewer_abr["ABR Feedback<br/>[feedback.rs]"]
  node_reconnect["Reconnect Watchdog<br/>[watchdog.rs]"]
end

subgraph group_transport["Peer Transport"]
  node_quic_server["QUIC Server<br/>[server.rs]"]
  node_quic_client["QUIC Client<br/>[client.rs]"]
end

subgraph group_shared["Shared Runtime"]
  node_protocol["Control Protocol<br/>[envelope.rs]"]
  node_framing["Frame Reassembly<br/>[reassembly.rs]"]
  node_abr_engine["ABR Engine<br/>[engine.rs]"]
  node_config["Configuration<br/>[lib.rs]"]
end

subgraph group_integrations["Platform Integrations"]
  node_sc_capture["ScreenCaptureKit<br/>[stream.rs]"]
  node_vt_codec["VideoToolbox<br/>[session.rs]"]
  node_windows_decode["Windows Decoder<br/>[mf_decode.rs]"]
  node_windows_render["D3D12 Renderer<br/>[d3d12_renderer.rs]"]
end

node_viewer_user(("Viewer User"))
node_network_peer(("Peer Network"))

node_viewer_user -->|"starts viewer"| node_viewer_app
node_viewer_app -->|"loads settings"| node_config
node_host_app -->|"loads settings"| node_config
node_host_app -->|"starts capture"| node_capture
node_host_app -->|"starts encoding"| node_encoder
node_host_app -->|"manages lifecycle"| node_host_session
node_host_app -->|"dispatches control"| node_host_control
node_host_app -->|"starts sender"| node_host_data
node_host_app -->|"accepts connections"| node_quic_server
node_host_app -->|"updates UI"| node_host_ui
node_capture -->|"captures frames"| node_sc_capture
node_encoder -->|"encodes video"| node_vt_codec
node_host_data -->|"reads encoded frames"| node_encoder
node_host_data -->|"fragments frames"| node_framing
node_host_data -->|"sends datagrams"| node_quic_server
node_viewer_app -->|"finds hosts"| node_discovery
node_viewer_app -->|"connects to host"| node_quic_client
node_viewer_app -->|"runs pairing"| node_viewer_pairing
node_viewer_app -->|"manages control"| node_viewer_control
node_viewer_app -->|"starts receiver"| node_viewer_data
node_viewer_app -->|"initializes decoder"| node_decoder
node_viewer_app -->|"initializes renderer"| node_renderer
node_viewer_app -->|"monitors connection"| node_reconnect
node_discovery -->|"provides host address"| node_quic_client
node_quic_client -->|"connects over QUIC"| node_network_peer
node_quic_server -->|"listens over QUIC"| node_network_peer
node_viewer_data -->|"reassembles fragments"| node_framing
node_viewer_data -->|"queues frames"| node_frame_queue
node_viewer_data -->|"reports timing"| node_viewer_control
node_viewer_control -->|"frames messages"| node_protocol
node_host_control -->|"frames messages"| node_protocol
node_viewer_control -->|"exchanges control"| node_host_control
node_viewer_pairing -->|"exchanges pairing"| node_host_control
node_frame_queue -->|"supplies frames"| node_decoder
node_decoder -->|"hardware decodes"| node_windows_decode
node_decoder -->|"delivers decoded frames"| node_renderer
node_renderer -->|"presents frames"| node_windows_render
node_viewer_abr -->|"exports feedback"| node_viewer_control
node_host_control -->|"provides feedback"| node_host_abr
node_host_abr -->|"calculates bitrate"| node_abr_engine
node_host_abr -->|"adjusts bitrate"| node_encoder
node_host_clock -->|"reports timing"| node_host_control
node_viewer_app -->|"collects statistics"| node_viewer_abr

click node_host_app "https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/app.rs"
click node_capture "https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/capture.rs"
click node_encoder "https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/encode.rs"
click node_host_session "https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/session/mod.rs"
click node_host_control "https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/network/control.rs"
click node_host_data "https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/network/data.rs"
click node_host_abr "https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/abr.rs"
click node_host_clock "https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/clock.rs"
click node_host_ui "https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/ui/mod.rs"
click node_viewer_app "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/app.rs"
click node_discovery "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/discovery/mod.rs"
click node_viewer_pairing "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/pairing/mod.rs"
click node_viewer_control "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/network/control.rs"
click node_viewer_data "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/network/data.rs"
click node_frame_queue "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/frame_queue.rs"
click node_decoder "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/decoder.rs"
click node_renderer "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/renderer.rs"
click node_viewer_abr "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/abr/feedback.rs"
click node_reconnect "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/reconnect/watchdog.rs"
click node_quic_server "https://github.com/ad1th/renderd/blob/main/crates/renderd-net/src/server.rs"
click node_quic_client "https://github.com/ad1th/renderd/blob/main/crates/renderd-net/src/client.rs"
click node_protocol "https://github.com/ad1th/renderd/blob/main/crates/renderd-proto/src/envelope.rs"
click node_framing "https://github.com/ad1th/renderd/blob/main/crates/renderd-frame/src/reassembly.rs"
click node_abr_engine "https://github.com/ad1th/renderd/blob/main/crates/renderd-abr/src/engine.rs"
click node_config "https://github.com/ad1th/renderd/blob/main/crates/renderd-config/src/lib.rs"
click node_sc_capture "https://github.com/ad1th/renderd/blob/main/crates/renderd-sc-sys/src/stream.rs"
click node_vt_codec "https://github.com/ad1th/renderd/blob/main/crates/renderd-vt-sys/src/session.rs"
click node_windows_decode "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/decode/mf_decode.rs"
click node_windows_render "https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/render/d3d12_renderer.rs"

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_host_app,node_capture,node_encoder,node_host_session,node_host_control,node_host_data,node_host_abr,node_host_clock,node_host_ui,node_viewer_user toneBlue
class node_viewer_app,node_discovery,node_viewer_pairing,node_viewer_control,node_viewer_data,node_frame_queue,node_decoder,node_renderer,node_viewer_abr,node_reconnect toneAmber
class node_quic_server,node_quic_client toneMint
class node_protocol,node_framing,node_abr_engine,node_config toneRose
class node_sc_capture,node_vt_codec,node_windows_decode,node_windows_render,node_network_peer toneIndigo
```

## Components

### macOS Host

- [Host App](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/app.rs): `crates/renderd-host/src/app.rs`
- [Capture Pipeline](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/capture.rs): `crates/renderd-host/src/capture.rs`
- [Encode Pipeline](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/encode.rs): `crates/renderd-host/src/encode.rs`
- [Host Session](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/session/mod.rs): `crates/renderd-host/src/session/mod.rs`
- [Control Dispatcher](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/network/control.rs): `crates/renderd-host/src/network/control.rs`
- [Data Sender](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/network/data.rs): `crates/renderd-host/src/network/data.rs`
- [ABR Manager](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/abr.rs): `crates/renderd-host/src/abr.rs`
- [Clock Controller](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/clock.rs): `crates/renderd-host/src/clock.rs`
- [Host UI](https://github.com/ad1th/renderd/blob/main/crates/renderd-host/src/ui/mod.rs): `crates/renderd-host/src/ui/mod.rs`

### Windows Viewer

- [Viewer App](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/app.rs): `crates/renderd-viewer/src/app.rs`
- [Host Discovery](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/discovery/mod.rs): `crates/renderd-viewer/src/discovery/mod.rs`
- [Pairing](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/pairing/mod.rs): `crates/renderd-viewer/src/pairing/mod.rs`
- [Viewer Control](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/network/control.rs): `crates/renderd-viewer/src/network/control.rs`
- [Datagram Receiver](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/network/data.rs): `crates/renderd-viewer/src/network/data.rs`
- [Frame Queue](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/frame_queue.rs): `crates/renderd-viewer/src/frame_queue.rs`
- [Video Decoder](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/decoder.rs): `crates/renderd-viewer/src/decoder.rs`
- [Renderer](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/renderer.rs): `crates/renderd-viewer/src/renderer.rs`
- [ABR Feedback](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/abr/feedback.rs): `crates/renderd-viewer/src/abr/feedback.rs`
- [Reconnect Watchdog](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/reconnect/watchdog.rs): `crates/renderd-viewer/src/reconnect/watchdog.rs`

### Peer Transport

- [QUIC Server](https://github.com/ad1th/renderd/blob/main/crates/renderd-net/src/server.rs): `crates/renderd-net/src/server.rs`
- [QUIC Client](https://github.com/ad1th/renderd/blob/main/crates/renderd-net/src/client.rs): `crates/renderd-net/src/client.rs`

### Shared Runtime

- [Control Protocol](https://github.com/ad1th/renderd/blob/main/crates/renderd-proto/src/envelope.rs): `crates/renderd-proto/src/envelope.rs`
- [Frame Reassembly](https://github.com/ad1th/renderd/blob/main/crates/renderd-frame/src/reassembly.rs): `crates/renderd-frame/src/reassembly.rs`
- [ABR Engine](https://github.com/ad1th/renderd/blob/main/crates/renderd-abr/src/engine.rs): `crates/renderd-abr/src/engine.rs`
- [Configuration](https://github.com/ad1th/renderd/blob/main/crates/renderd-config/src/lib.rs): `crates/renderd-config/src/lib.rs`

### Platform Integrations

- [ScreenCaptureKit](https://github.com/ad1th/renderd/blob/main/crates/renderd-sc-sys/src/stream.rs): `crates/renderd-sc-sys/src/stream.rs`
- [VideoToolbox](https://github.com/ad1th/renderd/blob/main/crates/renderd-vt-sys/src/session.rs): `crates/renderd-vt-sys/src/session.rs`
- [Windows Decoder](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/decode/mf_decode.rs): `crates/renderd-viewer/src/decode/mf_decode.rs`
- [D3D12 Renderer](https://github.com/ad1th/renderd/blob/main/crates/renderd-viewer/src/render/d3d12_renderer.rs): `crates/renderd-viewer/src/render/d3d12_renderer.rs`

### Other components

- **Viewer User**
- **Peer Network**

## Connections

- Viewer User → Viewer App: starts viewer
- Viewer App → Configuration: loads settings
- Host App → Configuration: loads settings
- Host App → Capture Pipeline: starts capture
- Host App → Encode Pipeline: starts encoding
- Host App → Host Session: manages lifecycle
- Host App → Control Dispatcher: dispatches control
- Host App → Data Sender: starts sender
- Host App → QUIC Server: accepts connections
- Host App → Host UI: updates UI
- Capture Pipeline → ScreenCaptureKit: captures frames
- Encode Pipeline → VideoToolbox: encodes video
- Data Sender → Encode Pipeline: reads encoded frames
- Data Sender → Frame Reassembly: fragments frames
- Data Sender → QUIC Server: sends datagrams
- Viewer App → Host Discovery: finds hosts
- Viewer App → QUIC Client: connects to host
- Viewer App → Pairing: runs pairing
- Viewer App → Viewer Control: manages control
- Viewer App → Datagram Receiver: starts receiver
- Viewer App → Video Decoder: initializes decoder
- Viewer App → Renderer: initializes renderer
- Viewer App → Reconnect Watchdog: monitors connection
- Host Discovery → QUIC Client: provides host address
- QUIC Client → Peer Network: connects over QUIC
- QUIC Server → Peer Network: listens over QUIC
- Datagram Receiver → Frame Reassembly: reassembles fragments
- Datagram Receiver → Frame Queue: queues frames
- Datagram Receiver → Viewer Control: reports timing
- Viewer Control → Control Protocol: frames messages
- Control Dispatcher → Control Protocol: frames messages
- Viewer Control → Control Dispatcher: exchanges control
- Pairing → Control Dispatcher: exchanges pairing
- Frame Queue → Video Decoder: supplies frames
- Video Decoder → Windows Decoder: hardware decodes
- Video Decoder → Renderer: delivers decoded frames
- Renderer → D3D12 Renderer: presents frames
- ABR Feedback → Viewer Control: exports feedback
- Control Dispatcher → ABR Manager: provides feedback
- ABR Manager → ABR Engine: calculates bitrate
- ABR Manager → Encode Pipeline: adjusts bitrate
- Clock Controller → Control Dispatcher: reports timing
- Viewer App → ABR Feedback: collects statistics
