# scognamiglio1969/radar-intelligence architecture

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

- Interactive diagram: https://gitdiagram.com/scognamiglio1969/radar-intelligence
- Repository: https://github.com/scognamiglio1969/radar-intelligence

## Overview

Radar is a self-hosted media-intelligence and social-listening product. Users define what to monitor, collect data from public sources or import existing datasets, then explore signals and generate analyses and reports. The graph preserves those distinct paths and the main analysis and delivery capabilities. Source excerpts confirm pipeline orchestration, database-backed AI endpoints, and export preparation; wiring for unsampled screens and several documented capabilities is shown only where the README supports it.

Main entry points: [`lib/db/schema.ts`](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/db/schema.ts) (Project data), [`lib/pipeline.ts`](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/pipeline.ts) (Refresh pipeline), [`lib/ingest.ts`](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/ingest.ts) (Project ingestion), [`lib/connectors/index.ts`](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/connectors/index.ts) (Source connectors)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_setup["Project setup"]
  node_query_ui["Query builder<br/>[page.tsx]"]
  node_query_actions["Query actions<br/>[actions.ts]"]
  node_listening_ui["Listening<br/>[page.tsx]"]
end

subgraph group_collection["Data collection"]
  node_import_ui["Import workspace<br/>[page.tsx]"]
  node_import_flow["Import processing<br/>[import.ts]"]
  node_import_normalize["Normalization"]
  node_pipeline["Refresh pipeline<br/>[pipeline.ts]"]
  node_ingest["Project ingestion<br/>[ingest.ts]"]
  node_connectors["Source connectors<br/>[index.ts]"]
end

subgraph group_analysis["Intelligence"]
  node_ask_api["Ask endpoint<br/>[route.ts]"]
  node_compare_api["Comparison endpoint<br/>[route.ts]"]
  node_insights["Insights<br/>[insights.ts]"]
  node_insights_ui["Insights hub<br/>[page.tsx]"]
  node_reviews["Reviews analysis<br/>[index.ts]"]
  node_sport["Sports signals<br/>[index.ts]"]
  node_studio_api["Chart studio<br/>[route.ts]"]
  node_studio_engine["Studio queries<br/>[studio.ts]"]
  node_alerts["Alerts<br/>[alerts.ts]"]
end

subgraph group_delivery["Reports and outputs"]
  node_report_ui["Report builder<br/>[page.tsx]"]
  node_export_api["Export endpoint<br/>[route.ts]"]
  node_export_data["Export data<br/>[export-data.ts]"]
  node_studio_blocks["Saved chart blocks<br/>[studio.ts]"]
end

subgraph group_platform["Core services"]
  node_database[("Project data<br/>[schema.ts]")]
  node_ai_provider["AI provider<br/>[claude.ts]"]
end

node_user(("User"))
node_external_sources{{"Public data sources"}}
node_talkwalker{{"Talkwalker"}}

node_user -->|"describes monitoring"| node_query_ui
node_query_ui -->|"submits queries"| node_query_actions
node_user -->|"uploads data"| node_import_ui
node_import_ui -->|"starts import"| node_import_flow
node_import_flow -->|"normalizes rows"| node_import_normalize
node_import_normalize -->|"stores mentions"| node_database
node_pipeline -->|"runs collection"| node_ingest
node_ingest -->|"dispatches queries"| node_connectors
node_connectors -->|"fetches mentions"| node_external_sources
node_connectors -.->|"queries configured topics"| node_talkwalker
node_ingest -->|"writes collected data"| node_database
node_pipeline -->|"reads and updates state"| node_database
node_user -->|"reviews conversation"| node_listening_ui
node_listening_ui -->|"reads mentions"| node_database
node_ask_api -->|"reads context and mentions"| node_database
node_ask_api -->|"requests answer"| node_ai_provider
node_compare_api -->|"reads comparison data"| node_database
node_compare_api -->|"requests comparison"| node_ai_provider
node_database -->|"provides project data"| node_insights
node_insights_ui -->|"presents analyses"| node_insights
node_pipeline -->|"ingests reviews"| node_reviews
node_pipeline -->|"ingests sports data"| node_sport
node_studio_api -->|"runs chart spec"| node_studio_engine
node_studio_engine -->|"queries project data"| node_database
node_studio_api -->|"saves chart specs"| node_database
node_user -->|"builds report"| node_report_ui
node_report_ui -->|"requests export"| node_export_api
node_export_api -->|"collects report data"| node_export_data
node_export_api -->|"resolves selected blocks"| node_studio_blocks
node_export_data -->|"reads project data"| node_database
node_pipeline -->|"checks alert signals"| node_alerts

