# joeseesun/qiaomu-ai-rss architecture

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

- Interactive diagram: https://gitdiagram.com/joeseesun/qiaomu-ai-rss
- Repository: https://github.com/joeseesun/qiaomu-ai-rss

## Overview

Qiaomu AI RSS is an Obsidian reading plugin for curated Qiaomu channels, personal feeds, discovery catalogs, and Markdown files in the vault. The main workflow is selecting a channel, loading and searching articles, reading an available original/translation/rewrite, then optionally saving or annotating the article in the vault or Daily Note. The README documents these capabilities; the sampled source confirms selected runtime wiring and image-drop behavior, but does not expose every view-to-service call, so uncertain links are omitted.

Main entry points: [`src/view.ts`](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/view.ts) (Reader view), [`src/main.ts`](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/main.ts) (Plugin entry), [`src/subscriptions.ts`](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/subscriptions.ts) (Personal subscriptions), [`src/discovery-view.ts`](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/discovery-view.ts) (Discovery catalog)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_reader["Reading"]
  node_reader["Reader view<br/>[view.ts]"]
  node_channel["Channel selection<br/>[channel-picker.ts]"]
  node_article["Article content<br/>[content.ts]"]
  node_images["Image cache<br/>[images.ts]"]
  node_fonts["Reading typography<br/>[fonts.ts]"]
end

subgraph group_sources["Sources and discovery"]
  node_api["Qiaomu API<br/>[api.ts]"]
  node_discovery["Discovery catalog<br/>[discovery-view.ts]"]
  node_catalog["Discovery data"]
  node_catalogs["Source catalogs<br/>[source-catalog.ts]"]
  node_subscriptions["Personal subscriptions<br/>[subscriptions.ts]"]
  node_subscription_ui["Subscription management<br/>[subscription-ui.ts]"]
  node_feeds["Feed parsing<br/>[feeds.ts]"]
  node_library["Vault Markdown library"]
  node_vault_source["Vault source access<br/>[vault-source.ts]"]
end

subgraph group_vault["Vault workflows"]
  node_daily["Daily Note capture<br/>[daily-note.ts]"]
  node_excerpt["Excerpt capture<br/>[excerpt.ts]"]
  node_image_drag["Image drag and drop<br/>[image-drag.ts]"]
  node_markdown_export["Markdown export<br/>[vault-export.ts]"]
  node_desktop_export["PDF export<br/>[desktop-export.ts]"]
end

subgraph group_runtime["Plugin runtime"]
  node_plugin["Plugin entry<br/>[main.ts]"]
  node_state[("Plugin state<br/>[model.ts]")]
  node_agent_bridge["Agent context bridge<br/>[agent-bridge.ts]"]
  node_agent_context["Context protocol<br/>[qiaomu-context.ts]"]
end

node_user(("Obsidian user"))
node_obsidian(("Obsidian"))
node_qiaomu[("Qiaomu Reader service")]

node_user -->|"uses"| node_obsidian
node_obsidian -->|"loads plugin"| node_plugin
node_plugin -->|"opens reader"| node_reader
node_user -->|"selects channel"| node_channel
node_channel -->|"changes channel"| node_reader
node_reader -->|"requests articles"| node_api
node_api -->|"fetches content"| node_qiaomu
node_reader -->|"renders article"| node_article
node_article -->|"loads images"| node_images
node_user -->|"explores sources"| node_discovery
node_discovery -->|"searches catalog"| node_catalog
node_catalog -->|"uses catalog data"| node_catalogs
node_discovery -->|"adds feed"| node_subscriptions
node_subscription_ui -->|"manages feeds"| node_subscriptions
node_subscriptions -->|"parses feeds"| node_feeds
node_reader -->|"loads personal feeds"| node_subscriptions
node_reader -->|"reads local Markdown"| node_library
node_library -->|"resolves vault files"| node_vault_source
node_plugin -->|"persists settings"| node_state
node_reader -->|"adds article links"| node_daily
node_reader -->|"captures selection"| node_excerpt
node_image_drag -->|"loads image bytes"| node_images
node_image_drag -->|"writes attachment"| node_obsidian
node_reader -->|"exports Markdown"| node_markdown_export
node_reader -->|"exports PDF"| node_desktop_export
node_plugin -->|"registers context"| node_agent_bridge
node_agent_bridge -->|"provides snapshots"| node_agent_context
node_fonts -->|"styles reading"| node_reader

