# xmorox/netpix architecture

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

## Overview

Netpix captures or loads packet data, parses network protocols, and serves it to a browser-based analysis and visualization client. The primary workflow is CLI source selection → packet capture/log ingestion → WebSocket delivery → client stream analysis, filtering, tables, and plots. The tree and excerpts establish the server and capture links; several client and protocol internals are indexed but unsampled, so their detailed wiring is not asserted.

Main entry points: [`client/src/app.rs`](https://github.com/xmorox/netpix/blob/main/client/src/app.rs) (Analysis app), [`common/src/packet.rs`](https://github.com/xmorox/netpix/blob/main/common/src/packet.rs) (Packet model), [`src/sniffer.rs`](https://github.com/xmorox/netpix/blob/main/src/sniffer.rs) (Packet sources), [`src/server/handler.rs`](https://github.com/xmorox/netpix/blob/main/src/server/handler.rs) (Message handlers)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingest["Capture and ingestion"]
  node_cli["CLI commands<br/>[main.rs]"]
  node_run["Run command<br/>[run.rs]"]
  node_sniffer["Packet sources<br/>[sniffer.rs]"]
end

subgraph group_server["Server delivery"]
  node_websocket["WebSocket server<br/>[server.rs]"]
  node_handlers["Message handlers<br/>[handler.rs]"]
  node_clients["Client sessions<br/>[client.rs]"]
end

subgraph group_protocol["Protocol parsing"]
  node_logparser["RTC log parser<br/>[parser.rs]"]
  node_mpegts["MPEG-TS parsing<br/>[mpegts.rs]"]
  node_psi["PSI tables<br/>[psi.rs]"]
  node_pat["PAT sections<br/>[fragmentary_pat.rs]"]
  node_pmt["PMT sections<br/>[fragmentary_pmt.rs]"]
  node_rtp["RTP parsing<br/>[rtp.rs]"]
  node_rtcp["RTCP parsing<br/>[mod.rs]"]
  node_stun["STUN parsing<br/>[stun.rs]"]
end

subgraph group_client["Analysis client"]
  node_wasm["Browser entry<br/>[main.rs]"]
  node_app["Analysis app<br/>[app.rs]"]
  node_streams["Stream analysis<br/>[streams.rs]"]
  node_filters["Filter system<br/>[parser.rs]"]
  node_tables["Packet tables<br/>[tables.rs]"]
  node_plots["Stream plots"]
end

subgraph group_shared["Shared data"]
  node_packet["Packet model<br/>[packet.rs]"]
end

node_operator(("Operator"))
node_browser(("Analyst"))

node_operator -->|"runs"| node_cli
node_cli -.->|"dispatches"| node_run
node_run -->|"starts capture"| node_sniffer
node_run -->|"starts server"| node_websocket
node_sniffer -->|"builds packets"| node_packet
node_sniffer -->|"reads RTC logs"| node_logparser
node_websocket -->|"configures routes"| node_handlers
node_websocket -->|"initializes sessions"| node_clients
node_clients -->|"handles messages"| node_handlers
node_handlers -->|"reads packets"| node_sniffer
node_handlers -->|"updates queues"| node_clients
node_wasm -->|"starts app"| node_app
node_app -.->|"uses streams"| node_streams
node_app -.->|"provides tables"| node_tables
node_app -.->|"provides plots"| node_plots
node_plots -->|"uses packet streams"| node_streams
node_app -.->|"uses filtering"| node_filters
node_browser -.->|"opens client"| node_wasm
node_mpegts -.->|"parses PSI"| node_psi
node_psi -->|"assembles PAT"| node_pat
node_psi -->|"assembles PMT"| node_pmt
node_packet -.->|"supports parsing"| node_mpegts
node_packet -.->|"supports parsing"| node_rtp
node_packet -.->|"supports parsing"| node_rtcp
node_packet -.->|"supports parsing"| node_stun

click node_cli "https://github.com/xmorox/netpix/blob/main/src/main.rs"
click node_run "https://github.com/xmorox/netpix/blob/main/src/cmd/run.rs"
click node_sniffer "https://github.com/xmorox/netpix/blob/main/src/sniffer.rs"
click node_logparser "https://github.com/xmorox/netpix/blob/main/log_parser/src/parser.rs"
click node_websocket "https://github.com/xmorox/netpix/blob/main/src/server.rs"
click node_handlers "https://github.com/xmorox/netpix/blob/main/src/server/handler.rs"
click node_clients "https://github.com/xmorox/netpix/blob/main/src/server/client.rs"
click node_packet "https://github.com/xmorox/netpix/blob/main/common/src/packet.rs"
click node_mpegts "https://github.com/xmorox/netpix/blob/main/common/src/mpegts.rs"
click node_psi "https://github.com/xmorox/netpix/blob/main/common/src/mpegts/psi.rs"
click node_pat "https://github.com/xmorox/netpix/blob/main/common/src/mpegts/psi/pat/fragmentary_pat.rs"
click node_pmt "https://github.com/xmorox/netpix/blob/main/common/src/mpegts/psi/pmt/fragmentary_pmt.rs"
click node_rtp "https://github.com/xmorox/netpix/blob/main/common/src/rtp.rs"
click node_rtcp "https://github.com/xmorox/netpix/blob/main/common/src/rtcp/mod.rs"
click node_stun "https://github.com/xmorox/netpix/blob/main/common/src/stun.rs"
click node_wasm "https://github.com/xmorox/netpix/blob/main/client/src/main.rs"
click node_app "https://github.com/xmorox/netpix/blob/main/client/src/app.rs"
click node_streams "https://github.com/xmorox/netpix/blob/main/client/src/streams.rs"
click node_filters "https://github.com/xmorox/netpix/blob/main/client/src/filter_system/parser.rs"
click node_tables "https://github.com/xmorox/netpix/blob/main/client/src/app/tables.rs"
click node_plots "https://github.com/xmorox/netpix/blob/main/client/src/app/plots/rtp_streams_plot.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_run,node_sniffer toneBlue
class node_websocket,node_handlers,node_clients toneAmber
class node_logparser,node_mpegts,node_psi,node_pat,node_pmt,node_rtp,node_rtcp,node_stun toneMint
class node_wasm,node_app,node_streams,node_filters,node_tables,node_plots toneRose
class node_packet,node_operator,node_browser toneIndigo
```

## Components

### Capture and ingestion

- [CLI commands](https://github.com/xmorox/netpix/blob/main/src/main.rs): `src/main.rs`
- [Run command](https://github.com/xmorox/netpix/blob/main/src/cmd/run.rs): `src/cmd/run.rs`
- [Packet sources](https://github.com/xmorox/netpix/blob/main/src/sniffer.rs): `src/sniffer.rs`

### Server delivery

- [WebSocket server](https://github.com/xmorox/netpix/blob/main/src/server.rs): `src/server.rs`
- [Message handlers](https://github.com/xmorox/netpix/blob/main/src/server/handler.rs): `src/server/handler.rs`
- [Client sessions](https://github.com/xmorox/netpix/blob/main/src/server/client.rs): `src/server/client.rs`

### Protocol parsing

- [RTC log parser](https://github.com/xmorox/netpix/blob/main/log_parser/src/parser.rs): `log_parser/src/parser.rs`
- [MPEG-TS parsing](https://github.com/xmorox/netpix/blob/main/common/src/mpegts.rs): `common/src/mpegts.rs`
- [PSI tables](https://github.com/xmorox/netpix/blob/main/common/src/mpegts/psi.rs): `common/src/mpegts/psi.rs`
- [PAT sections](https://github.com/xmorox/netpix/blob/main/common/src/mpegts/psi/pat/fragmentary_pat.rs): `common/src/mpegts/psi/pat/fragmentary_pat.rs`
- [PMT sections](https://github.com/xmorox/netpix/blob/main/common/src/mpegts/psi/pmt/fragmentary_pmt.rs): `common/src/mpegts/psi/pmt/fragmentary_pmt.rs`
- [RTP parsing](https://github.com/xmorox/netpix/blob/main/common/src/rtp.rs): `common/src/rtp.rs`
- [RTCP parsing](https://github.com/xmorox/netpix/blob/main/common/src/rtcp/mod.rs): `common/src/rtcp/mod.rs`
- [STUN parsing](https://github.com/xmorox/netpix/blob/main/common/src/stun.rs): `common/src/stun.rs`

### Analysis client

- [Browser entry](https://github.com/xmorox/netpix/blob/main/client/src/main.rs): `client/src/main.rs`
- [Analysis app](https://github.com/xmorox/netpix/blob/main/client/src/app.rs): `client/src/app.rs`
- [Stream analysis](https://github.com/xmorox/netpix/blob/main/client/src/streams.rs): `client/src/streams.rs`
- [Filter system](https://github.com/xmorox/netpix/blob/main/client/src/filter_system/parser.rs): `client/src/filter_system/parser.rs`
- [Packet tables](https://github.com/xmorox/netpix/blob/main/client/src/app/tables.rs): `client/src/app/tables.rs`
- [Stream plots](https://github.com/xmorox/netpix/blob/main/client/src/app/plots/rtp_streams_plot.rs): `client/src/app/plots/rtp_streams_plot.rs`

### Shared data

- [Packet model](https://github.com/xmorox/netpix/blob/main/common/src/packet.rs): `common/src/packet.rs`

### Other components

- **Operator**
- **Analyst**

## Connections

- Operator → CLI commands: runs (evidence: `src/main.rs`)
- CLI commands → Run command: dispatches (evidence: `src/main.rs`)
- Run command → Packet sources: starts capture (evidence: `src/cmd/run.rs`)
- Run command → WebSocket server: starts server (evidence: `src/cmd/run.rs`)
- Packet sources → Packet model: builds packets (evidence: `src/sniffer.rs`)
- Packet sources → RTC log parser: reads RTC logs (evidence: `src/sniffer.rs`)
- WebSocket server → Message handlers: configures routes (evidence: `src/server.rs`)
- WebSocket server → Client sessions: initializes sessions (evidence: `src/server.rs`)
- Client sessions → Message handlers: handles messages (evidence: `src/server/client.rs`)
- Message handlers → Packet sources: reads packets (evidence: `src/server/handler.rs`)
- Message handlers → Client sessions: updates queues (evidence: `src/server/handler.rs`)
- Browser entry → Analysis app: starts app (evidence: `client/src/main.rs`)
- Analysis app → Stream analysis: uses streams (evidence: `client/src/app.rs`)
- Analysis app → Packet tables: provides tables (evidence: `client/src/app.rs`)
- Analysis app → Stream plots: provides plots (evidence: `client/src/app.rs`)
- Stream plots → Stream analysis: uses packet streams (evidence: `client/src/app/plots/rtp_streams_plot.rs`)
- Analysis app → Filter system: uses filtering (evidence: `client/src/app.rs`)
- Analyst → Browser entry: opens client
- MPEG-TS parsing → PSI tables: parses PSI
- PSI tables → PAT sections: assembles PAT (evidence: `common/src/mpegts/psi/pat/fragmentary_pat.rs`)
- PSI tables → PMT sections: assembles PMT (evidence: `common/src/mpegts/psi/pmt/fragmentary_pmt.rs`)
- Packet model → MPEG-TS parsing: supports parsing
- Packet model → RTP parsing: supports parsing
- Packet model → RTCP parsing: supports parsing
- Packet model → STUN parsing: supports parsing
