# kshitijkaria/sparcblog-ai architecture

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

- Interactive diagram: https://gitdiagram.com/kshitijkaria/sparcblog-ai
- Repository: https://github.com/kshitijkaria/sparcblog-ai

## Overview

SparcBlog AI gathers and relevance-scores RSS articles, turns selected coverage into brand-voiced blog drafts, and supports editorial review, publication, source management, and dashboard statistics. The Angular dashboard calls Spring Boot APIs; backend services use MongoDB and optional external AI/WordPress integrations. Edges follow the sampled service/controller calls and README-documented features; some frontend screens, statistics, scheduling, and publication wiring are represented at their exact tree paths but not independently inspected.

Main entry points: [`frontend/src/app/app.routes.ts`](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/app.routes.ts) (Dashboard routes), [`backend/src/main/java/com/sparcblog/service/NewsFetchService.java`](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/NewsFetchService.java) (RSS fetch and scoring), [`backend/src/main/java/com/sparcblog/service/DraftService.java`](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/DraftService.java) (Draft lifecycle), [`backend/src/main/java/com/sparcblog/repository/RawArticleRepository.java`](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/repository/RawArticleRepository.java) (Article repository)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Editorial dashboard"]
  node_angular["Angular app<br/>[app.component.ts]"]
  node_routes["Dashboard routes<br/>[app.routes.ts]"]
  node_newsui["News feed"]
  node_sourceui["Source manager"]
  node_draftui["Draft screens"]
  node_statsui["Dashboard stats"]
  node_blogui["Published blog"]
  node_draftapi["Draft API client<br/>[draft.service.ts]"]
  node_newsapi["News API client<br/>[news.service.ts]"]
  node_sourceapi["Source API client<br/>[source.service.ts]"]
end

subgraph group_news["News intake"]
  node_rss(("RSS sources"))
  node_fetch["RSS fetch and scoring"]
  node_sources["Source endpoints"]
  node_newsctrl["Article endpoints"]
  node_scheduler["Scheduled fetch"]
end

subgraph group_content["Draft workflow"]
  node_draftctrl["Draft endpoints"]
  node_draftservice["Draft lifecycle<br/>[DraftService.java]"]
  node_claude["AI draft generation"]
  node_autopublish["Auto-publish workflow"]
  node_wordpress["WordPress publisher"]
end

subgraph group_platform["Backend and data"]
  node_articles[("Stored articles<br/>[RawArticle.java]")]
  node_articlerepo["Article repository"]
  node_sourcerepo["Source repository"]
  node_drafts[("Draft records<br/>[BlogDraft.java]")]
  node_draftrepo["Draft repository"]
  node_stats["Statistics service<br/>[StatsService.java]"]
  node_statsctrl["Statistics endpoint"]
end

node_editor(("Editor"))
node_ai{{"Generative AI API"}}
node_wp{{"WordPress"}}

node_editor -->|"uses"| node_angular
node_angular -->|"routes via"| node_routes
node_routes -->|"routes to"| node_newsui
node_routes -->|"routes to"| node_sourceui
node_routes -->|"routes to"| node_draftui
node_routes -->|"routes to"| node_statsui
node_routes -->|"routes to"| node_blogui
node_newsui -->|"calls"| node_newsapi
node_sourceui -->|"calls"| node_sourceapi
node_draftui -.->|"calls"| node_draftapi
node_newsapi -.->|"HTTP requests"| node_newsctrl
node_sourceapi -.->|"HTTP requests"| node_sources
node_draftapi -.->|"HTTP requests"| node_draftctrl
node_rss -->|"provides feeds"| node_fetch
node_fetch -->|"loads active sources"| node_sourcerepo
node_fetch -->|"checks and saves"| node_articlerepo
node_sources -->|"manages sources"| node_sourcerepo
node_newsctrl -->|"reads articles"| node_articlerepo
node_newsctrl -->|"triggers fetch"| node_fetch
node_draftctrl -->|"delegates"| node_draftservice
node_draftservice -->|"selects and marks used"| node_articlerepo
node_draftservice -->|"requests draft"| node_claude
node_claude -->|"generates content"| node_ai
node_draftservice -->|"saves and updates"| node_draftrepo
node_statsctrl -.->|"delegates"| node_stats
node_stats -->|"counts drafts"| node_draftrepo
node_stats -->|"counts articles"| node_articlerepo
node_stats -->|"counts sources"| node_sourcerepo
node_scheduler -->|"runs daily"| node_fetch
node_autopublish -->|"fetches news"| node_fetch
node_autopublish -->|"checks availability"| node_articlerepo
node_autopublish -->|"generates and publishes status"| node_draftservice
node_autopublish -->|"publishes optionally"| node_wordpress
node_wordpress -.->|"publishes post"| node_wp

