# 7wp81x/nrsuite-android architecture

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

- Interactive diagram: https://gitdiagram.com/7wp81x/nrsuite-android
- Repository: https://github.com/7wp81x/nrsuite-android

## Overview

NRSuite is an Android companion for controlling an ESP32 security-research toolkit. The main path is launch the Compose app, discover and connect to an ESP32 over USB serial, then select a module whose commands travel through the session and framed protocol. Feature branches cover wireless discovery and defense, portal and credential workflows, capture and WPA analysis, BLE/HID and storage, and firmware flashing. The README documents several capabilities whose implementation was not sampled; those branches are shown at subsystem level, and edges are limited to documented or indexed relationships.

Main entry points: [`app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt) (App controller), [`app/src/main/java/com/swp81x/nrsuite/core/session/NrSession.kt`](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/session/NrSession.kt) (Device session), [`app/src/main/java/com/swp81x/nrsuite/ui/NRSuiteApp.kt`](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/NRSuiteApp.kt) (App catalog), [`app/src/main/java/com/swp81x/nrsuite/core/usb/UsbSerialTransport.kt`](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/usb/UsbSerialTransport.kt) (Serial transport)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App and navigation"]
  node_activity["Activity<br/>[MainActivity.kt]"]
  node_app_ui["App catalog<br/>[NRSuiteApp.kt]"]
  node_navigation["Screen navigation<br/>[NRSuiteContent.kt]"]
  node_controller["App controller<br/>[MainViewModel.kt]"]
  node_service["Foreground service"]
  node_history["Session history<br/>[HistoryEntry.kt]"]
end

subgraph group_device["Device connection"]
  node_usb_catalog["USB device catalog"]
  node_usb_transport["Serial transport"]
  node_session["Device session<br/>[NrSession.kt]"]
  node_connection_state["Connection state<br/>[ConnectionState.kt]"]
  node_frame["Wire frames<br/>[Frame.kt]"]
  node_frame_codec["Frame codec<br/>[FrameCodec.kt]"]
end

subgraph group_wireless["Wireless research"]
  node_wifi["Wi-Fi modules<br/>[WifiScanScreen.kt]"]
  node_client_defense["Client monitor"]
  node_deauth_defense["Deauth detector"]
  node_hidden_rogue["AP defense<br/>[RogueApScreen.kt]"]
  node_portal["Portal and Evil Twin<br/>[PortalScreen.kt]"]
  node_ble["BLE modules<br/>[BleScreen.kt]"]
  node_oui["Vendor lookup<br/>[OuiDatabase.kt]"]
end

subgraph group_data["Capture and credentials"]
  node_pcap["Packet capture<br/>[PcapWriter.kt]"]
  node_eapol["EAPOL parser<br/>[EapolParser.kt]"]
  node_wpa["WPA handshake tools"]
  node_credentials[("Credential manager")]
end

subgraph group_tools["Device tools"]
  node_storage["Storage and BadUSB"]
  node_flasher["Firmware flasher<br/>[Esp32Flasher.kt]"]
  node_flasher_transport["Flasher serial transport"]
end

node_user(("Researcher"))
node_usb_device["ESP32 device"]
node_firmware["ESP32 firmware"]

node_user -->|"opens"| node_activity
node_activity -->|"launches"| node_app_ui
node_app_ui -->|"uses"| node_controller
node_app_ui -->|"routes to"| node_navigation
node_user -->|"connects"| node_usb_device
node_controller -->|"discovers"| node_usb_catalog
node_controller -->|"manages"| node_session
node_usb_catalog -.->|"selects device"| node_usb_transport
node_session -->|"uses"| node_usb_transport
node_session -->|"encodes and decodes"| node_frame_codec
node_frame_codec -->|"encodes"| node_frame
node_session -->|"updates"| node_connection_state
node_usb_transport -.->|"communicates"| node_usb_device
node_session -->|"sends commands"| node_firmware
node_user -->|"selects module"| node_wifi
node_controller -->|"supports"| node_client_defense
node_deauth_defense -.->|"displays state"| node_controller
node_hidden_rogue -.->|"uses module state"| node_controller
node_portal -.->|"uses module state"| node_controller
node_ble -.->|"uses module state"| node_controller
node_controller -->|"writes captures"| node_pcap
node_controller -->|"parses frames"| node_eapol
node_controller -->|"supports cracking"| node_wpa
node_controller -->|"manages"| node_credentials
node_controller -->|"delegates storage"| node_storage
node_controller -->|"starts flashing"| node_flasher
node_flasher -->|"uses"| node_flasher_transport
node_controller -->|"looks up vendors"| node_oui
node_controller -->|"persists history"| node_history

click node_activity "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/MainActivity.kt"
click node_app_ui "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/NRSuiteApp.kt"
click node_navigation "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/NRSuiteContent.kt"
click node_controller "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt"
click node_service "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/service/NrSuiteForegroundService.kt"
click node_usb_catalog "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/usb/UsbSerialDeviceCatalog.kt"
click node_usb_transport "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/usb/UsbSerialTransport.kt"
click node_session "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/session/NrSession.kt"
click node_connection_state "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/session/ConnectionState.kt"
click node_frame "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/protocol/Frame.kt"
click node_frame_codec "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/protocol/FrameCodec.kt"
click node_wifi "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/WifiScanScreen.kt"
click node_client_defense "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/MainViewModelClientPresence.kt"
click node_deauth_defense "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/DeauthDetectorScreen.kt"
click node_hidden_rogue "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/RogueApScreen.kt"
click node_portal "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/PortalScreen.kt"
click node_ble "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/BleScreen.kt"
click node_pcap "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/pcap/PcapWriter.kt"
click node_eapol "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/eapol/EapolParser.kt"
click node_wpa "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/wpa/WpaHandshakeParser.kt"
click node_credentials "https://github.com/7wp81x/nrsuite-android/tree/main/app/src/main/java/com/swp81x/nrsuite/core/credentials"
click node_storage "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/MainViewModelStorage.kt"
click node_flasher "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/flasher/Esp32Flasher.kt"
click node_flasher_transport "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/flasher/UsbSerialFlasherTransport.kt"
click node_oui "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/oui/OuiDatabase.kt"
click node_history "https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/history/HistoryEntry.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_activity,node_app_ui,node_navigation,node_controller,node_service,node_history toneBlue
class node_usb_catalog,node_usb_transport,node_session,node_connection_state,node_frame,node_frame_codec toneAmber
class node_wifi,node_client_defense,node_deauth_defense,node_hidden_rogue,node_portal,node_ble,node_oui toneMint
class node_pcap,node_eapol,node_wpa,node_credentials toneRose
class node_storage,node_flasher,node_flasher_transport,node_user,node_usb_device,node_firmware toneIndigo
```

## Components

### App and navigation

- [Activity](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/MainActivity.kt): `app/src/main/java/com/swp81x/nrsuite/MainActivity.kt`
- [App catalog](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/NRSuiteApp.kt): `app/src/main/java/com/swp81x/nrsuite/ui/NRSuiteApp.kt`
- [Screen navigation](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/NRSuiteContent.kt): `app/src/main/java/com/swp81x/nrsuite/ui/NRSuiteContent.kt`
- [App controller](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt): `app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`
- [Foreground service](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/service/NrSuiteForegroundService.kt): `app/src/main/java/com/swp81x/nrsuite/service/NrSuiteForegroundService.kt`
- [Session history](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/history/HistoryEntry.kt): `app/src/main/java/com/swp81x/nrsuite/core/history/HistoryEntry.kt`

### Device connection

- [USB device catalog](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/usb/UsbSerialDeviceCatalog.kt): `app/src/main/java/com/swp81x/nrsuite/core/usb/UsbSerialDeviceCatalog.kt`
- [Serial transport](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/usb/UsbSerialTransport.kt): `app/src/main/java/com/swp81x/nrsuite/core/usb/UsbSerialTransport.kt`
- [Device session](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/session/NrSession.kt): `app/src/main/java/com/swp81x/nrsuite/core/session/NrSession.kt`
- [Connection state](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/session/ConnectionState.kt): `app/src/main/java/com/swp81x/nrsuite/core/session/ConnectionState.kt`
- [Wire frames](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/protocol/Frame.kt): `app/src/main/java/com/swp81x/nrsuite/core/protocol/Frame.kt`
- [Frame codec](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/protocol/FrameCodec.kt): `app/src/main/java/com/swp81x/nrsuite/core/protocol/FrameCodec.kt`

### Wireless research

- [Wi-Fi modules](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/WifiScanScreen.kt): `app/src/main/java/com/swp81x/nrsuite/ui/WifiScanScreen.kt`
- [Client monitor](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/MainViewModelClientPresence.kt): `app/src/main/java/com/swp81x/nrsuite/MainViewModelClientPresence.kt`
- [Deauth detector](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/DeauthDetectorScreen.kt): `app/src/main/java/com/swp81x/nrsuite/ui/DeauthDetectorScreen.kt`
- [AP defense](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/RogueApScreen.kt): `app/src/main/java/com/swp81x/nrsuite/ui/RogueApScreen.kt`
- [Portal and Evil Twin](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/PortalScreen.kt): `app/src/main/java/com/swp81x/nrsuite/ui/PortalScreen.kt`
- [BLE modules](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/ui/BleScreen.kt): `app/src/main/java/com/swp81x/nrsuite/ui/BleScreen.kt`
- [Vendor lookup](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/oui/OuiDatabase.kt): `app/src/main/java/com/swp81x/nrsuite/core/oui/OuiDatabase.kt`

### Capture and credentials

- [Packet capture](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/pcap/PcapWriter.kt): `app/src/main/java/com/swp81x/nrsuite/core/pcap/PcapWriter.kt`
- [EAPOL parser](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/eapol/EapolParser.kt): `app/src/main/java/com/swp81x/nrsuite/core/eapol/EapolParser.kt`
- [WPA handshake tools](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/wpa/WpaHandshakeParser.kt): `app/src/main/java/com/swp81x/nrsuite/core/wpa/WpaHandshakeParser.kt`
- [Credential manager](https://github.com/7wp81x/nrsuite-android/tree/main/app/src/main/java/com/swp81x/nrsuite/core/credentials): `app/src/main/java/com/swp81x/nrsuite/core/credentials`

### Device tools

- [Storage and BadUSB](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/MainViewModelStorage.kt): `app/src/main/java/com/swp81x/nrsuite/MainViewModelStorage.kt`
- [Firmware flasher](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/flasher/Esp32Flasher.kt): `app/src/main/java/com/swp81x/nrsuite/core/flasher/Esp32Flasher.kt`
- [Flasher serial transport](https://github.com/7wp81x/nrsuite-android/blob/main/app/src/main/java/com/swp81x/nrsuite/core/flasher/UsbSerialFlasherTransport.kt): `app/src/main/java/com/swp81x/nrsuite/core/flasher/UsbSerialFlasherTransport.kt`

### Other components

- **Researcher**
- **ESP32 device**
- **ESP32 firmware**

## Connections

- Researcher → Activity: opens (evidence: `README.md`)
- Activity → App catalog: launches (evidence: `app/src/main/java/com/swp81x/nrsuite/MainActivity.kt`)
- App catalog → App controller: uses (evidence: `app/src/main/java/com/swp81x/nrsuite/ui/NRSuiteApp.kt`)
- App catalog → Screen navigation: routes to (evidence: `app/src/main/java/com/swp81x/nrsuite/ui/NRSuiteApp.kt`)
- Researcher → ESP32 device: connects (evidence: `README.md`)
- App controller → USB device catalog: discovers (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`)
- App controller → Device session: manages (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`)
- USB device catalog → Serial transport: selects device
- Device session → Serial transport: uses (evidence: `app/src/main/java/com/swp81x/nrsuite/core/session/NrSession.kt`)
- Device session → Frame codec: encodes and decodes (evidence: `app/src/main/java/com/swp81x/nrsuite/core/session/NrSession.kt`)
- Frame codec → Wire frames: encodes (evidence: `app/src/main/java/com/swp81x/nrsuite/core/protocol/FrameCodec.kt`)
- Device session → Connection state: updates (evidence: `app/src/main/java/com/swp81x/nrsuite/core/session/NrSession.kt`)
- Serial transport → ESP32 device: communicates
- Device session → ESP32 firmware: sends commands (evidence: `README.md`)
- Researcher → Wi-Fi modules: selects module (evidence: `README.md`)
- App controller → Client monitor: supports (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModelClientPresence.kt`)
- Deauth detector → App controller: displays state
- AP defense → App controller: uses module state
- Portal and Evil Twin → App controller: uses module state
- BLE modules → App controller: uses module state
- App controller → Packet capture: writes captures (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`)
- App controller → EAPOL parser: parses frames (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`)
- App controller → WPA handshake tools: supports cracking (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`)
- App controller → Credential manager: manages (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`)
- App controller → Storage and BadUSB: delegates storage (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModelStorage.kt`)
- App controller → Firmware flasher: starts flashing (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`)
- Firmware flasher → Flasher serial transport: uses (evidence: `app/src/main/java/com/swp81x/nrsuite/core/flasher/Esp32Flasher.kt`)
- App controller → Vendor lookup: looks up vendors (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`)
- App controller → Session history: persists history (evidence: `app/src/main/java/com/swp81x/nrsuite/MainViewModel.kt`)
