# clip-rss/clip architecture

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

## Overview

Clip is a cross-platform desktop RSS reader. The main workflow is subscribing to feeds, fetching and parsing RSS/Atom in the background, storing articles locally, then browsing, searching, and reading them in the desktop UI. Separate capabilities cover OPML import/export and manual WebDAV backups, full-text extraction, media proxying, notifications, and settings. The graph uses README feature descriptions and sampled entry-point/source evidence; several internal service-to-service links are omitted where implementation excerpts were unavailable.

Main entry points: [`api/api.go`](https://github.com/clip-rss/clip/blob/main/api/api.go) (Bound API), [`internal/fetcher/fetcher.go`](https://github.com/clip-rss/clip/blob/main/internal/fetcher/fetcher.go) (Feed fetcher), [`internal/store/store.go`](https://github.com/clip-rss/clip/blob/main/internal/store/store.go) (SQLite store), [`internal/scheduler/scheduler.go`](https://github.com/clip-rss/clip/blob/main/internal/scheduler/scheduler.go) (Refresh scheduler)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Desktop interface"]
  node_ui["Reader interface<br/>[App.tsx]"]
  node_viewstate["Reading state<br/>[ArticleStore.ts]"]
end

subgraph group_backend["Application services"]
  node_api["Bound API<br/>[api.go]"]
  node_scheduler["Refresh scheduler<br/>[scheduler.go]"]
  node_reader["Full-text reader<br/>[reader.go]"]
  node_opml["OPML exchange<br/>[opml.go]"]
  node_backup["OPML backup manager<br/>[manager.go]"]
  node_webdavservice["WebDAV services<br/>[webdav_vault.go]"]
  node_settings["Settings service<br/>[settings.go]"]
end

subgraph group_feeds["Feed ingestion"]
  node_fetcher["Feed fetcher<br/>[fetcher.go]"]
  node_parser["RSS Atom parser<br/>[parser.go]"]
end

subgraph group_data["Local data"]
  node_store[("SQLite store<br/>[store.go]")]
  node_items["Article operations<br/>[items.go]"]
  node_feedsdb["Feed operations<br/>[feeds.go]"]
  node_search["Article search<br/>[items.go]"]
end

subgraph group_integrations["External integrations"]
  node_webdav["WebDAV client<br/>[client.go]"]
  node_mediaproxy["Media proxy<br/>[mediaproxy.go]"]
  node_notify["Desktop notifications<br/>[notify.go]"]
end

node_user(("Reader"))
node_externalfeeds(("Feed websites"))
node_remote(("WebDAV server"))

node_user -->|"uses"| node_ui
node_ui -->|"updates"| node_viewstate
node_ui -->|"invokes"| node_api
node_api -->|"queries and changes"| node_items
node_api -->|"manages subscriptions"| node_feedsdb
node_api -->|"reads and saves"| node_settings
node_scheduler -->|"requests refresh"| node_fetcher
node_fetcher -->|"fetches feeds"| node_externalfeeds
node_fetcher -->|"parses responses"| node_parser
node_parser -->|"provides feed data"| node_feedsdb
node_scheduler -->|"refreshes articles"| node_store
node_items -->|"reads and writes"| node_store
node_feedsdb -->|"reads and writes"| node_store
node_search -->|"searches articles"| node_store
node_api -->|"searches"| node_search
node_api -->|"extracts full text"| node_reader
node_reader -->|"fetches source"| node_fetcher
node_api -->|"imports and exports"| node_opml
node_api -->|"manages backups"| node_backup
node_backup -->|"transfers snapshots"| node_webdav
node_webdavservice -->|"syncs configuration"| node_webdav
node_webdav -->|"reads and writes"| node_remote
node_api -->|"serves media"| node_mediaproxy
node_mediaproxy -->|"requests media"| node_externalfeeds
node_scheduler -->|"dispatches alerts"| node_notify

click node_ui "https://github.com/clip-rss/clip/blob/main/frontend/src/App.tsx"
click node_viewstate "https://github.com/clip-rss/clip/blob/main/frontend/src/Stores/ArticleStore.ts"
click node_api "https://github.com/clip-rss/clip/blob/main/api/api.go"
click node_scheduler "https://github.com/clip-rss/clip/blob/main/internal/scheduler/scheduler.go"
click node_fetcher "https://github.com/clip-rss/clip/blob/main/internal/fetcher/fetcher.go"
click node_parser "https://github.com/clip-rss/clip/blob/main/internal/fetcher/parser.go"
click node_store "https://github.com/clip-rss/clip/blob/main/internal/store/store.go"
click node_items "https://github.com/clip-rss/clip/blob/main/internal/store/items.go"
click node_feedsdb "https://github.com/clip-rss/clip/blob/main/internal/store/feeds.go"
click node_search "https://github.com/clip-rss/clip/blob/main/internal/store/items.go"
click node_reader "https://github.com/clip-rss/clip/blob/main/internal/reader/reader.go"
click node_opml "https://github.com/clip-rss/clip/blob/main/internal/opml/opml.go"
click node_backup "https://github.com/clip-rss/clip/blob/main/internal/opmlbackup/manager.go"
click node_webdav "https://github.com/clip-rss/clip/blob/main/internal/webdav/client.go"
click node_webdavservice "https://github.com/clip-rss/clip/blob/main/api/webdav_vault.go"
click node_mediaproxy "https://github.com/clip-rss/clip/blob/main/internal/mediaproxy/mediaproxy.go"
click node_notify "https://github.com/clip-rss/clip/blob/main/internal/notify/notify.go"
click node_settings "https://github.com/clip-rss/clip/blob/main/api/settings.go"

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_ui,node_viewstate toneBlue
class node_api,node_scheduler,node_reader,node_opml,node_backup,node_webdavservice,node_settings toneAmber
class node_fetcher,node_parser,node_remote toneMint
class node_store,node_items,node_feedsdb,node_search toneRose
class node_webdav,node_mediaproxy,node_notify,node_user,node_externalfeeds toneIndigo
```

## Components

### Desktop interface

- [Reader interface](https://github.com/clip-rss/clip/blob/main/frontend/src/App.tsx): `frontend/src/App.tsx`
- [Reading state](https://github.com/clip-rss/clip/blob/main/frontend/src/Stores/ArticleStore.ts): `frontend/src/Stores/ArticleStore.ts`

### Application services

- [Bound API](https://github.com/clip-rss/clip/blob/main/api/api.go): `api/api.go`
- [Refresh scheduler](https://github.com/clip-rss/clip/blob/main/internal/scheduler/scheduler.go): `internal/scheduler/scheduler.go`
- [Full-text reader](https://github.com/clip-rss/clip/blob/main/internal/reader/reader.go): `internal/reader/reader.go`
- [OPML exchange](https://github.com/clip-rss/clip/blob/main/internal/opml/opml.go): `internal/opml/opml.go`
- [OPML backup manager](https://github.com/clip-rss/clip/blob/main/internal/opmlbackup/manager.go): `internal/opmlbackup/manager.go`
- [WebDAV services](https://github.com/clip-rss/clip/blob/main/api/webdav_vault.go): `api/webdav_vault.go`
- [Settings service](https://github.com/clip-rss/clip/blob/main/api/settings.go): `api/settings.go`

### Feed ingestion

- [Feed fetcher](https://github.com/clip-rss/clip/blob/main/internal/fetcher/fetcher.go): `internal/fetcher/fetcher.go`
- [RSS Atom parser](https://github.com/clip-rss/clip/blob/main/internal/fetcher/parser.go): `internal/fetcher/parser.go`

### Local data

- [SQLite store](https://github.com/clip-rss/clip/blob/main/internal/store/store.go): `internal/store/store.go`
- [Article operations](https://github.com/clip-rss/clip/blob/main/internal/store/items.go): `internal/store/items.go`
- [Feed operations](https://github.com/clip-rss/clip/blob/main/internal/store/feeds.go): `internal/store/feeds.go`
- [Article search](https://github.com/clip-rss/clip/blob/main/internal/store/items.go): `internal/store/items.go`

### External integrations

- [WebDAV client](https://github.com/clip-rss/clip/blob/main/internal/webdav/client.go): `internal/webdav/client.go`
- [Media proxy](https://github.com/clip-rss/clip/blob/main/internal/mediaproxy/mediaproxy.go): `internal/mediaproxy/mediaproxy.go`
- [Desktop notifications](https://github.com/clip-rss/clip/blob/main/internal/notify/notify.go): `internal/notify/notify.go`

### Other components

- **Reader**
- **Feed websites**
- **WebDAV server**

## Connections

- Reader → Reader interface: uses
- Reader interface → Reading state: updates
- Reader interface → Bound API: invokes
- Bound API → Article operations: queries and changes
- Bound API → Feed operations: manages subscriptions
- Bound API → Settings service: reads and saves
- Refresh scheduler → Feed fetcher: requests refresh
- Feed fetcher → Feed websites: fetches feeds
- Feed fetcher → RSS Atom parser: parses responses
- RSS Atom parser → Feed operations: provides feed data
- Refresh scheduler → SQLite store: refreshes articles
- Article operations → SQLite store: reads and writes
- Feed operations → SQLite store: reads and writes
- Article search → SQLite store: searches articles
- Bound API → Article search: searches
- Bound API → Full-text reader: extracts full text
- Full-text reader → Feed fetcher: fetches source
- Bound API → OPML exchange: imports and exports
- Bound API → OPML backup manager: manages backups
- OPML backup manager → WebDAV client: transfers snapshots
- WebDAV services → WebDAV client: syncs configuration
- WebDAV client → WebDAV server: reads and writes
- Bound API → Media proxy: serves media
- Media proxy → Feed websites: requests media
- Refresh scheduler → Desktop notifications: dispatches alerts
