# mbridak/not1mm architecture

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

- Interactive diagram: https://gitdiagram.com/mbridak/not1mm
- Repository: https://github.com/mbridak/not1mm

## Overview

Not1MM is a Qt-based amateur-radio contest logger. Operators configure a contest and station, enter contacts while operating, and review or export the resulting log. Contest plugins provide contest-specific exchange and scoring behavior; the application also offers radio control, callsign lookup, spotting, and stationing tools. The graph emphasizes the documented capabilities and the sampled main-window, log, database, and lookup relationships. Many modules are listed but not excerpted, so optional integrations and unsampled connections are omitted or marked unverified.

Main entry points: [`not1mm/__main__.py`](https://github.com/mbridak/not1mm/blob/master/not1mm/__main__.py) (Main window), [`not1mm/plugins`](https://github.com/mbridak/not1mm/tree/master/not1mm/plugins) (Contest rules), [`not1mm/logwindow.py`](https://github.com/mbridak/not1mm/blob/master/not1mm/logwindow.py) (Contact log), [`not1mm/vfo.py`](https://github.com/mbridak/not1mm/blob/master/not1mm/vfo.py) (VFO controls)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_logging["Contest logging"]
  node_main["Main window<br/>[__main__.py]"]
  node_contest_rules["Contest rules"]
  node_log_view["Contact log<br/>[logwindow.py]"]
  node_database[("SQLite log store<br/>[database.py]")]
  node_contest_common["Contest utilities<br/>[plugin_common.py]"]
end

subgraph group_operating["Radio operation"]
  node_bandmap["Bandmap<br/>[bandmap.py]"]
  node_cluster["DX cluster<br/>[clusterwindow.py]"]
  node_vfo["VFO controls<br/>[vfo.py]"]
  node_cat["CAT interfaces<br/>[cat_interface.py]"]
  node_cw["CW keying<br/>[cwinterface.py]"]
  node_rotator["Rotator control<br/>[rotator.py]"]
end

subgraph group_insights["Log insights"]
  node_lookup_service["Lookup service<br/>[lookupservice.py]"]
  node_lookup_providers["Lookup providers<br/>[lookup.py]"]
  node_check["Call checking<br/>[checkwindow.py]"]
  node_statistics["Statistics<br/>[statistics.py]"]
  node_dxcc["DXCC tracker<br/>[dxcc_tracker.py]"]
end

subgraph group_configuration["Settings and services"]
  node_preferences["Preferences<br/>[preferences.py]"]
  node_settings["Settings dialogs<br/>[settings.py]"]
  node_n1mm["Score packets<br/>[n1mm.py]"]
  node_rtc["Realtime scores<br/>[rtc_service.py]"]
end

node_operator(("Operator"))

node_operator -->|"operates"| node_main
node_main -->|"starts"| node_lookup_service
node_lookup_service -->|"queries"| node_lookup_providers
node_main -->|"dispatches"| node_log_view
node_log_view -->|"reads and edits"| node_database
node_main -->|"selects contest"| node_database
node_contest_rules -->|"uses utilities"| node_contest_common
node_main -.->|"loads rules"| node_contest_rules
node_main -->|"opens"| node_bandmap
node_main -->|"opens"| node_cluster
node_main -->|"opens"| node_vfo
node_vfo -->|"uses"| node_cat
node_main -->|"opens"| node_rotator
node_main -->|"opens"| node_check
node_main -->|"refreshes"| node_statistics
node_main -->|"refreshes"| node_dxcc
node_main -->|"loads settings"| node_preferences
node_settings -->|"reads and saves"| node_preferences
node_main -.->|"sends packets"| node_n1mm
node_main -->|"updates score XML"| node_rtc
node_rtc -.->|"reports status"| node_operator
node_main -.->|"controls keyer"| node_cw
node_main -->|"imports utilities"| node_contest_common

click node_main "https://github.com/mbridak/not1mm/blob/master/not1mm/__main__.py"
click node_contest_rules "https://github.com/mbridak/not1mm/tree/master/not1mm/plugins"
click node_log_view "https://github.com/mbridak/not1mm/blob/master/not1mm/logwindow.py"
click node_database "https://github.com/mbridak/not1mm/blob/master/not1mm/lib/database.py"
click node_contest_common "https://github.com/mbridak/not1mm/blob/master/not1mm/lib/plugin_common.py"
click node_bandmap "https://github.com/mbridak/not1mm/blob/master/not1mm/bandmap.py"
click node_cluster "https://github.com/mbridak/not1mm/blob/master/not1mm/clusterwindow.py"
click node_vfo "https://github.com/mbridak/not1mm/blob/master/not1mm/vfo.py"
click node_cat "https://github.com/mbridak/not1mm/blob/master/not1mm/lib/cat_interface.py"
click node_cw "https://github.com/mbridak/not1mm/blob/master/not1mm/lib/cwinterface.py"
click node_rotator "https://github.com/mbridak/not1mm/blob/master/not1mm/rotator.py"
click node_lookup_service "https://github.com/mbridak/not1mm/blob/master/not1mm/lookupservice.py"
click node_lookup_providers "https://github.com/mbridak/not1mm/blob/master/not1mm/lib/lookup.py"
click node_check "https://github.com/mbridak/not1mm/blob/master/not1mm/checkwindow.py"
click node_statistics "https://github.com/mbridak/not1mm/blob/master/not1mm/statistics.py"
click node_dxcc "https://github.com/mbridak/not1mm/blob/master/not1mm/dxcc_tracker.py"
click node_preferences "https://github.com/mbridak/not1mm/blob/master/not1mm/lib/preferences.py"
click node_settings "https://github.com/mbridak/not1mm/blob/master/not1mm/lib/settings.py"
click node_n1mm "https://github.com/mbridak/not1mm/blob/master/not1mm/lib/n1mm.py"
click node_rtc "https://github.com/mbridak/not1mm/blob/master/not1mm/rtc_service.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_main,node_contest_rules,node_log_view,node_database,node_contest_common toneBlue
class node_bandmap,node_cluster,node_vfo,node_cat,node_cw,node_rotator toneAmber
class node_lookup_service,node_lookup_providers,node_check,node_statistics,node_dxcc toneMint
class node_preferences,node_settings,node_n1mm,node_rtc toneRose
class node_operator toneIndigo
```

## Components

### Contest logging

- [Main window](https://github.com/mbridak/not1mm/blob/master/not1mm/__main__.py): `not1mm/__main__.py`
- [Contest rules](https://github.com/mbridak/not1mm/tree/master/not1mm/plugins): `not1mm/plugins`
- [Contact log](https://github.com/mbridak/not1mm/blob/master/not1mm/logwindow.py): `not1mm/logwindow.py`
- [SQLite log store](https://github.com/mbridak/not1mm/blob/master/not1mm/lib/database.py): `not1mm/lib/database.py`
- [Contest utilities](https://github.com/mbridak/not1mm/blob/master/not1mm/lib/plugin_common.py): `not1mm/lib/plugin_common.py`

### Radio operation

- [Bandmap](https://github.com/mbridak/not1mm/blob/master/not1mm/bandmap.py): `not1mm/bandmap.py`
- [DX cluster](https://github.com/mbridak/not1mm/blob/master/not1mm/clusterwindow.py): `not1mm/clusterwindow.py`
- [VFO controls](https://github.com/mbridak/not1mm/blob/master/not1mm/vfo.py): `not1mm/vfo.py`
- [CAT interfaces](https://github.com/mbridak/not1mm/blob/master/not1mm/lib/cat_interface.py): `not1mm/lib/cat_interface.py`
- [CW keying](https://github.com/mbridak/not1mm/blob/master/not1mm/lib/cwinterface.py): `not1mm/lib/cwinterface.py`
- [Rotator control](https://github.com/mbridak/not1mm/blob/master/not1mm/rotator.py): `not1mm/rotator.py`

### Log insights

- [Lookup service](https://github.com/mbridak/not1mm/blob/master/not1mm/lookupservice.py): `not1mm/lookupservice.py`
- [Lookup providers](https://github.com/mbridak/not1mm/blob/master/not1mm/lib/lookup.py): `not1mm/lib/lookup.py`
- [Call checking](https://github.com/mbridak/not1mm/blob/master/not1mm/checkwindow.py): `not1mm/checkwindow.py`
- [Statistics](https://github.com/mbridak/not1mm/blob/master/not1mm/statistics.py): `not1mm/statistics.py`
- [DXCC tracker](https://github.com/mbridak/not1mm/blob/master/not1mm/dxcc_tracker.py): `not1mm/dxcc_tracker.py`

### Settings and services

- [Preferences](https://github.com/mbridak/not1mm/blob/master/not1mm/lib/preferences.py): `not1mm/lib/preferences.py`
- [Settings dialogs](https://github.com/mbridak/not1mm/blob/master/not1mm/lib/settings.py): `not1mm/lib/settings.py`
- [Score packets](https://github.com/mbridak/not1mm/blob/master/not1mm/lib/n1mm.py): `not1mm/lib/n1mm.py`
- [Realtime scores](https://github.com/mbridak/not1mm/blob/master/not1mm/rtc_service.py): `not1mm/rtc_service.py`

### Other components

- **Operator**

## Connections

- Operator → Main window: operates (evidence: `README.md`)
- Main window → Lookup service: starts (evidence: `not1mm/__main__.py`)
- Lookup service → Lookup providers: queries (evidence: `not1mm/lookupservice.py`)
- Main window → Contact log: dispatches (evidence: `not1mm/__main__.py`)
- Contact log → SQLite log store: reads and edits (evidence: `not1mm/logwindow.py`)
- Main window → SQLite log store: selects contest (evidence: `not1mm/__main__.py`)
- Contest rules → Contest utilities: uses utilities (evidence: `not1mm/plugins/na_sprint_cw.py`)
- Main window → Contest rules: loads rules
- Main window → Bandmap: opens (evidence: `not1mm/__main__.py`)
- Main window → DX cluster: opens (evidence: `not1mm/__main__.py`)
- Main window → VFO controls: opens (evidence: `not1mm/__main__.py`)
- VFO controls → CAT interfaces: uses (evidence: `not1mm/vfo.py`)
- Main window → Rotator control: opens (evidence: `not1mm/__main__.py`)
- Main window → Call checking: opens (evidence: `not1mm/__main__.py`)
- Main window → Statistics: refreshes (evidence: `not1mm/__main__.py`)
- Main window → DXCC tracker: refreshes (evidence: `not1mm/__main__.py`)
- Main window → Preferences: loads settings (evidence: `not1mm/__main__.py`)
- Settings dialogs → Preferences: reads and saves (evidence: `not1mm/lib/settings.py`)
- Main window → Score packets: sends packets (evidence: `not1mm/__main__.py`)
- Main window → Realtime scores: updates score XML (evidence: `not1mm/__main__.py`)
- Realtime scores → Operator: reports status
- Main window → CW keying: controls keyer (evidence: `not1mm/__main__.py`)
- Main window → Contest utilities: imports utilities (evidence: `not1mm/__main__.py`)