click node_angular "https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/app.component.ts"
click node_routes "https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/app.routes.ts"
click node_newsui "https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/components/news-feed/news-feed.component.ts"
click node_sourceui "https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/components/source-manager/source-manager.component.ts"
click node_draftui "https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/components/draft-list/draft-list.component.ts"
click node_statsui "https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/components/dashboard/dashboard.component.ts"
click node_blogui "https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/components/blog-list/blog-list.component.ts"
click node_draftapi "https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/services/draft.service.ts"
click node_newsapi "https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/services/news.service.ts"
click node_sourceapi "https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/services/source.service.ts"
click node_fetch "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/NewsFetchService.java"
click node_sources "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/controller/SourceController.java"
click node_newsctrl "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/controller/NewsController.java"
click node_articles "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/model/RawArticle.java"
click node_articlerepo "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/repository/RawArticleRepository.java"
click node_sourcerepo "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/repository/NewsSourceRepository.java"
click node_draftctrl "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/controller/DraftController.java"
click node_draftservice "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/DraftService.java"
click node_claude "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/ClaudeContentService.java"
click node_drafts "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/model/BlogDraft.java"
click node_draftrepo "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/repository/BlogDraftRepository.java"
click node_stats "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/StatsService.java"
click node_statsctrl "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/controller/StatsController.java"
click node_scheduler "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/scheduler/NewsFetchScheduler.java"
click node_autopublish "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/AutoPublishService.java"
click node_wordpress "https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/WordPressPublishService.java"

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_angular,node_routes,node_newsui,node_sourceui,node_draftui,node_statsui,node_blogui,node_draftapi,node_newsapi,node_sourceapi toneBlue
class node_rss,node_fetch,node_sources,node_newsctrl,node_scheduler toneAmber
class node_draftctrl,node_draftservice,node_claude,node_autopublish,node_wordpress,node_ai toneMint
class node_articles,node_articlerepo,node_sourcerepo,node_drafts,node_draftrepo,node_stats,node_statsctrl toneRose
class node_editor,node_wp toneIndigo
```

## Components

### Editorial dashboard

- [Angular app](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/app.component.ts): `frontend/src/app/app.component.ts`
- [Dashboard routes](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/app.routes.ts): `frontend/src/app/app.routes.ts`
- [News feed](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/components/news-feed/news-feed.component.ts): `frontend/src/app/components/news-feed/news-feed.component.ts`
- [Source manager](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/components/source-manager/source-manager.component.ts): `frontend/src/app/components/source-manager/source-manager.component.ts`
- [Draft screens](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/components/draft-list/draft-list.component.ts): `frontend/src/app/components/draft-list/draft-list.component.ts`
- [Dashboard stats](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/components/dashboard/dashboard.component.ts): `frontend/src/app/components/dashboard/dashboard.component.ts`
- [Published blog](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/components/blog-list/blog-list.component.ts): `frontend/src/app/components/blog-list/blog-list.component.ts`
- [Draft API client](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/services/draft.service.ts): `frontend/src/app/services/draft.service.ts`
- [News API client](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/services/news.service.ts): `frontend/src/app/services/news.service.ts`
- [Source API client](https://github.com/kshitijkaria/sparcblog-ai/blob/main/frontend/src/app/services/source.service.ts): `frontend/src/app/services/source.service.ts`

### News intake

- **RSS sources**
- [RSS fetch and scoring](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/NewsFetchService.java): `backend/src/main/java/com/sparcblog/service/NewsFetchService.java`
- [Source endpoints](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/controller/SourceController.java): `backend/src/main/java/com/sparcblog/controller/SourceController.java`
- [Article endpoints](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/controller/NewsController.java): `backend/src/main/java/com/sparcblog/controller/NewsController.java`
- [Scheduled fetch](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/scheduler/NewsFetchScheduler.java): `backend/src/main/java/com/sparcblog/scheduler/NewsFetchScheduler.java`

### Draft workflow

- [Draft endpoints](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/controller/DraftController.java): `backend/src/main/java/com/sparcblog/controller/DraftController.java`
- [Draft lifecycle](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/DraftService.java): `backend/src/main/java/com/sparcblog/service/DraftService.java`
- [AI draft generation](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/ClaudeContentService.java): `backend/src/main/java/com/sparcblog/service/ClaudeContentService.java`
- [Auto-publish workflow](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/AutoPublishService.java): `backend/src/main/java/com/sparcblog/service/AutoPublishService.java`
- [WordPress publisher](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/WordPressPublishService.java): `backend/src/main/java/com/sparcblog/service/WordPressPublishService.java`

### Backend and data

- [Stored articles](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/model/RawArticle.java): `backend/src/main/java/com/sparcblog/model/RawArticle.java`
- [Article repository](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/repository/RawArticleRepository.java): `backend/src/main/java/com/sparcblog/repository/RawArticleRepository.java`
- [Source repository](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/repository/NewsSourceRepository.java): `backend/src/main/java/com/sparcblog/repository/NewsSourceRepository.java`
- [Draft records](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/model/BlogDraft.java): `backend/src/main/java/com/sparcblog/model/BlogDraft.java`
- [Draft repository](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/repository/BlogDraftRepository.java): `backend/src/main/java/com/sparcblog/repository/BlogDraftRepository.java`
- [Statistics service](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/service/StatsService.java): `backend/src/main/java/com/sparcblog/service/StatsService.java`
- [Statistics endpoint](https://github.com/kshitijkaria/sparcblog-ai/blob/main/backend/src/main/java/com/sparcblog/controller/StatsController.java): `backend/src/main/java/com/sparcblog/controller/StatsController.java`

### Other components

- **Editor**
- **Generative AI API**
- **WordPress**

## Connections

- Editor → Angular app: uses
- Angular app → Dashboard routes: routes via
- Dashboard routes → News feed: routes to (evidence: `frontend/src/app/app.routes.ts`)
- Dashboard routes → Source manager: routes to (evidence: `frontend/src/app/app.routes.ts`)
- Dashboard routes → Draft screens: routes to (evidence: `frontend/src/app/app.routes.ts`)
- Dashboard routes → Dashboard stats: routes to (evidence: `frontend/src/app/app.routes.ts`)
- Dashboard routes → Published blog: routes to (evidence: `frontend/src/app/app.routes.ts`)
- News feed → News API client: calls (evidence: `frontend/src/app/components/news-feed/news-feed.component.ts`)
- Source manager → Source API client: calls (evidence: `frontend/src/app/components/source-manager/source-manager.component.ts`)
- Draft screens → Draft API client: calls (evidence: `frontend/src/app/components/draft-list/draft-list.component.ts`)
- News API client → Article endpoints: HTTP requests
- Source API client → Source endpoints: HTTP requests
- Draft API client → Draft endpoints: HTTP requests
- RSS sources → RSS fetch and scoring: provides feeds (evidence: `README.md`)
- RSS fetch and scoring → Source repository: loads active sources (evidence: `backend/src/main/java/com/sparcblog/service/NewsFetchService.java`)
- RSS fetch and scoring → Article repository: checks and saves (evidence: `backend/src/main/java/com/sparcblog/service/NewsFetchService.java`)
- Source endpoints → Source repository: manages sources (evidence: `backend/src/main/java/com/sparcblog/controller/SourceController.java`)
- Article endpoints → Article repository: reads articles (evidence: `backend/src/main/java/com/sparcblog/controller/NewsController.java`)
- Article endpoints → RSS fetch and scoring: triggers fetch (evidence: `backend/src/main/java/com/sparcblog/controller/NewsController.java`)
- Draft endpoints → Draft lifecycle: delegates (evidence: `backend/src/main/java/com/sparcblog/controller/DraftController.java`)
- Draft lifecycle → Article repository: selects and marks used (evidence: `backend/src/main/java/com/sparcblog/service/DraftService.java`)
- Draft lifecycle → AI draft generation: requests draft (evidence: `backend/src/main/java/com/sparcblog/service/DraftService.java`)
- AI draft generation → Generative AI API: generates content (evidence: `backend/src/main/java/com/sparcblog/service/ClaudeContentService.java`)
- Draft lifecycle → Draft repository: saves and updates (evidence: `backend/src/main/java/com/sparcblog/service/DraftService.java`)
- Statistics endpoint → Statistics service: delegates
- Statistics service → Draft repository: counts drafts (evidence: `backend/src/main/java/com/sparcblog/service/StatsService.java`)
- Statistics service → Article repository: counts articles (evidence: `backend/src/main/java/com/sparcblog/service/StatsService.java`)
- Statistics service → Source repository: counts sources (evidence: `backend/src/main/java/com/sparcblog/service/StatsService.java`)
- Scheduled fetch → RSS fetch and scoring: runs daily (evidence: `README.md`)
- Auto-publish workflow → RSS fetch and scoring: fetches news (evidence: `backend/src/main/java/com/sparcblog/service/AutoPublishService.java`)
- Auto-publish workflow → Article repository: checks availability (evidence: `backend/src/main/java/com/sparcblog/service/AutoPublishService.java`)
- Auto-publish workflow → Draft lifecycle: generates and publishes status (evidence: `backend/src/main/java/com/sparcblog/service/AutoPublishService.java`)
- Auto-publish workflow → WordPress publisher: publishes optionally (evidence: `backend/src/main/java/com/sparcblog/service/AutoPublishService.java`)
- WordPress publisher → WordPress: publishes post
