# mutyshwarzkopf-a11y/yggpeerchecker architecture

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

- Interactive diagram: https://gitdiagram.com/mutyshwarzkopf-a11y/yggpeerchecker
- Repository: https://github.com/mutyshwarzkopf-a11y/yggpeerchecker

## Overview

#### Purpose and Entry Point
YggPeerChecker is a native Android utility for importing Yggdrasil peer/SNI host lists, resolving names, and measuring reachability and latency. The application starts in `app/src/main/java/com/example/yggpeerchecker/ui/MainActivity.kt`; Android packaging, permissions, and activity registration are defined in `app/src/main/AndroidManifest.xml`.

#### UI Shell and User Workflows
The UI is organized into three functional areas: checks, list management/viewing, and system settings/logs. `app/src/main/java/com/example/yggpeerchecker/ui/checks/ChecksScreen.kt`, `app/src/main/java/com/example/yggpeerchecker/ui/lists/ListsScreen.kt`, and `app/src/main/java/com/example/yggpeerchecker/ui/system/SystemScreen.kt` are the primary workflow boundaries. Theme selection is application-wide state managed by `app/src/main/java/com/example/yggpeerchecker/ui/theme/ThemeManager.kt`.

#### Check Orchestration
`ChecksViewModel` coordinates user-selected check type, filtering, sorting, concurrency, and displayed results. It consumes persisted hosts, executes probes, and groups output for presentation via `app/src/main/java/com/example/yggpeerchecker/data/GroupedHost.kt` and `app/src/main/java/com/example/yggpeerchecker/ui/checks/GroupedHostCard.kt`. Session-scoped UI/check state is represented by `app/src/main/java/com/example/yggpeerchecker/data/SessionManager.kt`.

#### Network-Probing Boundary
Probe implementations are isolated under `utils`, separating Android/UI concerns from network operations. `app/src/main/java/com/example/yggpeerchecker/utils/ActiveProber.kt` appears to be the central active-check dispatcher, while `PingUtil.kt`, `YggConnectChecker.kt`, `SniChecker.kt`, and `TracertUtil.kt` implement specific network measurements. Supported peer transport schemes include TCP, TLS, QUIC, WebSocket, and secure WebSocket; the bundled `app/libs/yggpeers.aar` is a material external Android library dependency likely used for Yggdrasil-peer functionality.

#### Host Ingestion, Parsing, and DNS
List management imports preset remote sources plus clipboard/file-provided content, then normalizes entries into host records. The parsing boundary is `app/src/main/java/com/example/yggpeerchecker/utils/UrlParser.kt`; host discovery/representation uses `app/src/main/java/com/example/yggpeerchecker/data/DiscoveredPeer.kt`. DNS resolution and fallback/“always check resolved IPs” behavior are handled by `app/src/main/java/com/example/yggpeerchecker/utils/DnsResolver.kt` and `app/src/main/java/com/example/yggpeerchecker/utils/NetworkUtil.kt`.

#### Persistence and Repository Layer
Room-style local persistence stores hosts, DNS cache entries, and historical check results. The database root is `app/src/main/java/com/example/yggpeerchecker/data/database/AppDatabase.kt`, with entities/DAOs such as `Host.kt`, `DnsCache.kt`, and `CheckResult.kt`. `app/src/main/java/com/example/yggpeerchecker/data/repository/HostRepository.kt` is the principal boundary between ViewModels and storage, enabling list filters, bulk DNS operations, clearing, and retrieval for checking.

#### Runtime, Infrastructure, and Observability
This is a Kotlin/Gradle Android application targeting Android SDK 34 and requiring JDK 17 for builds; module dependencies and packaging are in `app/build.gradle`. It relies on device network connectivity, external peer-list endpoints, DNS infrastructure, and target hosts rather than a server-side backend. Persistent application logging is centralized in `app/src/main/java/com/example/yggpeerchecker/utils/PersistentLogger.kt` and surfaced through `app/src/main/java/com/example/yggpeerchecker/ui/system/LogsTab.kt`.

