# dokaeby/dait architecture

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

- Interactive diagram: https://gitdiagram.com/dokaeby/dait
- Repository: https://github.com/dokaeby/dait

## Overview

DAIT is an AI-news curation service: approved RSS collection feeds a processing pipeline that extracts, translates, summarizes, and ranks articles for API delivery. The sampled legacy-style `src/backend/app` implementation provides the clearest end-to-end evidence; the README also describes a frontend, while the supplied excerpts do not establish its runtime connections. Other `src/backend/src/dait` modules are present in the tree but are not expanded into speculative flows.

Main entry points: [`src/backend/app/services/news_service.py`](https://github.com/dokaeby/dait/blob/main/src/backend/app/services/news_service.py) (News query service), [`src/backend/app/workers/collector_worker.py`](https://github.com/dokaeby/dait/blob/main/src/backend/app/workers/collector_worker.py) (Collection worker), [`src/backend/app/api/main.py`](https://github.com/dokaeby/dait/blob/main/src/backend/app/api/main.py) (FastAPI app), [`src/backend/app/collectors/rss_collector.py`](https://github.com/dokaeby/dait/blob/main/src/backend/app/collectors/rss_collector.py) (RSS collector)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingest["Collection pipeline"]
  node_feed_sources["Official RSS sources<br/>[taxonomy.py]"]
  node_rss["RSS collector<br/>[rss_collector.py]"]
  node_extractor["Article extractor"]
  node_collector_worker["Collection worker"]
  node_article_contracts["Article contracts<br/>[collector.py]"]
end

subgraph group_process["AI processing"]
  node_ai_processor["AI content processor<br/>[ai_processor.py]"]
  node_content_contracts["Content contracts<br/>[content.py]"]
  node_translation["Title translation"]
end

subgraph group_serve["News delivery"]
  node_app["FastAPI app<br/>[main.py]"]
  node_news_api["News API routes<br/>[news.py]"]
  node_news_service["News query service<br/>[news_service.py]"]
  node_ranking["News ranking<br/>[ranking_service.py]"]
  node_news_contracts["News API contracts<br/>[news.py]"]
end

subgraph group_state["Persistence and cache"]
  node_repository["News repository<br/>[news_repository.py]"]
  node_database[("SQL database")]
  node_redis[("Redis cache")]
end

node_user(("News reader"))
node_rss_network(("Publisher feeds"))
node_llm(("LLM provider"))

node_user -->|"requests news"| node_app
node_app -->|"mounts routes"| node_news_api
node_news_api -->|"queries news"| node_news_service
node_news_service -->|"reads articles"| node_repository
node_news_service -->|"ranks results"| node_ranking
node_news_service -->|"caches lists"| node_redis
node_news_api -->|"validates responses"| node_news_contracts
node_rss -->|"uses taxonomy"| node_feed_sources
node_rss -->|"extracts content"| node_extractor
node_rss_network -.->|"provides feeds"| node_rss
node_collector_worker -.->|"collects articles"| node_rss
node_collector_worker -->|"processes articles"| node_ai_processor
node_collector_worker -->|"claims and saves"| node_repository
node_collector_worker -->|"uses contracts"| node_article_contracts
node_ai_processor -->|"returns content"| node_content_contracts
node_ai_processor -.->|"generates content"| node_llm
node_app -->|"runs collection"| node_collector_worker
node_app -->|"initializes storage"| node_repository
node_repository -->|"persists records"| node_database
node_news_service -->|"translates titles"| node_translation

click node_app "https://github.com/dokaeby/dait/blob/main/src/backend/app/api/main.py"
click node_news_api "https://github.com/dokaeby/dait/blob/main/src/backend/app/api/v1/news.py"
click node_news_service "https://github.com/dokaeby/dait/blob/main/src/backend/app/services/news_service.py"
click node_ranking "https://github.com/dokaeby/dait/blob/main/src/backend/app/services/ranking_service.py"
click node_news_contracts "https://github.com/dokaeby/dait/blob/main/src/backend/app/schemas/news.py"
click node_feed_sources "https://github.com/dokaeby/dait/blob/main/src/backend/app/core/taxonomy.py"
click node_rss "https://github.com/dokaeby/dait/blob/main/src/backend/app/collectors/rss_collector.py"
click node_extractor "https://github.com/dokaeby/dait/blob/main/src/backend/app/collectors/content_extractor.py"
click node_collector_worker "https://github.com/dokaeby/dait/blob/main/src/backend/app/workers/collector_worker.py"
click node_article_contracts "https://github.com/dokaeby/dait/blob/main/src/backend/app/schemas/collector.py"
click node_ai_processor "https://github.com/dokaeby/dait/blob/main/src/backend/app/workers/ai_processor.py"
click node_content_contracts "https://github.com/dokaeby/dait/blob/main/src/backend/app/schemas/content.py"
click node_translation "https://github.com/dokaeby/dait/blob/main/src/backend/app/core/title_translation.py"
click node_repository "https://github.com/dokaeby/dait/blob/main/src/backend/app/repositories/news_repository.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_feed_sources,node_rss,node_extractor,node_collector_worker,node_article_contracts toneBlue
class node_ai_processor,node_content_contracts,node_translation toneAmber
class node_app,node_news_api,node_news_service,node_ranking,node_news_contracts toneMint
class node_repository,node_database,node_redis toneRose
class node_user,node_rss_network,node_llm toneIndigo
```

## Components

### Collection pipeline

- [Official RSS sources](https://github.com/dokaeby/dait/blob/main/src/backend/app/core/taxonomy.py): `src/backend/app/core/taxonomy.py`
- [RSS collector](https://github.com/dokaeby/dait/blob/main/src/backend/app/collectors/rss_collector.py): `src/backend/app/collectors/rss_collector.py`
- [Article extractor](https://github.com/dokaeby/dait/blob/main/src/backend/app/collectors/content_extractor.py): `src/backend/app/collectors/content_extractor.py`
- [Collection worker](https://github.com/dokaeby/dait/blob/main/src/backend/app/workers/collector_worker.py): `src/backend/app/workers/collector_worker.py`
- [Article contracts](https://github.com/dokaeby/dait/blob/main/src/backend/app/schemas/collector.py): `src/backend/app/schemas/collector.py`

### AI processing

- [AI content processor](https://github.com/dokaeby/dait/blob/main/src/backend/app/workers/ai_processor.py): `src/backend/app/workers/ai_processor.py`
- [Content contracts](https://github.com/dokaeby/dait/blob/main/src/backend/app/schemas/content.py): `src/backend/app/schemas/content.py`
- [Title translation](https://github.com/dokaeby/dait/blob/main/src/backend/app/core/title_translation.py): `src/backend/app/core/title_translation.py`

### News delivery

- [FastAPI app](https://github.com/dokaeby/dait/blob/main/src/backend/app/api/main.py): `src/backend/app/api/main.py`
- [News API routes](https://github.com/dokaeby/dait/blob/main/src/backend/app/api/v1/news.py): `src/backend/app/api/v1/news.py`
- [News query service](https://github.com/dokaeby/dait/blob/main/src/backend/app/services/news_service.py): `src/backend/app/services/news_service.py`
- [News ranking](https://github.com/dokaeby/dait/blob/main/src/backend/app/services/ranking_service.py): `src/backend/app/services/ranking_service.py`
- [News API contracts](https://github.com/dokaeby/dait/blob/main/src/backend/app/schemas/news.py): `src/backend/app/schemas/news.py`

### Persistence and cache

- [News repository](https://github.com/dokaeby/dait/blob/main/src/backend/app/repositories/news_repository.py): `src/backend/app/repositories/news_repository.py`
- **SQL database**
- **Redis cache**

### Other components

- **News reader**
- **Publisher feeds**
- **LLM provider**

## Connections

- News reader → FastAPI app: requests news (evidence: `src/backend/app/api/main.py`)
- FastAPI app → News API routes: mounts routes (evidence: `src/backend/app/api/main.py`)
- News API routes → News query service: queries news (evidence: `src/backend/app/api/v1/news.py`)
- News query service → News repository: reads articles (evidence: `src/backend/app/services/news_service.py`)
- News query service → News ranking: ranks results (evidence: `src/backend/app/services/news_service.py`)
- News query service → Redis cache: caches lists (evidence: `src/backend/app/services/news_service.py`)
- News API routes → News API contracts: validates responses (evidence: `src/backend/app/api/v1/news.py`)
- RSS collector → Official RSS sources: uses taxonomy (evidence: `src/backend/app/collectors/rss_collector.py`)
- RSS collector → Article extractor: extracts content (evidence: `src/backend/app/collectors/rss_collector.py`)
- Publisher feeds → RSS collector: provides feeds
- Collection worker → RSS collector: collects articles
- Collection worker → AI content processor: processes articles (evidence: `src/backend/app/workers/collector_worker.py`)
- Collection worker → News repository: claims and saves (evidence: `src/backend/app/workers/collector_worker.py`)
- Collection worker → Article contracts: uses contracts (evidence: `src/backend/app/workers/collector_worker.py`)
- AI content processor → Content contracts: returns content (evidence: `src/backend/app/workers/ai_processor.py`)
- AI content processor → LLM provider: generates content
- FastAPI app → Collection worker: runs collection (evidence: `src/backend/app/api/main.py`)
- FastAPI app → News repository: initializes storage (evidence: `src/backend/app/api/main.py`)
- News repository → SQL database: persists records (evidence: `src/backend/app/repositories/news_repository.py`)
- News query service → Title translation: translates titles (evidence: `src/backend/app/services/news_service.py`)
