# wawazer/scrapechangeticket architecture

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

## Overview

ScrapeChangeTicket is a web application for collecting ServiceNow Change Task records and producing searchable results and reports. Users connect to a ServiceNow session, discover and select a filter, scrape paginated ticket lists and details, then review data or export PDF, Excel, and JSON. The server orchestrates scraping, persistence, and exports; parsing and AI analysis provide supporting processing. Frontend view composition and several backend calls are visible in excerpts, while other documented links are cited to the README; unsampled implementation details are not inferred.

Main entry points: [`frontend/src/App.tsx`](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/App.tsx) (Application shell), [`src/server.js`](https://github.com/wawazer/scrapechangeticket/blob/main/src/server.js) (HTTP server), [`src/parsers.js`](https://github.com/wawazer/scrapechangeticket/blob/main/src/parsers.js) (Record parser), [`src/ai/provider.js`](https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/provider.js) (AI provider)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Web interface"]
  node_app["Application shell<br/>[App.tsx]"]
  node_scrape_view["Scrape controls<br/>[scrape-view.tsx]"]
  node_dashboard["Dashboard<br/>[dashboard-view.tsx]"]
  node_tickets_view["Ticket browser<br/>[tickets-view.tsx]"]
  node_history_view["Scrape history<br/>[history-view.tsx]"]
  node_reports_view["Report exports<br/>[reports-view.tsx]"]
  node_settings_view["Settings<br/>[settings-view.tsx]"]
  node_app_state["Application state hook<br/>[use-app-state.ts]"]
  node_history_hook["History hook"]
  node_api["Frontend API<br/>[api.ts]"]
end

subgraph group_collection["Scraping workflow"]
  node_server["HTTP server<br/>[server.js]"]
  node_sn_client["ServiceNow automation<br/>[servicenow.js]"]
end

subgraph group_processing["Processing and AI"]
  node_parser["Record parser<br/>[parsers.js]"]
  node_utils["Data utilities<br/>[utils.js]"]
  node_risk["Risk analysis<br/>[analysis.js]"]
  node_risk_rules["Risk rules<br/>[risk.js]"]
  node_duplicate["Duplicate detection<br/>[duplicate.js]"]
  node_summary["Ticket summaries<br/>[summary.js]"]
  node_ai_provider["AI provider<br/>[provider.js]"]
end

subgraph group_outputs["State and reports"]
  node_store[("Run state store<br/>[store.js]")]
  node_pdf["PDF generator<br/>[pdf.js]"]
  node_excel["Excel generator<br/>[excel.js]"]
  node_json["JSON export<br/>[server.js]"]
end

node_user(("User"))
node_servicenow["ServiceNow"]
node_llm["LLM service"]

node_user -->|"uses"| node_app
node_app -->|"renders"| node_scrape_view
node_app -->|"renders"| node_dashboard
node_app -->|"renders"| node_tickets_view
node_app -->|"renders"| node_history_view
node_app -->|"renders"| node_reports_view
node_app -->|"renders"| node_settings_view
node_app -->|"uses"| node_app_state
node_app -->|"uses"| node_history_hook
node_user -->|"requests"| node_api
node_api -->|"calls"| node_server
node_server -->|"dispatches"| node_sn_client
node_sn_client -->|"automates"| node_servicenow
node_sn_client -->|"parses with"| node_parser
node_parser -->|"uses"| node_utils
node_server -->|"saves runs"| node_store
node_server -->|"generates"| node_pdf
node_server -->|"generates"| node_excel
node_server -->|"serializes"| node_json
node_pdf -->|"formats tickets"| node_parser
node_excel -->|"uses"| node_parser
node_server -->|"requests summaries"| node_summary
node_server -->|"requests analysis"| node_risk
node_server -.-> node_duplicate
node_risk -->|"scores with"| node_risk_rules
node_risk -->|"queries"| node_ai_provider
node_summary --> node_ai_provider
node_duplicate -->|"queries"| node_ai_provider
node_ai_provider -->|"sends prompts"| node_llm

click node_app "https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/App.tsx"
click node_scrape_view "https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/scrape-view.tsx"
click node_dashboard "https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/dashboard-view.tsx"
click node_tickets_view "https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/tickets-view.tsx"
click node_history_view "https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/history-view.tsx"
click node_reports_view "https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/reports-view.tsx"
click node_settings_view "https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/settings-view.tsx"
click node_app_state "https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/hooks/use-app-state.ts"
click node_history_hook "https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/hooks/use-scrape-history.ts"
click node_api "https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/lib/api.ts"
click node_server "https://github.com/wawazer/scrapechangeticket/blob/main/src/server.js"
click node_sn_client "https://github.com/wawazer/scrapechangeticket/blob/main/src/servicenow.js"
click node_parser "https://github.com/wawazer/scrapechangeticket/blob/main/src/parsers.js"
click node_utils "https://github.com/wawazer/scrapechangeticket/blob/main/src/utils.js"
click node_risk "https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/analysis.js"
click node_risk_rules "https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/risk.js"
click node_duplicate "https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/duplicate.js"
click node_summary "https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/summary.js"
click node_ai_provider "https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/provider.js"
click node_store "https://github.com/wawazer/scrapechangeticket/blob/main/src/store.js"
click node_pdf "https://github.com/wawazer/scrapechangeticket/blob/main/src/pdf.js"
click node_excel "https://github.com/wawazer/scrapechangeticket/blob/main/src/excel.js"
click node_json "https://github.com/wawazer/scrapechangeticket/blob/main/src/server.js"

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_scrape_view,node_dashboard,node_tickets_view,node_history_view,node_reports_view,node_settings_view,node_app_state,node_history_hook,node_api,node_user toneBlue
class node_server,node_sn_client toneAmber
class node_parser,node_utils,node_risk,node_risk_rules,node_duplicate,node_summary,node_ai_provider toneMint
class node_store,node_pdf,node_excel,node_json toneRose
class node_servicenow,node_llm toneIndigo
```

## Components

### Web interface

- [Application shell](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/App.tsx): `frontend/src/App.tsx`
- [Scrape controls](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/scrape-view.tsx): `frontend/src/views/scrape-view.tsx`
- [Dashboard](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/dashboard-view.tsx): `frontend/src/views/dashboard-view.tsx`
- [Ticket browser](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/tickets-view.tsx): `frontend/src/views/tickets-view.tsx`
- [Scrape history](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/history-view.tsx): `frontend/src/views/history-view.tsx`
- [Report exports](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/reports-view.tsx): `frontend/src/views/reports-view.tsx`
- [Settings](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/views/settings-view.tsx): `frontend/src/views/settings-view.tsx`
- [Application state hook](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/hooks/use-app-state.ts): `frontend/src/hooks/use-app-state.ts`
- [History hook](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/hooks/use-scrape-history.ts): `frontend/src/hooks/use-scrape-history.ts`
- [Frontend API](https://github.com/wawazer/scrapechangeticket/blob/main/frontend/src/lib/api.ts): `frontend/src/lib/api.ts`

### Scraping workflow

- [HTTP server](https://github.com/wawazer/scrapechangeticket/blob/main/src/server.js): `src/server.js`
- [ServiceNow automation](https://github.com/wawazer/scrapechangeticket/blob/main/src/servicenow.js): `src/servicenow.js`

### Processing and AI

- [Record parser](https://github.com/wawazer/scrapechangeticket/blob/main/src/parsers.js): `src/parsers.js`
- [Data utilities](https://github.com/wawazer/scrapechangeticket/blob/main/src/utils.js): `src/utils.js`
- [Risk analysis](https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/analysis.js): `src/ai/analysis.js`
- [Risk rules](https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/risk.js): `src/ai/risk.js`
- [Duplicate detection](https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/duplicate.js): `src/ai/duplicate.js`
- [Ticket summaries](https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/summary.js): `src/ai/summary.js`
- [AI provider](https://github.com/wawazer/scrapechangeticket/blob/main/src/ai/provider.js): `src/ai/provider.js`

### State and reports

- [Run state store](https://github.com/wawazer/scrapechangeticket/blob/main/src/store.js): `src/store.js`
- [PDF generator](https://github.com/wawazer/scrapechangeticket/blob/main/src/pdf.js): `src/pdf.js`
- [Excel generator](https://github.com/wawazer/scrapechangeticket/blob/main/src/excel.js): `src/excel.js`
- [JSON export](https://github.com/wawazer/scrapechangeticket/blob/main/src/server.js): `src/server.js`

### Other components

- **User**
- **ServiceNow**
- **LLM service**

## Connections

- User → Application shell: uses
- Application shell → Scrape controls: renders (evidence: `frontend/src/App.tsx`)
- Application shell → Dashboard: renders (evidence: `frontend/src/App.tsx`)
- Application shell → Ticket browser: renders (evidence: `frontend/src/App.tsx`)
- Application shell → Scrape history: renders (evidence: `frontend/src/App.tsx`)
- Application shell → Report exports: renders (evidence: `frontend/src/App.tsx`)
- Application shell → Settings: renders (evidence: `frontend/src/App.tsx`)
- Application shell → Application state hook: uses (evidence: `frontend/src/App.tsx`)
- Application shell → History hook: uses (evidence: `frontend/src/App.tsx`)
- User → Frontend API: requests
- Frontend API → HTTP server: calls
- HTTP server → ServiceNow automation: dispatches (evidence: `src/server.js`)
- ServiceNow automation → ServiceNow: automates
- ServiceNow automation → Record parser: parses with (evidence: `src/servicenow.js`)
- Record parser → Data utilities: uses (evidence: `src/parsers.js`)
- HTTP server → Run state store: saves runs (evidence: `src/server.js`)
- HTTP server → PDF generator: generates (evidence: `src/server.js`)
- HTTP server → Excel generator: generates (evidence: `src/server.js`)
- HTTP server → JSON export: serializes (evidence: `src/server.js`)
- PDF generator → Record parser: formats tickets (evidence: `src/pdf.js`)
- Excel generator → Record parser: uses (evidence: `src/excel.js`)
- HTTP server → Ticket summaries: requests summaries (evidence: `src/server.js`)
- HTTP server → Risk analysis: requests analysis (evidence: `src/server.js`)
- HTTP server → Duplicate detection (evidence: `src/server.js`)
- Risk analysis → Risk rules: scores with (evidence: `src/ai/analysis.js`)
- Risk analysis → AI provider: queries (evidence: `src/ai/analysis.js`)
- Ticket summaries → AI provider (evidence: `src/ai/summary.js`)
- Duplicate detection → AI provider: queries (evidence: `src/ai/duplicate.js`)
- AI provider → LLM service: sends prompts (evidence: `src/ai/provider.js`)