click node_query_ui "https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/query/page.tsx"
click node_query_actions "https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/query/actions.ts"
click node_listening_ui "https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/listening/page.tsx"
click node_import_ui "https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/import/page.tsx"
click node_import_flow "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/import.ts"
click node_import_normalize "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/import-normalize.ts"
click node_pipeline "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/pipeline.ts"
click node_ingest "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/ingest.ts"
click node_connectors "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/connectors/index.ts"
click node_database "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/db/schema.ts"
click node_ask_api "https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/api/ask/route.ts"
click node_compare_api "https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/api/compare/route.ts"
click node_ai_provider "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/claude.ts"
click node_insights "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/insights.ts"
click node_insights_ui "https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/insights/page.tsx"
click node_reviews "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/reviews/index.ts"
click node_sport "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/sport/index.ts"
click node_studio_api "https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/api/studio/route.ts"
click node_studio_engine "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/studio.ts"
click node_report_ui "https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/report/page.tsx"
click node_export_api "https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/api/export/xlsx/route.ts"
click node_export_data "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/export-data.ts"
click node_studio_blocks "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/studio.ts"
click node_alerts "https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/alerts.ts"

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_query_ui,node_query_actions,node_listening_ui,node_user toneBlue
class node_import_ui,node_import_flow,node_import_normalize,node_pipeline,node_ingest,node_connectors toneAmber
class node_ask_api,node_compare_api,node_insights,node_insights_ui,node_reviews,node_sport,node_studio_api,node_studio_engine,node_alerts toneMint
class node_report_ui,node_export_api,node_export_data,node_studio_blocks toneRose
class node_database,node_ai_provider,node_external_sources,node_talkwalker toneIndigo
```

## Components

### Project setup

- [Query builder](https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/query/page.tsx): `app/query/page.tsx`
- [Query actions](https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/query/actions.ts): `app/query/actions.ts`
- [Listening](https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/listening/page.tsx): `app/listening/page.tsx`

### Data collection

- [Import workspace](https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/import/page.tsx): `app/import/page.tsx`
- [Import processing](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/import.ts): `lib/import.ts`
- [Normalization](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/import-normalize.ts): `lib/import-normalize.ts`
- [Refresh pipeline](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/pipeline.ts): `lib/pipeline.ts`
- [Project ingestion](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/ingest.ts): `lib/ingest.ts`
- [Source connectors](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/connectors/index.ts): `lib/connectors/index.ts`

### Intelligence

- [Ask endpoint](https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/api/ask/route.ts): `app/api/ask/route.ts`
- [Comparison endpoint](https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/api/compare/route.ts): `app/api/compare/route.ts`
- [Insights](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/insights.ts): `lib/insights.ts`
- [Insights hub](https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/insights/page.tsx): `app/insights/page.tsx`
- [Reviews analysis](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/reviews/index.ts): `lib/reviews/index.ts`
- [Sports signals](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/sport/index.ts): `lib/sport/index.ts`
- [Chart studio](https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/api/studio/route.ts): `app/api/studio/route.ts`
- [Studio queries](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/studio.ts): `lib/studio.ts`
- [Alerts](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/alerts.ts): `lib/alerts.ts`

### Reports and outputs

- [Report builder](https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/report/page.tsx): `app/report/page.tsx`
- [Export endpoint](https://github.com/scognamiglio1969/radar-intelligence/blob/main/app/api/export/xlsx/route.ts): `app/api/export/xlsx/route.ts`
- [Export data](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/export-data.ts): `lib/export-data.ts`
- [Saved chart blocks](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/studio.ts): `lib/studio.ts`

### Core services

- [Project data](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/db/schema.ts): `lib/db/schema.ts`
- [AI provider](https://github.com/scognamiglio1969/radar-intelligence/blob/main/lib/claude.ts): `lib/claude.ts`

### Other components

- **User**
- **Public data sources**
- **Talkwalker**

## Connections

- User → Query builder: describes monitoring
- Query builder → Query actions: submits queries
- User → Import workspace: uploads data
- Import workspace → Import processing: starts import
- Import processing → Normalization: normalizes rows
- Normalization → Project data: stores mentions
- Refresh pipeline → Project ingestion: runs collection
- Project ingestion → Source connectors: dispatches queries
- Source connectors → Public data sources: fetches mentions
- Source connectors → Talkwalker: queries configured topics
- Project ingestion → Project data: writes collected data
- Refresh pipeline → Project data: reads and updates state
- User → Listening: reviews conversation
- Listening → Project data: reads mentions
- Ask endpoint → Project data: reads context and mentions
- Ask endpoint → AI provider: requests answer
- Comparison endpoint → Project data: reads comparison data
- Comparison endpoint → AI provider: requests comparison
- Project data → Insights: provides project data
- Insights hub → Insights: presents analyses
- Refresh pipeline → Reviews analysis: ingests reviews
- Refresh pipeline → Sports signals: ingests sports data
- Chart studio → Studio queries: runs chart spec
- Studio queries → Project data: queries project data
- Chart studio → Project data: saves chart specs
- User → Report builder: builds report
- Report builder → Export endpoint: requests export
- Export endpoint → Export data: collects report data
- Export endpoint → Saved chart blocks: resolves selected blocks
- Export data → Project data: reads project data
- Refresh pipeline → Alerts: checks alert signals
