# waffleslop/potacat architecture

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

- Interactive diagram: https://gitdiagram.com/waffleslop/potacat
- Repository: https://github.com/waffleslop/potacat

## Overview

POTACAT is a desktop amateur-radio operating application: operators combine live activity spots, tune a connected rig, and prepare QSO logs, with remote operation and digital-mode tools extending that workflow. The README documents the user-facing flow and major capabilities; filenames in the tree support the subsystem map. Because the application entry point and most wiring are not included in the excerpts, edges show documented workflow relationships rather than asserting unsampled implementation calls.

Main entry points: [`lib/call-filter.js`](https://github.com/waffleslop/potacat/blob/master/lib/call-filter.js) (Spot filtering), [`lib/echocat-web-gate.js`](https://github.com/waffleslop/potacat/blob/master/lib/echocat-web-gate.js) (ECHOCAT gateway), [`lib/qso-log.js`](https://github.com/waffleslop/potacat/blob/master/lib/qso-log.js) (QSO logging), [`lib/pota.js`](https://github.com/waffleslop/potacat/blob/master/lib/pota.js) (POTA spots)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_spotting["Spotting and discovery"]
  node_pota["POTA spots<br/>[pota.js]"]
  node_sota["SOTA spots<br/>[llota.js]"]
  node_gma["GMA spots<br/>[gma.js]"]
  node_dxcluster["DX cluster<br/>[dxcluster.js]"]
  node_rbn["RBN spots<br/>[rbn.js]"]
  node_spot_filter["Spot filtering<br/>[call-filter.js]"]
end

subgraph group_station["Radio and logging"]
  node_rig["Connected radio<br/>[cat.js]"]
  node_rig_protocols["Rig protocols<br/>[civ-codec.js]"]
  node_qso_log["QSO logging<br/>[qso-log.js]"]
  node_adif["ADIF exchange<br/>[adif.js]"]
end

subgraph group_remote["Remote station"]
  node_echocat["ECHOCAT gateway"]
  node_cloud_tunnel["Cloud tunnel<br/>[cloud-tunnel.js]"]
  node_cloud_sync["Cloud sync<br/>[cloud-sync.js]"]
  node_remote_audio["Remote audio"]
end

subgraph group_modes["Digital modes"]
  node_ft8["FT8 and FT4<br/>[ft8-engine.js]"]
  node_js8["JS8<br/>[js8-engine.js]"]
  node_psk["PSK31<br/>[psk-engine.js]"]
  node_sstv["SSTV<br/>[sstv-engine.js]"]
end

subgraph group_reference["Operating data"]
  node_ham_reference["Band and callsign data<br/>[bands.js]"]
  node_park_data[("Park data<br/>[pota-parks-db.js]")]
end

node_operator(("Radio operator"))
node_spot_networks(("Spot networks"))
node_phone(("Phone operator"))

node_spot_networks -->|"provide spots"| node_pota
node_spot_networks -->|"provide spots"| node_sota
node_spot_networks -->|"provide spots"| node_gma
node_spot_networks -->|"provide spots"| node_dxcluster
node_spot_networks -->|"provide spots"| node_rbn
node_pota -->|"filter spots"| node_spot_filter
node_sota -->|"filter spots"| node_spot_filter
node_gma -->|"filter spots"| node_spot_filter
node_dxcluster -->|"filter spots"| node_spot_filter
node_rbn -->|"filter spots"| node_spot_filter
node_operator -->|"select spot"| node_spot_filter
node_spot_filter -->|"tune radio"| node_rig
node_rig -->|"use protocol"| node_rig_protocols
node_spot_filter -->|"prefill QSO"| node_qso_log
node_operator -->|"complete QSO"| node_qso_log
node_qso_log -->|"export log"| node_adif
node_phone -->|"connect remotely"| node_echocat
node_echocat -->|"relay access"| node_cloud_tunnel
node_echocat -->|"sync station"| node_cloud_sync
node_echocat -->|"bridge audio"| node_remote_audio
node_operator -->|"operate mode"| node_ft8
node_operator -->|"operate mode"| node_js8
node_operator -->|"operate mode"| node_psk
node_operator -->|"operate mode"| node_sstv
node_spot_filter -.->|"use band data"| node_ham_reference
node_spot_filter -.->|"use park data"| node_park_data

click node_pota "https://github.com/waffleslop/potacat/blob/master/lib/pota.js"
click node_sota "https://github.com/waffleslop/potacat/blob/master/lib/llota.js"
click node_gma "https://github.com/waffleslop/potacat/blob/master/lib/gma.js"
click node_dxcluster "https://github.com/waffleslop/potacat/blob/master/lib/dxcluster.js"
click node_rbn "https://github.com/waffleslop/potacat/blob/master/lib/rbn.js"
click node_spot_filter "https://github.com/waffleslop/potacat/blob/master/lib/call-filter.js"
click node_rig "https://github.com/waffleslop/potacat/blob/master/lib/cat.js"
click node_rig_protocols "https://github.com/waffleslop/potacat/blob/master/lib/codecs/civ-codec.js"
click node_qso_log "https://github.com/waffleslop/potacat/blob/master/lib/qso-log.js"
click node_adif "https://github.com/waffleslop/potacat/blob/master/lib/adif.js"
click node_echocat "https://github.com/waffleslop/potacat/blob/master/lib/echocat-web-gate.js"
click node_cloud_tunnel "https://github.com/waffleslop/potacat/blob/master/lib/cloud-tunnel.js"
click node_cloud_sync "https://github.com/waffleslop/potacat/blob/master/lib/cloud-sync.js"
click node_remote_audio "https://github.com/waffleslop/potacat/blob/master/lib/mercury-audio-bridge.js"
click node_ft8 "https://github.com/waffleslop/potacat/blob/master/lib/ft8-engine.js"
click node_js8 "https://github.com/waffleslop/potacat/blob/master/lib/js8-engine.js"
click node_psk "https://github.com/waffleslop/potacat/blob/master/lib/psk-engine.js"
click node_sstv "https://github.com/waffleslop/potacat/blob/master/lib/sstv-engine.js"
click node_ham_reference "https://github.com/waffleslop/potacat/blob/master/lib/bands.js"
click node_park_data "https://github.com/waffleslop/potacat/blob/master/lib/pota-parks-db.js"

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_pota,node_sota,node_gma,node_dxcluster,node_rbn,node_spot_filter toneBlue
class node_rig,node_rig_protocols,node_qso_log,node_adif toneAmber
class node_echocat,node_cloud_tunnel,node_cloud_sync,node_remote_audio toneMint
class node_ft8,node_js8,node_psk,node_sstv toneRose
class node_ham_reference,node_park_data,node_operator,node_spot_networks,node_phone toneIndigo
```

## Components

### Spotting and discovery

- [POTA spots](https://github.com/waffleslop/potacat/blob/master/lib/pota.js): `lib/pota.js`
- [SOTA spots](https://github.com/waffleslop/potacat/blob/master/lib/llota.js): `lib/llota.js`
- [GMA spots](https://github.com/waffleslop/potacat/blob/master/lib/gma.js): `lib/gma.js`
- [DX cluster](https://github.com/waffleslop/potacat/blob/master/lib/dxcluster.js): `lib/dxcluster.js`
- [RBN spots](https://github.com/waffleslop/potacat/blob/master/lib/rbn.js): `lib/rbn.js`
- [Spot filtering](https://github.com/waffleslop/potacat/blob/master/lib/call-filter.js): `lib/call-filter.js`

### Radio and logging

- [Connected radio](https://github.com/waffleslop/potacat/blob/master/lib/cat.js): `lib/cat.js`
- [Rig protocols](https://github.com/waffleslop/potacat/blob/master/lib/codecs/civ-codec.js): `lib/codecs/civ-codec.js`
- [QSO logging](https://github.com/waffleslop/potacat/blob/master/lib/qso-log.js): `lib/qso-log.js`
- [ADIF exchange](https://github.com/waffleslop/potacat/blob/master/lib/adif.js): `lib/adif.js`

### Remote station

- [ECHOCAT gateway](https://github.com/waffleslop/potacat/blob/master/lib/echocat-web-gate.js): `lib/echocat-web-gate.js`
- [Cloud tunnel](https://github.com/waffleslop/potacat/blob/master/lib/cloud-tunnel.js): `lib/cloud-tunnel.js`
- [Cloud sync](https://github.com/waffleslop/potacat/blob/master/lib/cloud-sync.js): `lib/cloud-sync.js`
- [Remote audio](https://github.com/waffleslop/potacat/blob/master/lib/mercury-audio-bridge.js): `lib/mercury-audio-bridge.js`

### Digital modes

- [FT8 and FT4](https://github.com/waffleslop/potacat/blob/master/lib/ft8-engine.js): `lib/ft8-engine.js`
- [JS8](https://github.com/waffleslop/potacat/blob/master/lib/js8-engine.js): `lib/js8-engine.js`
- [PSK31](https://github.com/waffleslop/potacat/blob/master/lib/psk-engine.js): `lib/psk-engine.js`
- [SSTV](https://github.com/waffleslop/potacat/blob/master/lib/sstv-engine.js): `lib/sstv-engine.js`

### Operating data

- [Band and callsign data](https://github.com/waffleslop/potacat/blob/master/lib/bands.js): `lib/bands.js`
- [Park data](https://github.com/waffleslop/potacat/blob/master/lib/pota-parks-db.js): `lib/pota-parks-db.js`

### Other components

- **Radio operator**
- **Spot networks**
- **Phone operator**

## Connections

- Spot networks → POTA spots: provide spots
- Spot networks → SOTA spots: provide spots
- Spot networks → GMA spots: provide spots
- Spot networks → DX cluster: provide spots
- Spot networks → RBN spots: provide spots
- POTA spots → Spot filtering: filter spots
- SOTA spots → Spot filtering: filter spots
- GMA spots → Spot filtering: filter spots
- DX cluster → Spot filtering: filter spots
- RBN spots → Spot filtering: filter spots
- Radio operator → Spot filtering: select spot
- Spot filtering → Connected radio: tune radio
- Connected radio → Rig protocols: use protocol
- Spot filtering → QSO logging: prefill QSO
- Radio operator → QSO logging: complete QSO
- QSO logging → ADIF exchange: export log
- Phone operator → ECHOCAT gateway: connect remotely
- ECHOCAT gateway → Cloud tunnel: relay access
- ECHOCAT gateway → Cloud sync: sync station
- ECHOCAT gateway → Remote audio: bridge audio
- Radio operator → FT8 and FT4: operate mode
- Radio operator → JS8: operate mode
- Radio operator → PSK31: operate mode
- Radio operator → SSTV: operate mode
- Spot filtering → Band and callsign data: use band data
- Spot filtering → Park data: use park data
