# waterloo-rocketry/omnibus architecture

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

- Interactive diagram: https://gitdiagram.com/waterloo-rocketry/omnibus
- Repository: https://github.com/waterloo-rocketry/omnibus
- Video tour (about a minute): https://gitdiagram.com/waterloo-rocketry/omnibus/video

## Overview

Omnibus is a real-time data bus for rocket-test sensors and telemetry. The principal workflow is sensor acquisition and formatting, message publication to the bus, then receiving components that display, forward, or log the data; logs can later be replayed or processed into exports. The graph includes major documented source, sink, dashboard, mapping, and log-processing capabilities. Several subsystem internals are unsampled, so their links are limited to the documented bus workflow rather than assumed implementation details.

Main entry points: [`src/omnibus/omnibus.py`](https://github.com/waterloo-rocketry/omnibus/blob/main/src/omnibus/omnibus.py) (Bus Messaging), [`src/omnibus/server.py`](https://github.com/waterloo-rocketry/omnibus/blob/main/src/omnibus/server.py) (Omnibus Server), [`src/websocket_server/server.py`](https://github.com/waterloo-rocketry/omnibus/blob/main/src/websocket_server/server.py) (WebSocket Server), [`tools/data_processing/main.py`](https://github.com/waterloo-rocketry/omnibus/blob/main/tools/data_processing/main.py) (Processing CLI)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_bus["Message Bus"]
  node_omnibus_server["Omnibus Server<br/>[server.py]"]
  node_omnibus_runtime["Bus Messaging<br/>[omnibus.py]"]
end

subgraph group_sources["Data Sources"]
  node_ni_source["NI DAQ<br/>[main.py]"]
  node_ljm_source["LabJack DAQ<br/>[main.py]"]
  node_parsley_source["Parsley Telemetry<br/>[main.py]"]
  node_rlcs_source["RLCS Source<br/>[main.py]"]
  node_other_sources["Other Sources"]
end

subgraph group_consumers["Live Consumers"]
  node_dashboard["Dashboard<br/>[main.py]"]
  node_dashboard_items["Display Items"]
  node_interamap["GPS Mapping"]
  node_other_sinks["Other Sinks"]
  node_websocket_server["WebSocket Server<br/>[server.py]"]
  node_bridge["WebSocket Bridge<br/>[relay.py]"]
end

subgraph group_logs["Logging And Replay"]
  node_global_logger["Global Logger<br/>[main.py]"]
  node_log_files[("Message Log")]
  node_replay["Log Replay<br/>[replay_log.py]"]
end

subgraph group_processing["Log Processing"]
  node_log_processor["Processing CLI<br/>[main.py]"]
  node_data_processing["DAQ And CAN Processing"]
  node_beta_processing["Beta Processing<br/>[main.py]"]
  node_processed_exports["Processed Exports"]
end

node_test_operators(("Test Operators"))
node_web_clients(("WebSocket Clients"))

node_ni_source -->|"sends DAQ"| node_omnibus_runtime
node_ljm_source -->|"sends DAQ"| node_omnibus_runtime
node_parsley_source -->|"sends telemetry"| node_omnibus_runtime
node_rlcs_source -->|"publishes messages"| node_omnibus_runtime
node_other_sources -->|"publish messages"| node_omnibus_runtime
node_omnibus_runtime -->|"routes messages"| node_omnibus_server
node_omnibus_server -->|"broadcasts messages"| node_dashboard
node_omnibus_server -->|"broadcasts messages"| node_interamap
node_omnibus_server -->|"broadcasts messages"| node_other_sinks
node_omnibus_server -->|"broadcasts messages"| node_global_logger
node_dashboard -->|"renders through"| node_dashboard_items
node_web_clients -->|"connects"| node_websocket_server
node_websocket_server -->|"broadcasts events"| node_web_clients
node_websocket_server -->|"relays events"| node_bridge
node_bridge -->|"forwards messages"| node_omnibus_runtime
node_global_logger -->|"writes records"| node_log_files
node_test_operators -->|"selects log"| node_replay
node_log_files -.->|"replays messages"| node_replay
node_replay -->|"publishes replay"| node_omnibus_runtime
node_test_operators -->|"requests preview or export"| node_log_processor
node_log_processor -->|"dispatches processing"| node_data_processing
node_log_processor -.->|"runs DAQ or logger"| node_beta_processing
node_data_processing -->|"writes exports"| node_processed_exports
node_beta_processing -->|"writes CSV"| node_processed_exports

click node_omnibus_server "https://github.com/waterloo-rocketry/omnibus/blob/main/src/omnibus/server.py"
click node_omnibus_runtime "https://github.com/waterloo-rocketry/omnibus/blob/main/src/omnibus/omnibus.py"
click node_ni_source "https://github.com/waterloo-rocketry/omnibus/blob/main/src/sources/ni/main.py"
click node_ljm_source "https://github.com/waterloo-rocketry/omnibus/blob/main/src/sources/ljm/main.py"
click node_parsley_source "https://github.com/waterloo-rocketry/omnibus/blob/main/src/sources/parsley/main.py"
click node_rlcs_source "https://github.com/waterloo-rocketry/omnibus/blob/main/src/sources/rlcsv3/main.py"
click node_other_sources "https://github.com/waterloo-rocketry/omnibus/tree/main/src/sources"
click node_dashboard "https://github.com/waterloo-rocketry/omnibus/blob/main/src/dashboard/main.py"
click node_dashboard_items "https://github.com/waterloo-rocketry/omnibus/tree/main/src/dashboard/items"
click node_interamap "https://github.com/waterloo-rocketry/omnibus/tree/main/src/sinks/interamap"
click node_other_sinks "https://github.com/waterloo-rocketry/omnibus/tree/main/src/sinks"
click node_websocket_server "https://github.com/waterloo-rocketry/omnibus/blob/main/src/websocket_server/server.py"
click node_bridge "https://github.com/waterloo-rocketry/omnibus/blob/main/src/bridge/relay.py"
click node_global_logger "https://github.com/waterloo-rocketry/omnibus/blob/main/src/globallog/main.py"
click node_replay "https://github.com/waterloo-rocketry/omnibus/blob/main/src/sources/replay_log/replay_log.py"
click node_log_processor "https://github.com/waterloo-rocketry/omnibus/blob/main/tools/data_processing/main.py"
click node_data_processing "https://github.com/waterloo-rocketry/omnibus/tree/main/tools/data_processing"
click node_beta_processing "https://github.com/waterloo-rocketry/omnibus/blob/main/tools/data_processing_v2_beta/main.py"

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_omnibus_server,node_omnibus_runtime,node_web_clients toneBlue
class node_ni_source,node_ljm_source,node_parsley_source,node_rlcs_source,node_other_sources toneAmber
class node_dashboard,node_dashboard_items,node_interamap,node_other_sinks,node_websocket_server,node_bridge toneMint
class node_global_logger,node_log_files,node_replay toneRose
class node_log_processor,node_data_processing,node_beta_processing,node_processed_exports,node_test_operators toneIndigo
```

## Components

### Message Bus

- [Omnibus Server](https://github.com/waterloo-rocketry/omnibus/blob/main/src/omnibus/server.py): `src/omnibus/server.py`
- [Bus Messaging](https://github.com/waterloo-rocketry/omnibus/blob/main/src/omnibus/omnibus.py): `src/omnibus/omnibus.py`

### Data Sources

- [NI DAQ](https://github.com/waterloo-rocketry/omnibus/blob/main/src/sources/ni/main.py): `src/sources/ni/main.py`
- [LabJack DAQ](https://github.com/waterloo-rocketry/omnibus/blob/main/src/sources/ljm/main.py): `src/sources/ljm/main.py`
- [Parsley Telemetry](https://github.com/waterloo-rocketry/omnibus/blob/main/src/sources/parsley/main.py): `src/sources/parsley/main.py`
- [RLCS Source](https://github.com/waterloo-rocketry/omnibus/blob/main/src/sources/rlcsv3/main.py): `src/sources/rlcsv3/main.py`
- [Other Sources](https://github.com/waterloo-rocketry/omnibus/tree/main/src/sources): `src/sources`

### Live Consumers

- [Dashboard](https://github.com/waterloo-rocketry/omnibus/blob/main/src/dashboard/main.py): `src/dashboard/main.py`
- [Display Items](https://github.com/waterloo-rocketry/omnibus/tree/main/src/dashboard/items): `src/dashboard/items`
- [GPS Mapping](https://github.com/waterloo-rocketry/omnibus/tree/main/src/sinks/interamap): `src/sinks/interamap`
- [Other Sinks](https://github.com/waterloo-rocketry/omnibus/tree/main/src/sinks): `src/sinks`
- [WebSocket Server](https://github.com/waterloo-rocketry/omnibus/blob/main/src/websocket_server/server.py): `src/websocket_server/server.py`
- [WebSocket Bridge](https://github.com/waterloo-rocketry/omnibus/blob/main/src/bridge/relay.py): `src/bridge/relay.py`

### Logging And Replay

- [Global Logger](https://github.com/waterloo-rocketry/omnibus/blob/main/src/globallog/main.py): `src/globallog/main.py`
- **Message Log**
- [Log Replay](https://github.com/waterloo-rocketry/omnibus/blob/main/src/sources/replay_log/replay_log.py): `src/sources/replay_log/replay_log.py`

### Log Processing

- [Processing CLI](https://github.com/waterloo-rocketry/omnibus/blob/main/tools/data_processing/main.py): `tools/data_processing/main.py`
- [DAQ And CAN Processing](https://github.com/waterloo-rocketry/omnibus/tree/main/tools/data_processing): `tools/data_processing`
- [Beta Processing](https://github.com/waterloo-rocketry/omnibus/blob/main/tools/data_processing_v2_beta/main.py): `tools/data_processing_v2_beta/main.py`
- **Processed Exports**

### Other components

- **Test Operators**
- **WebSocket Clients**

## Connections

- NI DAQ → Bus Messaging: sends DAQ
- LabJack DAQ → Bus Messaging: sends DAQ
- Parsley Telemetry → Bus Messaging: sends telemetry
- RLCS Source → Bus Messaging: publishes messages
- Other Sources → Bus Messaging: publish messages
- Bus Messaging → Omnibus Server: routes messages
- Omnibus Server → Dashboard: broadcasts messages
- Omnibus Server → GPS Mapping: broadcasts messages
- Omnibus Server → Other Sinks: broadcasts messages
- Omnibus Server → Global Logger: broadcasts messages
- Dashboard → Display Items: renders through
- WebSocket Clients → WebSocket Server: connects
- WebSocket Server → WebSocket Clients: broadcasts events
- WebSocket Server → WebSocket Bridge: relays events
- WebSocket Bridge → Bus Messaging: forwards messages
- Global Logger → Message Log: writes records
- Test Operators → Log Replay: selects log
- Message Log → Log Replay: replays messages
- Log Replay → Bus Messaging: publishes replay
- Test Operators → Processing CLI: requests preview or export
- Processing CLI → DAQ And CAN Processing: dispatches processing
- Processing CLI → Beta Processing: runs DAQ or logger
- DAQ And CAN Processing → Processed Exports: writes exports
- Beta Processing → Processed Exports: writes CSV
