# davidalpert11/signalviewer architecture

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

- Interactive diagram: https://gitdiagram.com/davidalpert11/signalviewer
- Repository: https://github.com/davidalpert11/signalviewer

## Overview

Signal Viewer is an offline flight-log and test-data analysis application. Engineers open recordings in the desktop-style web UI or CLI, inspect signals and health findings, compare runs against references, and export reports or maps. The backend loads and retains recordings for analysis and serves the UI and API. README-documented capabilities also include live monitoring, fleet review, custom readers, and parameter sweeps. Some route and subsystem internals were not sampled, so their links are documented at capability level rather than presented as verified call chains.

Main entry points: [`backend/app/routes`](https://github.com/davidalpert11/signalviewer/tree/main/backend/app/routes) (API routes), [`backend/app/common.py`](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/common.py) (File opening), [`backend/signalviewer/cli.py`](https://github.com/davidalpert11/signalviewer/blob/main/backend/signalviewer/cli.py) (CLI and scripting), [`backend/app/main.py`](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/main.py) (Local API server)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interaction["User workflows"]
  node_webui["Analysis UI<br/>[App.tsx]"]
  node_cli["CLI and scripting<br/>[cli.py]"]
  node_live["Live monitoring<br/>[livewatch.py]"]
  node_fleet["Fleet review<br/>[fleet.py]"]
end

subgraph group_ingest["Data and analysis"]
  node_fileopen["File opening<br/>[common.py]"]
  node_readers["Format readers<br/>[readers.py]"]
  node_customreaders["Custom readers<br/>[userreaders.py]"]
  node_runstore[("Run and signal store<br/>[store.py]")]
  node_analysis["Signal analysis<br/>[analysis.py]"]
end

subgraph group_review["Review and outputs"]
  node_health["Health checks<br/>[health.py]"]
  node_compare["Run comparison<br/>[compare.py]"]
  node_checks["Tolerance checks<br/>[checks.py]"]
  node_maps["Maps and 3D<br/>[scene3d.py]"]
  node_reports["Reports and export<br/>[report.py]"]
  node_sweeps["Parameter sweeps"]
end

subgraph group_platform["App services"]
  node_api["Local API server<br/>[main.py]"]
  node_routes["API routes"]
  node_storage[("Local app storage<br/>[storage.py]")]
end

node_engineer(("Engineer"))

node_engineer -->|"opens and reviews"| node_webui
node_engineer -->|"runs scripts"| node_cli
node_webui -->|"uses local app"| node_api
node_cli -->|"loads recordings"| node_fileopen
node_api -->|"registers routes"| node_routes
node_routes -->|"opens files"| node_fileopen
node_fileopen -->|"opens runs"| node_runstore
node_runstore -->|"loads formats"| node_readers
node_fileopen -->|"checks reader formats"| node_customreaders
node_engineer -->|"checks flight logs"| node_health
node_engineer -->|"judges reference runs"| node_compare
node_cli -->|"runs tolerances"| node_checks
node_engineer -->|"views tracks"| node_maps
node_engineer -->|"exports results"| node_reports
node_engineer -->|"evaluates parameter runs"| node_sweeps
node_engineer -->|"monitors recordings"| node_live
node_engineer -->|"reviews multiple flights"| node_fleet
node_api -->|"manages local data"| node_storage
node_routes -->|"builds exports"| node_reports
node_routes -->|"reads signals"| node_runstore

click node_webui "https://github.com/davidalpert11/signalviewer/blob/main/frontend/src/App.tsx"
click node_cli "https://github.com/davidalpert11/signalviewer/blob/main/backend/signalviewer/cli.py"
click node_api "https://github.com/davidalpert11/signalviewer/blob/main/backend/app/main.py"
click node_routes "https://github.com/davidalpert11/signalviewer/tree/main/backend/app/routes"
click node_fileopen "https://github.com/davidalpert11/signalviewer/blob/main/backend/app/common.py"
click node_readers "https://github.com/davidalpert11/signalviewer/blob/main/backend/svcore/readers.py"
click node_customreaders "https://github.com/davidalpert11/signalviewer/blob/main/backend/app/userreaders.py"
click node_runstore "https://github.com/davidalpert11/signalviewer/blob/main/backend/app/store.py"
click node_analysis "https://github.com/davidalpert11/signalviewer/blob/main/backend/svcore/analysis.py"
click node_health "https://github.com/davidalpert11/signalviewer/blob/main/backend/svcore/health.py"
click node_compare "https://github.com/davidalpert11/signalviewer/blob/main/backend/svcore/compare.py"
click node_checks "https://github.com/davidalpert11/signalviewer/blob/main/backend/app/checks.py"
click node_maps "https://github.com/davidalpert11/signalviewer/blob/main/backend/app/scene3d.py"
click node_reports "https://github.com/davidalpert11/signalviewer/blob/main/backend/app/report.py"
click node_sweeps "https://github.com/davidalpert11/signalviewer/tree/main/backend/svcore/sweep"
click node_live "https://github.com/davidalpert11/signalviewer/blob/main/backend/app/livewatch.py"
click node_fleet "https://github.com/davidalpert11/signalviewer/blob/main/backend/app/fleet.py"
click node_storage "https://github.com/davidalpert11/signalviewer/blob/main/backend/app/storage.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_webui,node_cli,node_live,node_fleet toneBlue
class node_fileopen,node_readers,node_customreaders,node_runstore,node_analysis toneAmber
class node_health,node_compare,node_checks,node_maps,node_reports,node_sweeps toneMint
class node_api,node_routes,node_storage toneRose
class node_engineer toneIndigo
```

## Components

### User workflows

- [Analysis UI](https://github.com/davidalpert11/signalviewer/blob/main/frontend/src/App.tsx): `frontend/src/App.tsx`
- [CLI and scripting](https://github.com/davidalpert11/signalviewer/blob/main/backend/signalviewer/cli.py): `backend/signalviewer/cli.py`
- [Live monitoring](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/livewatch.py): `backend/app/livewatch.py`
- [Fleet review](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/fleet.py): `backend/app/fleet.py`

### Data and analysis

- [File opening](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/common.py): `backend/app/common.py`
- [Format readers](https://github.com/davidalpert11/signalviewer/blob/main/backend/svcore/readers.py): `backend/svcore/readers.py`
- [Custom readers](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/userreaders.py): `backend/app/userreaders.py`
- [Run and signal store](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/store.py): `backend/app/store.py`
- [Signal analysis](https://github.com/davidalpert11/signalviewer/blob/main/backend/svcore/analysis.py): `backend/svcore/analysis.py`

### Review and outputs

- [Health checks](https://github.com/davidalpert11/signalviewer/blob/main/backend/svcore/health.py): `backend/svcore/health.py`
- [Run comparison](https://github.com/davidalpert11/signalviewer/blob/main/backend/svcore/compare.py): `backend/svcore/compare.py`
- [Tolerance checks](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/checks.py): `backend/app/checks.py`
- [Maps and 3D](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/scene3d.py): `backend/app/scene3d.py`
- [Reports and export](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/report.py): `backend/app/report.py`
- [Parameter sweeps](https://github.com/davidalpert11/signalviewer/tree/main/backend/svcore/sweep): `backend/svcore/sweep`

### App services

- [Local API server](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/main.py): `backend/app/main.py`
- [API routes](https://github.com/davidalpert11/signalviewer/tree/main/backend/app/routes): `backend/app/routes`
- [Local app storage](https://github.com/davidalpert11/signalviewer/blob/main/backend/app/storage.py): `backend/app/storage.py`

### Other components

- **Engineer**

## Connections

- Engineer → Analysis UI: opens and reviews
- Engineer → CLI and scripting: runs scripts
- Analysis UI → Local API server: uses local app (evidence: `backend/app/main.py`)
- CLI and scripting → File opening: loads recordings (evidence: `backend/signalviewer/cli.py`)
- Local API server → API routes: registers routes (evidence: `backend/app/main.py`)
- API routes → File opening: opens files (evidence: `backend/app/routes/export.py`)
- File opening → Run and signal store: opens runs (evidence: `backend/app/common.py`)
- Run and signal store → Format readers: loads formats (evidence: `backend/app/store.py`)
- File opening → Custom readers: checks reader formats (evidence: `backend/app/common.py`)
- Engineer → Health checks: checks flight logs
- Engineer → Run comparison: judges reference runs
- CLI and scripting → Tolerance checks: runs tolerances (evidence: `backend/signalviewer/cli.py`)
- Engineer → Maps and 3D: views tracks
- Engineer → Reports and export: exports results
- Engineer → Parameter sweeps: evaluates parameter runs
- Engineer → Live monitoring: monitors recordings
- Engineer → Fleet review: reviews multiple flights
- Local API server → Local app storage: manages local data (evidence: `backend/app/main.py`)
- API routes → Reports and export: builds exports (evidence: `backend/app/routes/export.py`)
- API routes → Run and signal store: reads signals (evidence: `backend/app/routes/export.py`)