Main entry points: [`app/src/main/java/com/example/yggpeerchecker/utils/UrlParser.kt`](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/UrlParser.kt) (List import and parsing), [`app/src/main/java/com/example/yggpeerchecker/data/repository/HostRepository.kt`](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/repository/HostRepository.kt) (Host repository), [`app/src/main/java/com/example/yggpeerchecker/ui/MainActivity.kt`](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/ui/MainActivity.kt) (Main activity), [`app/src/main/java/com/example/yggpeerchecker/ui/checks/ChecksScreen.kt`](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/ui/checks/ChecksScreen.kt) (Workflow screens)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Android UI"]
  node_manifest["Android app manifest<br/>Android registration"]
  node_main_activity["Main activity<br/>Android entry point<br/>[MainActivity.kt]"]
  node_workflow_screens["Workflow screens<br/>Compose UI<br/>[ChecksScreen.kt]"]
  node_theme_manager["Theme manager<br/>UI state<br/>[ThemeManager.kt]"]
  node_logs_tab["Logs tab<br/>system UI<br/>[LogsTab.kt]"]
end

subgraph group_checks["Check Pipeline"]
  node_checks_vm["Checks view model<br/>check orchestration"]
  node_session_manager["Session manager<br/>session state<br/>[SessionManager.kt]"]
  node_grouped_results["Grouped check results<br/>presentation model<br/>[GroupedHost.kt]"]
end

subgraph group_data["Data and Ingestion"]
  node_host_repository["Host repository<br/>[HostRepository.kt]"]
  node_list_ingestion["List import and parsing<br/>ingestion pipeline<br/>[UrlParser.kt]"]
  node_discovered_peer["Discovered peer<br/>host model<br/>[DiscoveredPeer.kt]"]
  node_app_database[("App database<br/>Room persistence<br/>[AppDatabase.kt]")]
end

subgraph group_network["Network and Observability"]
  node_dns_resolver["DNS resolver<br/>resolution service<br/>[DnsResolver.kt]"]
  node_active_prober["Active prober<br/>probe dispatcher<br/>[ActiveProber.kt]"]
  node_probe_implementations["Probe implementations<br/>network measurements<br/>[PingUtil.kt]"]
  node_external_network{{"External network<br/>network dependencies"}}
  node_yggpeers_library["Yggpeers library<br/>bundled Android library<br/>[yggpeers.aar]"]
  node_persistent_logger["Persistent logger<br/>application logging"]
end

node_manifest -->|"launches"| node_main_activity
node_main_activity -->|"hosts"| node_workflow_screens
node_main_activity -->|"uses"| node_theme_manager
node_workflow_screens -->|"drives checks"| node_checks_vm
node_workflow_screens -->|"imports lists"| node_list_ingestion
node_checks_vm -->|"reads and updates"| node_session_manager
node_checks_vm -->|"loads hosts"| node_host_repository
node_checks_vm -->|"executes probes"| node_active_prober
node_checks_vm -->|"groups for display"| node_grouped_results
node_list_ingestion -->|"normalizes into"| node_discovered_peer
node_list_ingestion -->|"persists imports"| node_host_repository
node_list_ingestion -->|"fetches presets"| node_external_network
node_host_repository -->|"reads and writes"| node_app_database
node_host_repository -->|"requests bulk resolution"| node_dns_resolver
node_dns_resolver -->|"queries DNS"| node_external_network
node_active_prober -->|"dispatches to"| node_probe_implementations
node_probe_implementations -->|"measures targets"| node_external_network
node_probe_implementations -->|"uses"| node_yggpeers_library
node_active_prober -.->|"records activity"| node_persistent_logger
node_persistent_logger -->|"surfaces logs"| node_logs_tab

