# ace-haxxed/reconpipeline architecture

> Architecture diagram of the GitHub repository ace-haxxed/reconpipeline, 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/ace-haxxed/reconpipeline
- Repository: https://github.com/ace-haxxed/reconpipeline
- Video tour (about a minute): https://gitdiagram.com/ace-haxxed/reconpipeline/video

## Overview

ReconPipeline takes an authorized target and engagement name, runs staged reconnaissance, stores normalized per-tool findings, correlates them into a prioritized attack-surface summary, and presents progress and results in a web dashboard with PDF export. The README documents additional scan stages and optional tools beyond the excerpts; the graph preserves these documented capabilities without inventing unsampled call paths. Verification is an additional read-only assessment capability. The frontend communicates with the backend over HTTP; source excerpts show backend route ownership and UI composition, but not every runtime detail.

Main entry points: [`backend/app/orchestrator.py`](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/orchestrator.py) (Stage orchestrator), [`frontend/src/App.tsx`](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/App.tsx) (Dashboard shell), [`frontend/src/components/EngagementDetail.tsx`](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/EngagementDetail.tsx) (Engagement detail), [`backend/app/main.py`](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/main.py) (FastAPI routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Web interface"]
  node_app["Dashboard shell<br/>[App.tsx]"]
  node_engageform["Engagement form<br/>[NewEngagement.tsx]"]
  node_detail["Engagement detail"]
  node_dashboard["Findings dashboard<br/>[Dashboard.tsx]"]
  node_progress["Tool progress<br/>[ToolProgress.tsx]"]
  node_llmview["Summary view<br/>[LlmSummary.tsx]"]
  node_toolbanner["Tool availability<br/>[ToolBanner.tsx]"]
  node_api_client["Typed API client<br/>[client.ts]"]
  node_findings["Finding extraction<br/>[findings.ts]"]
end

subgraph group_api["API and persistence"]
  node_backend["FastAPI routes<br/>[main.py]"]
  node_db[("Engagement store<br/>[database.py]")]
  node_schemas["Common schemas<br/>[schemas.py]"]
end

subgraph group_pipeline["Recon pipeline"]
  node_orchestrator["Stage orchestrator<br/>[orchestrator.py]"]
  node_subdomain["Subdomain enumeration<br/>[subfinder.py]"]
  node_dns["DNS resolution<br/>[dnsx.py]"]
  node_ports["Port scanning<br/>[naabu.py]"]
  node_services["Service scanning<br/>[nmap.py]"]
  node_fingerprint["Web fingerprinting<br/>[whatweb.py]"]
  node_weburls["Web URL derivation<br/>[weburls.py]"]
  node_crawl["Crawl and archives<br/>[katana.py]"]
  node_discovery["Content discovery<br/>[ffuf.py]"]
  node_extended_tools["Extended tool runners"]
  node_toolbase["Subprocess harness<br/>[base.py]"]
end

subgraph group_analysis["Analysis and reporting"]
  node_llm["Finding correlation<br/>[llm.py]"]
  node_verify["Finding verification<br/>[verify.py]"]
  node_report["PDF report<br/>[report.py]"]
end

node_operator(("Operator"))
node_llm_service["OpenRouter"]

node_operator -->|"uses"| node_app
node_app -->|"renders"| node_engageform
node_app -->|"renders"| node_detail
node_app -->|"renders"| node_toolbanner
node_engageform -->|"creates via"| node_api_client
node_app -->|"lists via"| node_api_client
node_detail -->|"renders"| node_dashboard
node_detail -->|"renders"| node_progress
node_detail -->|"renders"| node_llmview
node_dashboard -->|"extracts with"| node_findings
node_api_client -->|"HTTP requests"| node_backend
node_backend -->|"creates and reads"| node_db
node_backend -->|"starts background"| node_orchestrator
node_backend -->|"builds PDF"| node_report
node_backend -->|"validates input"| node_schemas
node_orchestrator -->|"persists runs"| node_db
node_orchestrator -->|"dispatches stages"| node_subdomain
node_orchestrator -->|"dispatches stages"| node_dns
node_orchestrator -->|"dispatches stages"| node_ports
node_orchestrator -->|"dispatches stages"| node_services
node_orchestrator -->|"dispatches stages"| node_fingerprint
node_orchestrator -->|"dispatches stages"| node_crawl
node_orchestrator -->|"dispatches stages"| node_discovery
node_orchestrator -->|"dispatches stages"| node_extended_tools
node_orchestrator -->|"runs tools through"| node_toolbase
node_fingerprint -->|"derives endpoints with"| node_weburls
node_crawl -->|"derives endpoints with"| node_weburls
node_toolbase -->|"wraps findings"| node_schemas
node_orchestrator -->|"aggregates findings"| node_llm
node_llm -.->|"correlates via"| node_llm_service
node_orchestrator -->|"stores summary"| node_db
node_verify -.->|"reads scan data"| node_db
node_report -->|"uses run data"| node_db
node_detail -->|"loads details"| node_api_client

click node_app "https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/App.tsx"
click node_engageform "https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/NewEngagement.tsx"
click node_detail "https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/EngagementDetail.tsx"
click node_dashboard "https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/Dashboard.tsx"
click node_progress "https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/ToolProgress.tsx"
click node_llmview "https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/LlmSummary.tsx"
click node_toolbanner "https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/ToolBanner.tsx"
click node_api_client "https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/api/client.ts"
click node_findings "https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/api/findings.ts"
click node_backend "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/main.py"
click node_db "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/database.py"
click node_schemas "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/schemas.py"
click node_orchestrator "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/orchestrator.py"
click node_subdomain "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/subfinder.py"
click node_dns "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/dnsx.py"
click node_ports "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/naabu.py"
click node_services "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/nmap.py"
click node_fingerprint "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/whatweb.py"
click node_weburls "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/weburls.py"
click node_crawl "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/katana.py"
click node_discovery "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/ffuf.py"
click node_extended_tools "https://github.com/ace-haxxed/reconpipeline/tree/main/backend/app/tools"
click node_toolbase "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/base.py"
click node_llm "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/llm.py"
click node_verify "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/verify.py"
click node_report "https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/report.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_app,node_engageform,node_detail,node_dashboard,node_progress,node_llmview,node_toolbanner,node_api_client,node_findings toneBlue
class node_backend,node_db,node_schemas toneAmber
class node_orchestrator,node_subdomain,node_dns,node_ports,node_services,node_fingerprint,node_weburls,node_crawl,node_discovery,node_extended_tools,node_toolbase,node_llm_service toneMint
class node_llm,node_verify,node_report toneRose
class node_operator toneIndigo
```

## Components

### Web interface

- [Dashboard shell](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/App.tsx): `frontend/src/App.tsx`
- [Engagement form](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/NewEngagement.tsx): `frontend/src/components/NewEngagement.tsx`
- [Engagement detail](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/EngagementDetail.tsx): `frontend/src/components/EngagementDetail.tsx`
- [Findings dashboard](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/Dashboard.tsx): `frontend/src/components/Dashboard.tsx`
- [Tool progress](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/ToolProgress.tsx): `frontend/src/components/ToolProgress.tsx`
- [Summary view](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/LlmSummary.tsx): `frontend/src/components/LlmSummary.tsx`
- [Tool availability](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/components/ToolBanner.tsx): `frontend/src/components/ToolBanner.tsx`
- [Typed API client](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/api/client.ts): `frontend/src/api/client.ts`
- [Finding extraction](https://github.com/ace-haxxed/reconpipeline/blob/main/frontend/src/api/findings.ts): `frontend/src/api/findings.ts`

### API and persistence

- [FastAPI routes](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/main.py): `backend/app/main.py`
- [Engagement store](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/database.py): `backend/app/database.py`
- [Common schemas](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/schemas.py): `backend/app/schemas.py`

### Recon pipeline

- [Stage orchestrator](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/orchestrator.py): `backend/app/orchestrator.py`
- [Subdomain enumeration](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/subfinder.py): `backend/app/tools/subfinder.py`
- [DNS resolution](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/dnsx.py): `backend/app/tools/dnsx.py`
- [Port scanning](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/naabu.py): `backend/app/tools/naabu.py`
- [Service scanning](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/nmap.py): `backend/app/tools/nmap.py`
- [Web fingerprinting](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/whatweb.py): `backend/app/tools/whatweb.py`
- [Web URL derivation](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/weburls.py): `backend/app/tools/weburls.py`
- [Crawl and archives](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/katana.py): `backend/app/tools/katana.py`
- [Content discovery](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/ffuf.py): `backend/app/tools/ffuf.py`
- [Extended tool runners](https://github.com/ace-haxxed/reconpipeline/tree/main/backend/app/tools): `backend/app/tools`
- [Subprocess harness](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/tools/base.py): `backend/app/tools/base.py`

### Analysis and reporting

- [Finding correlation](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/llm.py): `backend/app/llm.py`
- [Finding verification](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/verify.py): `backend/app/verify.py`
- [PDF report](https://github.com/ace-haxxed/reconpipeline/blob/main/backend/app/report.py): `backend/app/report.py`

### Other components

- **Operator**
- **OpenRouter**

## Connections

- Operator → Dashboard shell: uses (evidence: `frontend/src/App.tsx`)
- Dashboard shell → Engagement form: renders (evidence: `frontend/src/App.tsx`)
- Dashboard shell → Engagement detail: renders (evidence: `frontend/src/App.tsx`)
- Dashboard shell → Tool availability: renders (evidence: `frontend/src/App.tsx`)
- Engagement form → Typed API client: creates via (evidence: `frontend/src/App.tsx`)
- Dashboard shell → Typed API client: lists via (evidence: `frontend/src/App.tsx`)
- Engagement detail → Findings dashboard: renders (evidence: `frontend/src/components/EngagementDetail.tsx`)
- Engagement detail → Tool progress: renders (evidence: `frontend/src/components/EngagementDetail.tsx`)
- Engagement detail → Summary view: renders (evidence: `frontend/src/components/EngagementDetail.tsx`)
- Findings dashboard → Finding extraction: extracts with (evidence: `frontend/src/components/Dashboard.tsx`)
- Typed API client → FastAPI routes: HTTP requests (evidence: `frontend/src/api/client.ts`)
- FastAPI routes → Engagement store: creates and reads (evidence: `backend/app/main.py`)
- FastAPI routes → Stage orchestrator: starts background (evidence: `backend/app/main.py`)
- FastAPI routes → PDF report: builds PDF (evidence: `backend/app/main.py`)
- FastAPI routes → Common schemas: validates input (evidence: `backend/app/main.py`)
- Stage orchestrator → Engagement store: persists runs (evidence: `backend/app/orchestrator.py`)
- Stage orchestrator → Subdomain enumeration: dispatches stages (evidence: `backend/app/orchestrator.py`)
- Stage orchestrator → DNS resolution: dispatches stages (evidence: `backend/app/orchestrator.py`)
- Stage orchestrator → Port scanning: dispatches stages (evidence: `backend/app/orchestrator.py`)
- Stage orchestrator → Service scanning: dispatches stages (evidence: `backend/app/orchestrator.py`)
- Stage orchestrator → Web fingerprinting: dispatches stages (evidence: `backend/app/orchestrator.py`)
- Stage orchestrator → Crawl and archives: dispatches stages (evidence: `backend/app/orchestrator.py`)
- Stage orchestrator → Content discovery: dispatches stages (evidence: `backend/app/orchestrator.py`)
- Stage orchestrator → Extended tool runners: dispatches stages (evidence: `backend/app/orchestrator.py`)
- Stage orchestrator → Subprocess harness: runs tools through (evidence: `backend/app/orchestrator.py`)
- Web fingerprinting → Web URL derivation: derives endpoints with (evidence: `backend/app/tools/whatweb.py`)
- Crawl and archives → Web URL derivation: derives endpoints with (evidence: `backend/app/tools/katana.py`)
- Subprocess harness → Common schemas: wraps findings (evidence: `backend/app/tools/base.py`)
- Stage orchestrator → Finding correlation: aggregates findings (evidence: `backend/app/orchestrator.py`)
- Finding correlation → OpenRouter: correlates via (evidence: `backend/app/llm.py`)
- Stage orchestrator → Engagement store: stores summary (evidence: `backend/app/orchestrator.py`)
- Finding verification → Engagement store: reads scan data (evidence: `backend/app/verify.py`)
- PDF report → Engagement store: uses run data (evidence: `backend/app/main.py`)
- Engagement detail → Typed API client: loads details (evidence: `frontend/src/components/EngagementDetail.tsx`)
