# chris-ritsen/network-audio-controller architecture

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

- Interactive diagram: https://gitdiagram.com/chris-ritsen/network-audio-controller
- Repository: https://github.com/chris-ritsen/network-audio-controller

## Overview

NetAudio provides CLI and browser control, a persistent daemon, and a shared Rust protocol core for Dante discovery, routing, configuration, and monitoring. A typical workflow is a user request through the CLI or web interface, daemon orchestration, device operations over the network, then state or events returned to the client. The README also documents native iOS control, DDM, presets, and automation; these are retained as capability branches. Some links reflect README documentation because their implementing source was not sampled.

Main entry points: [`packages/netaudio/src/netaudio/dante/application.py`](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/dante/application.py) (Dante application), [`packages/netaudio-core/src/client.rs`](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/client.rs) (Rust client), [`packages/netaudio/src/netaudio/daemon/server.py`](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/daemon/server.py) (Daemon runtime), [`packages/netaudio/src/netaudio/cli.py`](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/cli.py) (Command line)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interfaces["User interfaces"]
  node_cli["Command line<br/>[cli.py]"]
  node_web_ui["Web interface<br/>[app.js]"]
  node_http_api["HTTP API<br/>[api.py]"]
  node_native_app["Native iOS app"]
end

subgraph group_daemon["Daemon services"]
  node_daemon_server["Daemon runtime<br/>[server.py]"]
  node_event_dispatch["Event dispatcher<br/>[events.py]"]
  node_event_history[("Event history<br/>[journal.py]")]
end

subgraph group_dante["Dante operations"]
  node_dante_app["Dante application<br/>[application.py]"]
  node_discovery["Device discovery<br/>[discovery.py]"]
  node_notifications["Status notifications"]
  node_shure["Shure integration<br/>[manager.py]"]
end

subgraph group_core["Protocol core"]
  node_rust_client["Rust client<br/>[client.rs]"]
  node_command_specs["Command specifications<br/>[command_spec.rs]"]
  node_packet_parser["Packet parser<br/>[parser.rs]"]
  node_protocol["Protocol encoding<br/>[protocol.rs]"]
  node_bytes["Byte utilities<br/>[bytes.rs]"]
  node_rust_ffi["C interface<br/>[client_actions.rs]"]
end

subgraph group_capabilities["Product capabilities"]
  node_ddm["DDM control<br/>[controller.py]"]
  node_presets["Device presets<br/>[loading.py]"]
  node_monitoring["Monitoring<br/>[operations.py]"]
end

node_cli_user(("CLI user"))
node_browser_user(("Browser user"))
node_ios_user(("iOS user"))
node_dante_devices(("Dante devices"))
node_ddm_service(("DDM network"))

node_cli_user -->|"invokes"| node_cli
node_browser_user -->|"uses"| node_web_ui
node_ios_user -->|"uses"| node_native_app
node_cli -.->|"requests control"| node_daemon_server
node_web_ui -.->|"requests data"| node_http_api
node_http_api -.->|"routes requests"| node_daemon_server
node_daemon_server -->|"orchestrates"| node_dante_app
node_daemon_server -.->|"publishes events"| node_event_dispatch
node_event_dispatch -.->|"records events"| node_event_history
node_dante_app -.->|"discovers devices"| node_discovery
node_dante_app -.->|"handles status"| node_notifications
node_notifications -->|"parses packets"| node_packet_parser
node_dante_app -.->|"sends commands"| node_rust_client
node_rust_client -->|"uses specifications"| node_command_specs
node_rust_client -->|"builds packets"| node_protocol
node_packet_parser -->|"validates envelopes"| node_protocol
node_packet_parser -->|"reads fields"| node_bytes
node_rust_ffi -->|"invokes client"| node_rust_client
node_rust_client -->|"exchanges packets"| node_dante_devices
node_dante_app -->|"controls and monitors"| node_dante_devices
node_native_app -->|"controls directly"| node_dante_devices
node_native_app -->|"supports managed networks"| node_ddm_service
node_dante_app -.->|"uses managed control"| node_ddm
node_ddm -->|"controls devices"| node_ddm_service
node_cli -->|"applies presets"| node_presets
node_dante_app -->|"provides monitoring"| node_monitoring
node_dante_app -->|"integrates events"| node_shure

