# mohana-575/qr-security-scanner architecture

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

- Interactive diagram: https://gitdiagram.com/mohana-575/qr-security-scanner
- Repository: https://github.com/mohana-575/qr-security-scanner

## Overview

QR Guard is a web application for decoding QR images and assessing the risk of URLs they contain, with account-based scan history. A user submits an image; the scan endpoint validates and decodes it, analyzes a URL, calculates risk, and saves a result. The frontend also supports registration, login, and current-user hydration. The scan and authentication route excerpts show their backend calls; frontend-to-backend wiring and several UI details are not fully shown, so those links are omitted rather than inferred.

Main entry points: [`qr-guard/backend/app/routes/scan.py`](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/routes/scan.py) (Scan routes), [`qr-guard/backend/app/routes/auth.py`](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/routes/auth.py) (Auth routes), [`qr-guard/backend/app/main.py`](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/main.py) (API application), [`qr-guard/backend/app/database.py`](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/database.py) (Database)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Web application"]
  node_webapp["Web app<br/>[App.jsx]"]
  node_authstate["Auth state<br/>[AuthContext.jsx]"]
  node_authapi["Auth API client<br/>[auth.js]"]
  node_httpclient["HTTP client<br/>[client.js]"]
  node_scanapi["Scan API client<br/>[scans.js]"]
end

subgraph group_api["API and security"]
  node_entry["API application<br/>[main.py]"]
  node_authroutes["Auth routes<br/>[auth.py]"]
  node_scanroutes["Scan routes<br/>[scan.py]"]
  node_authschemas["Auth schemas<br/>[auth.py]"]
  node_scanschemas["Scan schemas<br/>[scan.py]"]
  node_authservice["Account service<br/>[auth.py]"]
  node_security["Token security<br/>[tokens.py]"]
  node_authdeps["Auth dependencies<br/>[dependencies.py]"]
  node_settings["Configuration<br/>[settings.py]"]
  node_errors["Error handling<br/>[errors.py]"]
end

subgraph group_domain["Analysis and storage"]
  node_decoder["QR decoder<br/>[qr_decoder.py]"]
  node_urlanalysis["URL analysis<br/>[url_analyzer.py]"]
  node_risk["Risk engine<br/>[risk_engine.py]"]
  node_scanmodel["Scan record<br/>[scan.py]"]
  node_database[("Database<br/>[database.py]")]
end

node_user(("User"))

node_user -.->|"uses"| node_webapp
node_entry -->|"creates tables"| node_database
node_entry -->|"loads settings"| node_settings
node_entry -->|"registers handlers"| node_errors
node_entry -.->|"mounts routes"| node_authroutes
node_entry -.->|"mounts routes"| node_scanroutes
node_authroutes -->|"registers, authenticates"| node_authservice
node_authroutes -->|"gets session"| node_database
node_authroutes -->|"creates token"| node_security
node_authroutes -->|"gets current user"| node_authdeps
node_authroutes -->|"validates, responds"| node_authschemas
node_scanroutes -->|"decodes image"| node_decoder
node_scanroutes -->|"analyzes URL"| node_urlanalysis
node_scanroutes -->|"calculates risk"| node_risk
node_scanroutes -->|"saves scan"| node_database
node_scanroutes -->|"creates record"| node_scanmodel
node_scanroutes -->|"requires user"| node_authdeps
node_scanroutes -->|"validates, responds"| node_scanschemas
node_authstate -->|"calls auth functions"| node_authapi
node_authapi -->|"sends requests"| node_httpclient
node_scanapi -->|"sends requests"| node_httpclient
node_webapp -.->|"uses provider"| node_authstate