click node_plugin "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/main.ts"
click node_reader "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/view.ts"
click node_channel "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/channel-picker.ts"
click node_article "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/content.ts"
click node_images "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/images.ts"
click node_fonts "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/fonts.ts"
click node_api "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/api.ts"
click node_discovery "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/discovery-view.ts"
click node_catalog "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/discovery-library.ts"
click node_catalogs "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/source-catalog.ts"
click node_subscriptions "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/subscriptions.ts"
click node_subscription_ui "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/subscription-ui.ts"
click node_feeds "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/feeds.ts"
click node_library "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/personal-library.ts"
click node_vault_source "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/vault-source.ts"
click node_state "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/model.ts"
click node_daily "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/daily-note.ts"
click node_excerpt "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/excerpt.ts"
click node_image_drag "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/image-drag.ts"
click node_markdown_export "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/vault-export.ts"
click node_desktop_export "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/desktop-export.ts"
click node_agent_bridge "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/agent-bridge.ts"
click node_agent_context "https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/qiaomu-context.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_reader,node_channel,node_article,node_images,node_fonts,node_user toneBlue
class node_api,node_discovery,node_catalog,node_catalogs,node_subscriptions,node_subscription_ui,node_feeds,node_library,node_vault_source,node_qiaomu toneAmber
class node_daily,node_excerpt,node_image_drag,node_markdown_export,node_desktop_export toneMint
class node_plugin,node_state,node_agent_bridge,node_agent_context toneRose
class node_obsidian toneIndigo
```

## Components

### Reading

- [Reader view](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/view.ts): `src/view.ts`
- [Channel selection](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/channel-picker.ts): `src/channel-picker.ts`
- [Article content](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/content.ts): `src/content.ts`
- [Image cache](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/images.ts): `src/images.ts`
- [Reading typography](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/fonts.ts): `src/fonts.ts`

### Sources and discovery

- [Qiaomu API](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/api.ts): `src/api.ts`
- [Discovery catalog](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/discovery-view.ts): `src/discovery-view.ts`
- [Discovery data](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/discovery-library.ts): `src/discovery-library.ts`
- [Source catalogs](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/source-catalog.ts): `src/source-catalog.ts`
- [Personal subscriptions](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/subscriptions.ts): `src/subscriptions.ts`
- [Subscription management](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/subscription-ui.ts): `src/subscription-ui.ts`
- [Feed parsing](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/feeds.ts): `src/feeds.ts`
- [Vault Markdown library](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/personal-library.ts): `src/personal-library.ts`
- [Vault source access](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/vault-source.ts): `src/vault-source.ts`

### Vault workflows

- [Daily Note capture](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/daily-note.ts): `src/daily-note.ts`
- [Excerpt capture](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/excerpt.ts): `src/excerpt.ts`
- [Image drag and drop](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/image-drag.ts): `src/image-drag.ts`
- [Markdown export](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/vault-export.ts): `src/vault-export.ts`
- [PDF export](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/desktop-export.ts): `src/desktop-export.ts`

### Plugin runtime

- [Plugin entry](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/main.ts): `src/main.ts`
- [Plugin state](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/model.ts): `src/model.ts`
- [Agent context bridge](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/agent-bridge.ts): `src/agent-bridge.ts`
- [Context protocol](https://github.com/joeseesun/qiaomu-ai-rss/blob/main/src/qiaomu-context.ts): `src/qiaomu-context.ts`

### Other components

- **Obsidian user**
- **Obsidian**
- **Qiaomu Reader service**

## Connections

- Obsidian user → Obsidian: uses
- Obsidian → Plugin entry: loads plugin
- Plugin entry → Reader view: opens reader
- Obsidian user → Channel selection: selects channel
- Channel selection → Reader view: changes channel
- Reader view → Qiaomu API: requests articles
- Qiaomu API → Qiaomu Reader service: fetches content
- Reader view → Article content: renders article
- Article content → Image cache: loads images
- Obsidian user → Discovery catalog: explores sources
- Discovery catalog → Discovery data: searches catalog
- Discovery data → Source catalogs: uses catalog data
- Discovery catalog → Personal subscriptions: adds feed
- Subscription management → Personal subscriptions: manages feeds
- Personal subscriptions → Feed parsing: parses feeds
- Reader view → Personal subscriptions: loads personal feeds
- Reader view → Vault Markdown library: reads local Markdown
- Vault Markdown library → Vault source access: resolves vault files
- Plugin entry → Plugin state: persists settings
- Reader view → Daily Note capture: adds article links
- Reader view → Excerpt capture: captures selection
- Image drag and drop → Image cache: loads image bytes
- Image drag and drop → Obsidian: writes attachment
- Reader view → Markdown export: exports Markdown
- Reader view → PDF export: exports PDF
- Plugin entry → Agent context bridge: registers context
- Agent context bridge → Context protocol: provides snapshots
- Reading typography → Reader view: styles reading
