# krushkadam/cloneguard architecture

> Architecture diagram of the GitHub repository krushkadam/cloneguard, 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/krushkadam/cloneguard
- Repository: https://github.com/krushkadam/cloneguard

## Overview

CloneGuard is a local Streamlit desktop tool for checking call recordings. The user enrolls trusted voices, submits a recording, and receives voice-identity and Hinglish scam-pattern evidence combined into a risk score and verdict. The pipeline orchestrates transcription, claim resolution, voice comparison, pattern scanning, scoring, and incident recording; the UI also supports call generation, self-tests, incident history, PDF evidence, and spoken verdicts. The graph uses README capabilities and SOURCE INDEX references where implementation excerpts are incomplete; those unsampled links are documented rather than inferred from folder names.

Main entry points: [`engine/pipeline.py`](https://github.com/krushkadam/cloneguard/blob/master/engine/pipeline.py) (Check orchestrator), [`app.py`](https://github.com/krushkadam/cloneguard/blob/master/app.py) (Streamlit app), [`generator/generate.py`](https://github.com/krushkadam/cloneguard/blob/master/generator/generate.py) (Call generator), [`selftest/harness.py`](https://github.com/krushkadam/cloneguard/blob/master/selftest/harness.py) (Self-test harness)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["Local interface"]
  node_ui["Streamlit app<br/>[app.py]"]
  node_enrollment["Voice enrollment<br/>[app.py]"]
end

subgraph group_analysis["Call analysis"]
  node_pipeline["Check orchestrator<br/>[pipeline.py]"]
  node_transcription["Speech transcription<br/>[gnani.py]"]
  node_claim["Claim resolver<br/>[claim.py]"]
  node_voicecheck["Voice comparison<br/>[layer1.py]"]
  node_voiceprint["Embedding service<br/>[voiceprint.py]"]
  node_pattern_scan["Hinglish pattern scan<br/>[layer2.py]"]
  node_patterns["Pattern catalog<br/>[patterns.json]"]
  node_scoring["Composite verdict<br/>[score.py]"]
end

subgraph group_support["Demo and calibration"]
  node_generator["Call generator<br/>[generate.py]"]
  node_scripts["Scenario scripts<br/>[scripts.py]"]
  node_selftest["Self-test harness<br/>[harness.py]"]
  node_scorecard["Calibration scorecard<br/>[scorecard.py]"]
end

subgraph group_records["Evidence and records"]
  node_incidents[("Incident history<br/>[pipeline.py]")]
  node_incident_pdf["Check PDF report<br/>[incident_pdf.py]"]
end

node_operator(("Desktop user"))
node_gnani{{"Gnani cloud APIs"}}

node_operator -->|"uses"| node_ui
node_ui -->|"submits checks"| node_pipeline
node_pipeline -->|"transcribes audio"| node_transcription
node_transcription -->|"calls Prisma"| node_gnani
node_pipeline -->|"scans transcript"| node_pattern_scan
node_pipeline -->|"resolves identity"| node_claim
node_pipeline -->|"compares voice"| node_voicecheck
node_voicecheck -->|"gets embeddings"| node_voiceprint
node_voiceprint -->|"requests embedding"| node_gnani
node_pipeline -->|"loads patterns"| node_patterns
node_pipeline -->|"scores evidence"| node_scoring
node_pipeline -->|"saves checks"| node_incidents
node_ui -->|"manages enrollment"| node_enrollment
node_enrollment -->|"stores voiceprints"| node_voicecheck
node_ui -->|"exports report"| node_incident_pdf
node_ui -->|"shows history"| node_incidents
node_generator -->|"uses scripts"| node_scripts
node_generator -->|"generates speech"| node_gnani
node_operator -->|"requests demo calls"| node_generator
node_selftest -->|"runs scenarios"| node_pipeline
node_selftest -->|"creates hard case"| node_generator
node_selftest -->|"renders calibration"| node_scorecard
node_ui -.->|"requests spoken verdict"| node_gnani

click node_ui "https://github.com/krushkadam/cloneguard/blob/master/app.py"
click node_pipeline "https://github.com/krushkadam/cloneguard/blob/master/engine/pipeline.py"
click node_transcription "https://github.com/krushkadam/cloneguard/blob/master/gnani.py"
click node_claim "https://github.com/krushkadam/cloneguard/blob/master/engine/claim.py"
click node_voicecheck "https://github.com/krushkadam/cloneguard/blob/master/engine/layer1.py"
click node_voiceprint "https://github.com/krushkadam/cloneguard/blob/master/voiceprint.py"
click node_pattern_scan "https://github.com/krushkadam/cloneguard/blob/master/engine/layer2.py"
click node_patterns "https://github.com/krushkadam/cloneguard/blob/master/data/patterns.json"
click node_scoring "https://github.com/krushkadam/cloneguard/blob/master/engine/score.py"
click node_enrollment "https://github.com/krushkadam/cloneguard/blob/master/app.py"
click node_incidents "https://github.com/krushkadam/cloneguard/blob/master/engine/pipeline.py"
click node_incident_pdf "https://github.com/krushkadam/cloneguard/blob/master/reports/incident_pdf.py"
click node_generator "https://github.com/krushkadam/cloneguard/blob/master/generator/generate.py"
click node_scripts "https://github.com/krushkadam/cloneguard/blob/master/generator/scripts.py"
click node_selftest "https://github.com/krushkadam/cloneguard/blob/master/selftest/harness.py"
click node_scorecard "https://github.com/krushkadam/cloneguard/blob/master/selftest/scorecard.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_ui,node_enrollment,node_operator toneBlue
class node_pipeline,node_transcription,node_claim,node_voicecheck,node_voiceprint,node_pattern_scan,node_patterns,node_scoring toneAmber
class node_generator,node_scripts,node_selftest,node_scorecard,node_gnani toneMint
class node_incidents,node_incident_pdf toneRose
```

## Components

### Local interface

- [Streamlit app](https://github.com/krushkadam/cloneguard/blob/master/app.py): `app.py`
- [Voice enrollment](https://github.com/krushkadam/cloneguard/blob/master/app.py): `app.py`

### Call analysis

- [Check orchestrator](https://github.com/krushkadam/cloneguard/blob/master/engine/pipeline.py): `engine/pipeline.py`
- [Speech transcription](https://github.com/krushkadam/cloneguard/blob/master/gnani.py): `gnani.py`
- [Claim resolver](https://github.com/krushkadam/cloneguard/blob/master/engine/claim.py): `engine/claim.py`
- [Voice comparison](https://github.com/krushkadam/cloneguard/blob/master/engine/layer1.py): `engine/layer1.py`
- [Embedding service](https://github.com/krushkadam/cloneguard/blob/master/voiceprint.py): `voiceprint.py`
- [Hinglish pattern scan](https://github.com/krushkadam/cloneguard/blob/master/engine/layer2.py): `engine/layer2.py`
- [Pattern catalog](https://github.com/krushkadam/cloneguard/blob/master/data/patterns.json): `data/patterns.json`
- [Composite verdict](https://github.com/krushkadam/cloneguard/blob/master/engine/score.py): `engine/score.py`

### Demo and calibration

- [Call generator](https://github.com/krushkadam/cloneguard/blob/master/generator/generate.py): `generator/generate.py`
- [Scenario scripts](https://github.com/krushkadam/cloneguard/blob/master/generator/scripts.py): `generator/scripts.py`
- [Self-test harness](https://github.com/krushkadam/cloneguard/blob/master/selftest/harness.py): `selftest/harness.py`
- [Calibration scorecard](https://github.com/krushkadam/cloneguard/blob/master/selftest/scorecard.py): `selftest/scorecard.py`

### Evidence and records

- [Incident history](https://github.com/krushkadam/cloneguard/blob/master/engine/pipeline.py): `engine/pipeline.py`
- [Check PDF report](https://github.com/krushkadam/cloneguard/blob/master/reports/incident_pdf.py): `reports/incident_pdf.py`

### Other components

- **Desktop user**
- **Gnani cloud APIs**

## Connections

- Desktop user → Streamlit app: uses (evidence: `README.md`)
- Streamlit app → Check orchestrator: submits checks (evidence: `app.py`)
- Check orchestrator → Speech transcription: transcribes audio (evidence: `engine/pipeline.py`)
- Speech transcription → Gnani cloud APIs: calls Prisma (evidence: `gnani.py`)
- Check orchestrator → Hinglish pattern scan: scans transcript (evidence: `engine/pipeline.py`)
- Check orchestrator → Claim resolver: resolves identity (evidence: `engine/pipeline.py`)
- Check orchestrator → Voice comparison: compares voice (evidence: `engine/pipeline.py`)
- Voice comparison → Embedding service: gets embeddings (evidence: `engine/layer1.py`)
- Embedding service → Gnani cloud APIs: requests embedding (evidence: `voiceprint.py`)
- Check orchestrator → Pattern catalog: loads patterns (evidence: `engine/pipeline.py`)
- Check orchestrator → Composite verdict: scores evidence (evidence: `engine/pipeline.py`)
- Check orchestrator → Incident history: saves checks (evidence: `engine/pipeline.py`)
- Streamlit app → Voice enrollment: manages enrollment (evidence: `app.py`)
- Voice enrollment → Voice comparison: stores voiceprints (evidence: `app.py`)
- Streamlit app → Check PDF report: exports report (evidence: `README.md`)
- Streamlit app → Incident history: shows history (evidence: `README.md`)
- Call generator → Scenario scripts: uses scripts (evidence: `generator/generate.py`)
- Call generator → Gnani cloud APIs: generates speech (evidence: `README.md`)
- Desktop user → Call generator: requests demo calls (evidence: `README.md`)
- Self-test harness → Check orchestrator: runs scenarios (evidence: `selftest/harness.py`)
- Self-test harness → Call generator: creates hard case (evidence: `selftest/harness.py`)
- Self-test harness → Calibration scorecard: renders calibration (evidence: `README.md`)
- Streamlit app → Gnani cloud APIs: requests spoken verdict (evidence: `README.md`)
