按信源抓取网页 / RSS / 邮件等,解析、补全文、打标签与翻译后入库,再按需生成 RSS / Atom / JSON Feed 与 JSON API。
RSSAny 是一套自托管的订阅管线:列表 URL → 抓取与解析(规则 / LLM)→ 正文提取(自定义 / Readability / LLM)→ upsert 去重 → 固定 pipeline(打标签、翻译等)→ 对外提供 **/rss** 等输出。
- 统一订阅:在
.rssany/sources.json中配置网站列表、标准 RSS、IMAP 邮件等,由调度器按refresh策略拉取。 - 可插拔信源:Site / Source 插件(
.rssany.js/.rssany.ts),见 插件配置说明。 - 正文与解析:在信源
fetchItems(及需要的ctx.extractItem等)内完成;入库后跑 pipeline。 - 固定 pipeline:
app/pipeline/中打标签、翻译等,由.rssany/config.json的pipeline.steps开关(不是用户目录下的 pipeline 插件)。 - LLM 辅助:解析、提取、标签、翻译等可按配置走 OpenAI 兼容接口。
- 站点登录:需登录的站点通过 Puppeteer 管理 Cookie(与产品用户账号无关)。
- 可选远端投递:若
config.json中**deliver.url** 非空,在写库与 pipeline 完成后将条目以**{ sourceRef, items }**JSON POST 到该 URL(由app/deliver/post.ts发送);留空则仅本地消费。 - Web 界面:SvelteKit 构建产物由后端托管;Feeds 等需 邮箱校验;
**/admin** 需**users.role === 'admin'**(可从**/me**进入)。
| 层级 | 说明 |
|---|---|
| 运行时 | Node.js 20–23(见 package.json engines) |
| 后端 | Hono、tsx 开发入口 |
| 数据 | SQLite(Node.js 内置 node:sqlite,Node.js 20+),全局安装默认 {npm prefix}/var/rssany/data/rssany.db |
日常使用只需 Node.js 20.x–23.x(与 package.json 的 engines 一致):
npm install -g rssany # 与 npm i -g rssany 相同
rssany startmacOS / Linux(系统自带 Node) 若 npm install -g 报 EACCES,先一次性配置 npm 使用用户目录(仍是 npm 命令,无需 sudo):
npm config set prefix "$HOME/.local"
export PATH="$HOME/.local/bin:$PATH" # 可写入 ~/.zshrc 或 ~/.bashrc
npm install -g rssany使用 nvm / fnm 安装的 Node 通常可直接 npm install -g rssany,无需上述配置。
安装包内已包含构建好的后端与 Web 界面;用 rssany start 后台启动并直接返回访问地址(默认 http://127.0.0.1:18473/,端口可在运行命令时当前目录下的 .env 里设置 PORT);用 rssany stop 关闭后台服务并输出执行状态。
- 数据目录:全局安装时落在 npm prefix 下的
var/rssany/(例如~/.local/var/rssany/或 nvm 的.../node/v22.x/var/rssany/),与lib/node_modules/rssany同级,升级 npm 包不会覆盖配置与数据库。源码开发时使用仓库内.rssany/。仍可用RSSANY_USER_DIR覆盖。 - 从
~/.rssany迁移:若新目录尚不存在且旧目录有数据,首次启动会自动迁移。 - 可选配置:在启动
rssany start时的当前目录放置.env(可参考仓库里的.env.example),用于 JWT、OAuth、SMTP、LLM(如OPENAI_API_KEY/OPENAI_BASE_URL/OPENAI_MODEL)等。 - 重置全部本地数据(结束占用
PORT的进程并删除用户目录,慎用):执行rssany reset;在含.env的目录下运行可读取PORT/RSSANY_USER_DIR,或事先在环境里导出这些变量。
CLI 名为 rssany;裸 rssany 只显示用法,不再直接进入服务运行状态。
需要 npm:
npm install
npm run webui:install
cp .env.example .env # 按需修改开发(单一后端地址;前端静态构建自动 watch):
npm run dev该命令会先启动 webui 静态构建 watch,等首轮 HTML 构建完成后再启动后端服务;浏览器只访问后端地址(默认 http://127.0.0.1:3999/),不再单独启动前端开发服务器。
或分步:一个终端运行 npm run webui:watch,另一个终端运行 npm run dev:backend。
生产(本仓库):npm run webui:build && npm start。
重置本地数据(与全局安装的 rssany reset 逻辑相同):npm run reset。
发布到 npm 时 prepublishOnly 会执行 build:all(后端 vite build + webui:build)。
sources.json / 信源插件
→ 调度器触发 fetchItems
→ upsertItems
→ pipeline(每条一次)
→ [可选] deliver.url POST(出站,非入站 API)
消费侧:RSS/XML、**/api/***、Web UI。
- 按条件从库中生成:支持
search、tags、lng、limit等查询参数;可用subscribed=1限定为sources.json中出现的 ref。 - 按 URL 即时抓取:
GET /rss/https://example.com/...(具体行为以路由实现为准)。
信源插件(Site / Source):目录约定、listUrlPattern / pattern、fetchItems、与 sources.json 的关系等,见 docs/plugins.md。
**app/pipeline/**,通过 **.rssany/config.json** 配置步骤,例如:
{
"pipeline": {
"steps": [
{ "id": "tagger", "enabled": true },
{ "id": "translator", "enabled": false }
]
},
"deliver": {
"url": ""
}
}deliver.url 非空时会对处理完成的条目向该 URL 发起出站 POST;留空则不投递。
{
"sources": [
{ "ref": "https://example.com/feed.xml", "label": "Example", "refresh": "1h" }
]
}合法 refresh 取值包括:10min、30min、1h、6h、12h、1day(默认)、3day、7day。
├── app/ # 后端:路由、feeder、scraper、pipeline、db、auth…
│ └── plugins/builtin/ # 内置信源 *.rssany.js
├── docs/ # 用户文档(如 plugins.md)
└── webui/ # SvelteKit 前端
~/.rssany/ # 运行时用户数据(首次启动创建;或 RSSANY_USER_DIR)
├── sources.json
├── config.json
├── tags.json
├── data/rssany.db # SQLite 主库
├── cache/
└── plugins/ # 用户插件覆盖内置
更细的模块说明见 AGENTS.md(与代码迭代同步,若有出入以代码为准)。
MIT