click node_cli "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/cli.py"
click node_web_ui "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/daemon/http/webapp/app.js"
click node_http_api "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/daemon/http/api.py"
click node_daemon_server "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/daemon/server.py"
click node_event_dispatch "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/dante/events.py"
click node_event_history "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/monitoring/journal.py"
click node_dante_app "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/dante/application.py"
click node_discovery "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/dante/discovery.py"
click node_notifications "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/dante/services/notification_packet_handlers.py"
click node_shure "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/shure/manager.py"
click node_ddm "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/ddm/controller.py"
click node_presets "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/presets/loading.py"
click node_monitoring "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/monitoring/operations.py"
click node_rust_client "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/client.rs"
click node_command_specs "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/spec/command_spec.rs"
click node_packet_parser "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/parser.rs"
click node_protocol "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/protocol.rs"
click node_bytes "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/bytes.rs"
click node_rust_ffi "https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/ffi/client_actions.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_cli,node_web_ui,node_http_api,node_native_app,node_cli_user,node_browser_user,node_ios_user toneBlue
class node_daemon_server,node_event_dispatch,node_event_history toneAmber
class node_dante_app,node_discovery,node_notifications,node_shure toneMint
class node_rust_client,node_command_specs,node_packet_parser,node_protocol,node_bytes,node_rust_ffi toneRose
class node_ddm,node_presets,node_monitoring,node_dante_devices,node_ddm_service toneIndigo
```

## Components

### User interfaces

- [Command line](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/cli.py): `packages/netaudio/src/netaudio/cli.py`
- [Web interface](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/daemon/http/webapp/app.js): `packages/netaudio/src/netaudio/daemon/http/webapp/app.js`
- [HTTP API](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/daemon/http/api.py): `packages/netaudio/src/netaudio/daemon/http/api.py`
- **Native iOS app**

### Daemon services

- [Daemon runtime](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/daemon/server.py): `packages/netaudio/src/netaudio/daemon/server.py`
- [Event dispatcher](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/dante/events.py): `packages/netaudio/src/netaudio/dante/events.py`
- [Event history](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/monitoring/journal.py): `packages/netaudio/src/netaudio/monitoring/journal.py`

### Dante operations

- [Dante application](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/dante/application.py): `packages/netaudio/src/netaudio/dante/application.py`
- [Device discovery](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/dante/discovery.py): `packages/netaudio/src/netaudio/dante/discovery.py`
- [Status notifications](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/dante/services/notification_packet_handlers.py): `packages/netaudio/src/netaudio/dante/services/notification_packet_handlers.py`
- [Shure integration](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/shure/manager.py): `packages/netaudio/src/netaudio/shure/manager.py`

### Protocol core

- [Rust client](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/client.rs): `packages/netaudio-core/src/client.rs`
- [Command specifications](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/spec/command_spec.rs): `packages/netaudio-core/src/spec/command_spec.rs`
- [Packet parser](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/parser.rs): `packages/netaudio-core/src/parser.rs`
- [Protocol encoding](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/protocol.rs): `packages/netaudio-core/src/protocol.rs`
- [Byte utilities](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/bytes.rs): `packages/netaudio-core/src/bytes.rs`
- [C interface](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio-core/src/ffi/client_actions.rs): `packages/netaudio-core/src/ffi/client_actions.rs`

### Product capabilities

- [DDM control](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/ddm/controller.py): `packages/netaudio/src/netaudio/ddm/controller.py`
- [Device presets](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/presets/loading.py): `packages/netaudio/src/netaudio/presets/loading.py`
- [Monitoring](https://github.com/chris-ritsen/network-audio-controller/blob/master/packages/netaudio/src/netaudio/monitoring/operations.py): `packages/netaudio/src/netaudio/monitoring/operations.py`

### Other components

- **CLI user**
- **Browser user**
- **iOS user**
- **Dante devices**
- **DDM network**

## Connections

- CLI user → Command line: invokes
- Browser user → Web interface: uses
- iOS user → Native iOS app: uses
- Command line → Daemon runtime: requests control
- Web interface → HTTP API: requests data
- HTTP API → Daemon runtime: routes requests (evidence: `packages/netaudio/src/netaudio/daemon/server.py`)
- Daemon runtime → Dante application: orchestrates (evidence: `packages/netaudio/src/netaudio/daemon/server.py`)
- Daemon runtime → Event dispatcher: publishes events (evidence: `packages/netaudio/src/netaudio/daemon/server.py`)
- Event dispatcher → Event history: records events
- Dante application → Device discovery: discovers devices
- Dante application → Status notifications: handles status (evidence: `packages/netaudio/src/netaudio/dante/application.py`)
- Status notifications → Packet parser: parses packets (evidence: `packages/netaudio/src/netaudio/dante/services/notification_packet_handlers.py`)
- Dante application → Rust client: sends commands
- Rust client → Command specifications: uses specifications (evidence: `packages/netaudio-core/src/client.rs`)
- Rust client → Protocol encoding: builds packets (evidence: `packages/netaudio-core/src/client.rs`)
- Packet parser → Protocol encoding: validates envelopes (evidence: `packages/netaudio-core/src/parser.rs`)
- Packet parser → Byte utilities: reads fields (evidence: `packages/netaudio-core/src/parser.rs`)
- C interface → Rust client: invokes client (evidence: `packages/netaudio-core/src/ffi/client_actions.rs`)
- Rust client → Dante devices: exchanges packets
- Dante application → Dante devices: controls and monitors
- Native iOS app → Dante devices: controls directly
- Native iOS app → DDM network: supports managed networks
- Dante application → DDM control: uses managed control
- DDM control → DDM network: controls devices
- Command line → Device presets: applies presets
- Dante application → Monitoring: provides monitoring
- Dante application → Shure integration: integrates events (evidence: `packages/netaudio/src/netaudio/shure/manager.py`)