click node_webapp "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/frontend/src/App.jsx"
click node_authstate "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/frontend/src/context/AuthContext.jsx"
click node_authapi "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/frontend/src/api/auth.js"
click node_httpclient "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/frontend/src/api/client.js"
click node_scanapi "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/frontend/src/api/scans.js"
click node_entry "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/main.py"
click node_authroutes "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/routes/auth.py"
click node_scanroutes "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/routes/scan.py"
click node_authschemas "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/schemas/auth.py"
click node_scanschemas "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/schemas/scan.py"
click node_authservice "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/services/auth.py"
click node_security "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/security/tokens.py"
click node_authdeps "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/security/dependencies.py"
click node_decoder "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/services/qr_decoder.py"
click node_urlanalysis "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/services/url_analyzer.py"
click node_risk "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/services/risk_engine.py"
click node_scanmodel "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/models/scan.py"
click node_database "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/database.py"
click node_settings "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/settings.py"
click node_errors "https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/utils/errors.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_webapp,node_authstate,node_authapi,node_httpclient,node_scanapi,node_user toneBlue
class node_entry,node_authroutes,node_scanroutes,node_authschemas,node_scanschemas,node_authservice,node_security,node_authdeps,node_settings,node_errors toneAmber
class node_decoder,node_urlanalysis,node_risk,node_scanmodel,node_database toneMint
```

## Components

### Web application

- [Web app](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/frontend/src/App.jsx): `qr-guard/frontend/src/App.jsx`
- [Auth state](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/frontend/src/context/AuthContext.jsx): `qr-guard/frontend/src/context/AuthContext.jsx`
- [Auth API client](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/frontend/src/api/auth.js): `qr-guard/frontend/src/api/auth.js`
- [HTTP client](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/frontend/src/api/client.js): `qr-guard/frontend/src/api/client.js`
- [Scan API client](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/frontend/src/api/scans.js): `qr-guard/frontend/src/api/scans.js`

### API and security

- [API application](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/main.py): `qr-guard/backend/app/main.py`
- [Auth routes](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/routes/auth.py): `qr-guard/backend/app/routes/auth.py`
- [Scan routes](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/routes/scan.py): `qr-guard/backend/app/routes/scan.py`
- [Auth schemas](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/schemas/auth.py): `qr-guard/backend/app/schemas/auth.py`
- [Scan schemas](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/schemas/scan.py): `qr-guard/backend/app/schemas/scan.py`
- [Account service](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/services/auth.py): `qr-guard/backend/app/services/auth.py`
- [Token security](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/security/tokens.py): `qr-guard/backend/app/security/tokens.py`
- [Auth dependencies](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/security/dependencies.py): `qr-guard/backend/app/security/dependencies.py`
- [Configuration](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/settings.py): `qr-guard/backend/app/settings.py`
- [Error handling](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/utils/errors.py): `qr-guard/backend/app/utils/errors.py`

### Analysis and storage

- [QR decoder](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/services/qr_decoder.py): `qr-guard/backend/app/services/qr_decoder.py`
- [URL analysis](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/services/url_analyzer.py): `qr-guard/backend/app/services/url_analyzer.py`
- [Risk engine](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/services/risk_engine.py): `qr-guard/backend/app/services/risk_engine.py`
- [Scan record](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/models/scan.py): `qr-guard/backend/app/models/scan.py`
- [Database](https://github.com/mohana-575/qr-security-scanner/blob/main/qr-guard/backend/app/database.py): `qr-guard/backend/app/database.py`

### Other components

- **User**

## Connections

- User → Web app: uses
- API application → Database: creates tables (evidence: `qr-guard/backend/app/main.py`)
- API application → Configuration: loads settings (evidence: `qr-guard/backend/app/main.py`)
- API application → Error handling: registers handlers (evidence: `qr-guard/backend/app/main.py`)
- API application → Auth routes: mounts routes
- API application → Scan routes: mounts routes
- Auth routes → Account service: registers, authenticates (evidence: `qr-guard/backend/app/routes/auth.py`)
- Auth routes → Database: gets session (evidence: `qr-guard/backend/app/routes/auth.py`)
- Auth routes → Token security: creates token (evidence: `qr-guard/backend/app/routes/auth.py`)
- Auth routes → Auth dependencies: gets current user (evidence: `qr-guard/backend/app/routes/auth.py`)
- Auth routes → Auth schemas: validates, responds (evidence: `qr-guard/backend/app/routes/auth.py`)
- Scan routes → QR decoder: decodes image (evidence: `qr-guard/backend/app/routes/scan.py`)
- Scan routes → URL analysis: analyzes URL (evidence: `qr-guard/backend/app/routes/scan.py`)
- Scan routes → Risk engine: calculates risk (evidence: `qr-guard/backend/app/routes/scan.py`)
- Scan routes → Database: saves scan (evidence: `qr-guard/backend/app/routes/scan.py`)
- Scan routes → Scan record: creates record (evidence: `qr-guard/backend/app/routes/scan.py`)
- Scan routes → Auth dependencies: requires user (evidence: `qr-guard/backend/app/routes/scan.py`)
- Scan routes → Scan schemas: validates, responds (evidence: `qr-guard/backend/app/routes/scan.py`)
- Auth state → Auth API client: calls auth functions (evidence: `qr-guard/frontend/src/context/AuthContext.jsx`)
- Auth API client → HTTP client: sends requests (evidence: `qr-guard/frontend/src/api/auth.js`)
- Scan API client → HTTP client: sends requests (evidence: `qr-guard/frontend/src/api/scans.js`)
- Web app → Auth state: uses provider