click node_manifest "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/AndroidManifest.xml"
click node_main_activity "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/ui/MainActivity.kt"
click node_workflow_screens "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/ui/checks/ChecksScreen.kt"
click node_theme_manager "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/ui/theme/ThemeManager.kt"
click node_session_manager "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/SessionManager.kt"
click node_grouped_results "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/GroupedHost.kt"
click node_host_repository "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/repository/HostRepository.kt"
click node_list_ingestion "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/UrlParser.kt"
click node_discovered_peer "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/DiscoveredPeer.kt"
click node_app_database "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/database/AppDatabase.kt"
click node_dns_resolver "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/DnsResolver.kt"
click node_active_prober "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/ActiveProber.kt"
click node_probe_implementations "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/PingUtil.kt"
click node_yggpeers_library "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/libs/yggpeers.aar"
click node_persistent_logger "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/PersistentLogger.kt"
click node_logs_tab "https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/ui/system/LogsTab.kt"

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_manifest,node_main_activity,node_workflow_screens,node_theme_manager,node_logs_tab toneBlue
class node_checks_vm,node_session_manager,node_grouped_results toneAmber
class node_host_repository,node_list_ingestion,node_discovered_peer,node_app_database toneMint
class node_dns_resolver,node_active_prober,node_probe_implementations,node_external_network,node_yggpeers_library,node_persistent_logger toneRose
```

## Components

### Android UI

- [Android app manifest](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/AndroidManifest.xml): Android registration · Declares packaging, permissions, and launcher activity. · `app/src/main/AndroidManifest.xml`
- [Main activity](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/ui/MainActivity.kt): Android entry point · `app/src/main/java/com/example/yggpeerchecker/ui/MainActivity.kt`
- [Workflow screens](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/ui/checks/ChecksScreen.kt): Compose UI · Checks, lists, and system workflows. · `app/src/main/java/com/example/yggpeerchecker/ui/checks/ChecksScreen.kt`
- [Theme manager](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/ui/theme/ThemeManager.kt): UI state · `app/src/main/java/com/example/yggpeerchecker/ui/theme/ThemeManager.kt`
- [Logs tab](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/ui/system/LogsTab.kt): system UI · `app/src/main/java/com/example/yggpeerchecker/ui/system/LogsTab.kt`

### Check Pipeline

- **Checks view model**: check orchestration · Coordinates selection, filtering, sorting, concurrency, and results.
- [Session manager](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/SessionManager.kt): session state · `app/src/main/java/com/example/yggpeerchecker/data/SessionManager.kt`
- [Grouped check results](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/GroupedHost.kt): presentation model · `app/src/main/java/com/example/yggpeerchecker/data/GroupedHost.kt`

### Data and Ingestion

- [Host repository](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/repository/HostRepository.kt): repository · Storage boundary for filtering, retrieval, bulk DNS work, and clearing. · `app/src/main/java/com/example/yggpeerchecker/data/repository/HostRepository.kt`
- [List import and parsing](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/UrlParser.kt): ingestion pipeline · Imports preset, clipboard, and file content into host records. · `app/src/main/java/com/example/yggpeerchecker/utils/UrlParser.kt`
- [Discovered peer](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/DiscoveredPeer.kt): host model · `app/src/main/java/com/example/yggpeerchecker/data/DiscoveredPeer.kt`
- [App database](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/data/database/AppDatabase.kt): Room persistence · Stores hosts, DNS cache entries, and historical check results. · `app/src/main/java/com/example/yggpeerchecker/data/database/AppDatabase.kt`

### Network and Observability

- [DNS resolver](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/DnsResolver.kt): resolution service · Applies DNS fallback and resolved-IP checking behavior. · `app/src/main/java/com/example/yggpeerchecker/utils/DnsResolver.kt`
- [Active prober](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/ActiveProber.kt): probe dispatcher · Dispatches selected active network checks. · `app/src/main/java/com/example/yggpeerchecker/utils/ActiveProber.kt`
- [Probe implementations](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/PingUtil.kt): network measurements · Ping, Ygg connection, SNI, and traceroute checks. · `app/src/main/java/com/example/yggpeerchecker/utils/PingUtil.kt`
- **External network**: network dependencies · Peer-list endpoints, DNS infrastructure, and target hosts.
- [Yggpeers library](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/libs/yggpeers.aar): bundled Android library · Yggdrasil-peer functionality dependency. · `app/libs/yggpeers.aar`
- [Persistent logger](https://github.com/mutyshwarzkopf-a11y/yggpeerchecker/blob/main/app/src/main/java/com/example/yggpeerchecker/utils/PersistentLogger.kt): application logging · `app/src/main/java/com/example/yggpeerchecker/utils/PersistentLogger.kt`

## Connections

- Android app manifest → Main activity: launches
- Main activity → Workflow screens: hosts
- Main activity → Theme manager: uses
- Workflow screens → Checks view model: drives checks
- Workflow screens → List import and parsing: imports lists
- Checks view model → Session manager: reads and updates
- Checks view model → Host repository: loads hosts
- Checks view model → Active prober: executes probes
- Checks view model → Grouped check results: groups for display
- List import and parsing → Discovered peer: normalizes into
- List import and parsing → Host repository: persists imports
- List import and parsing → External network: fetches presets
- Host repository → App database: reads and writes
- Host repository → DNS resolver: requests bulk resolution
- DNS resolver → External network: queries DNS
- Active prober → Probe implementations: dispatches to
- Probe implementations → External network: measures targets
- Probe implementations → Yggpeers library: uses
- Active prober → Persistent logger: records activity
- Persistent logger → Logs tab: surfaces logs
