# abubakarafghan/signalcheck-email-verifier architecture

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

- Interactive diagram: https://gitdiagram.com/abubakarafghan/signalcheck-email-verifier
- Repository: https://github.com/abubakarafghan/signalcheck-email-verifier

## Overview

SignalCheck is a local bulk email verification web app. Users paste addresses or upload CSV/XLSX files, preview and optionally deduplicate them, start a background job, monitor or control it, and export categorized or complete results. Verification checks syntax, DNS/MX routing, disposable domains, role-based addresses, and optionally SMTP recipient responses before assigning a status. The sampled sources show Flask routes and in-memory job state; the README documents additional product capabilities. Unshown template and data-file contents limit detail on their internal behavior.

Main entry points: [`verifier.py`](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py) (Verification pipeline), [`app.py`](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.py) (Flask routes), [`static/js/app.js`](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/static/js/app.js) (Interactive UI), [`templates/index.html`](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/templates/index.html) (Dashboard)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web interface"]
  node_dashboard["Dashboard<br/>[index.html]"]
  node_browser["Interactive UI<br/>[app.js]"]
end

subgraph group_jobs["Job processing"]
  node_api["Flask routes<br/>[app.py]"]
  node_input["Input parsing<br/>[app.py]"]
  node_config["Runtime settings<br/>[config.py]"]
  node_jobrunner["Job runner<br/>[app.py]"]
  node_jobstate[("Job state<br/>[app.py]")]
end

subgraph group_verify["Verification"]
  node_verifier["Verification pipeline<br/>[verifier.py]"]
  node_syntax["Syntax validation<br/>[verifier.py]"]
  node_dns["DNS and MX lookup<br/>[verifier.py]"]
  node_disposable["Disposable detection<br/>[verifier.py]"]
  node_domainlist["Disposable domain list"]
  node_roles["Role detection<br/>[verifier.py]"]
  node_smtp["SMTP handshake<br/>[verifier.py]"]
end

subgraph group_results["Results and exports"]
  node_export["Result exports<br/>[app.py]"]
  node_downloads["Downloaded reports"]
end

node_user(("User"))
node_dnsservice{{"DNS resolvers"}}
node_mailservers{{"Mail servers"}}

node_user -->|"opens"| node_dashboard
node_dashboard -.->|"loads"| node_browser
node_browser -->|"submits and polls"| node_api
node_api -->|"parses addresses"| node_input
node_api -->|"reads settings"| node_config
node_api -->|"starts job"| node_jobrunner
node_api -->|"updates and reads"| node_jobstate
node_jobrunner -->|"submits checks"| node_verifier
node_verifier -->|"validates"| node_syntax
node_verifier -->|"looks up domain"| node_dns
node_dns -->|"queries"| node_dnsservice
node_verifier -->|"checks domain"| node_disposable
node_verifier -->|"loads list"| node_domainlist
node_verifier -->|"checks local part"| node_roles
node_verifier -->|"optionally checks"| node_smtp
node_smtp -->|"probes recipient"| node_mailservers
node_jobrunner -->|"stores results"| node_jobstate
node_api -->|"serves exports"| node_export
node_browser -->|"requests report"| node_export
node_export -->|"returns file"| node_downloads

click node_dashboard "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/templates/index.html"
click node_browser "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/static/js/app.js"
click node_api "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.py"
click node_input "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.py"
click node_config "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/config.py"
click node_jobrunner "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.py"
click node_jobstate "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.py"
click node_verifier "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py"
click node_syntax "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py"
click node_dns "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py"
click node_disposable "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py"
click node_domainlist "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/data/disposable_domains.txt"
click node_roles "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py"
click node_smtp "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py"
click node_export "https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.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_dashboard,node_browser,node_user toneBlue
class node_api,node_input,node_config,node_jobrunner,node_jobstate toneAmber
class node_verifier,node_syntax,node_dns,node_disposable,node_domainlist,node_roles,node_smtp,node_mailservers toneMint
class node_export,node_downloads toneRose
class node_dnsservice toneIndigo
```

## Components

### Web interface

- [Dashboard](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/templates/index.html): `templates/index.html`
- [Interactive UI](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/static/js/app.js): `static/js/app.js`

### Job processing

- [Flask routes](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.py): `app.py`
- [Input parsing](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.py): `app.py`
- [Runtime settings](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/config.py): `config.py`
- [Job runner](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.py): `app.py`
- [Job state](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.py): `app.py`

### Verification

- [Verification pipeline](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py): `verifier.py`
- [Syntax validation](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py): `verifier.py`
- [DNS and MX lookup](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py): `verifier.py`
- [Disposable detection](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py): `verifier.py`
- [Disposable domain list](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/data/disposable_domains.txt): `data/disposable_domains.txt`
- [Role detection](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py): `verifier.py`
- [SMTP handshake](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/verifier.py): `verifier.py`

### Results and exports

- [Result exports](https://github.com/abubakarafghan/signalcheck-email-verifier/blob/main/app.py): `app.py`
- **Downloaded reports**

### Other components

- **User**
- **DNS resolvers**
- **Mail servers**

## Connections

- User → Dashboard: opens (evidence: `README.md`)
- Dashboard → Interactive UI: loads
- Interactive UI → Flask routes: submits and polls (evidence: `static/js/app.js`)
- Flask routes → Input parsing: parses addresses (evidence: `app.py`)
- Flask routes → Runtime settings: reads settings (evidence: `app.py`)
- Flask routes → Job runner: starts job (evidence: `app.py`)
- Flask routes → Job state: updates and reads (evidence: `app.py`)
- Job runner → Verification pipeline: submits checks (evidence: `app.py`)
- Verification pipeline → Syntax validation: validates (evidence: `verifier.py`)
- Verification pipeline → DNS and MX lookup: looks up domain (evidence: `verifier.py`)
- DNS and MX lookup → DNS resolvers: queries (evidence: `verifier.py`)
- Verification pipeline → Disposable detection: checks domain (evidence: `verifier.py`)
- Verification pipeline → Disposable domain list: loads list (evidence: `verifier.py`)
- Verification pipeline → Role detection: checks local part (evidence: `verifier.py`)
- Verification pipeline → SMTP handshake: optionally checks (evidence: `verifier.py`)
- SMTP handshake → Mail servers: probes recipient (evidence: `verifier.py`)
- Job runner → Job state: stores results (evidence: `app.py`)
- Flask routes → Result exports: serves exports (evidence: `app.py`)
- Interactive UI → Result exports: requests report (evidence: `static/js/app.js`)
- Result exports → Downloaded reports: returns file (evidence: `app.py`)
