Changelog
v0.11.0 — 2026-11-02
抓取日志
- 结果相同的连续检查合并为一条日志:来源、成败、有效条数、翻页信息、错误、规则预警和通知状态都与上一条一致且没有新增内容时,只在该条上记录“连续 N 次结果相同”和最近一次检查时间,不再逐次新增。条数变化、出现新内容、来源变化或成败切换仍单独成条;持续失败且原因相同也会合并。
- 每个订阅最多保留 100 条日志,可在“设置 → 日志与显示”调整为 10–1000 条,超出时清理最早的记录;原有按天数保留仍然生效,已合并的日志按最近一次检查时间计算保留期。
- 升级后数据库自动增加两列,无需手工迁移;升级前已有的重复日志不会回头合并,会随新日志和保留期自然清理。
仪表盘
- “运行趋势”里的“新增采集”和“翻译完成”改为柱状加折线:新增采集用圆角柱,翻译完成用折线叠在上面,没有记录的日子显示为浅灰短柱;水平网格改为虚线,图例下方的汇总数字放大并置于名称下方。悬停仍显示当天两项数值,7 天范围的折线标出每天的点。
- 统计口径、时间范围(7、30、90 天)和“订阅数量”折线图保持不变,亮暗主题与手机宽度下均已检查。
升级提示
- 可从 v0.10.0 直接更新,数据库仍为 schema 23,无需手工迁移;启动时自动为抓取日志增加两列。
- 保留原数据卷及
master.key。已有的重复日志不会回头合并;新的“每个订阅保留日志条数”默认 100,可在“设置 → 日志与显示”调整。 - 服务端与 CLI 同步更新到 0.11.0;版本镜像为
ghcr.io/jaaayden/feedlantern:0.11.0,latest继续跟随通过 CI 的 main。
v0.10.0 — 2026-10-26
性能与资源占用
- 翻译统计增加
(feed_id, status)索引,翻译状态和规则预警批量读取,订阅列表最多执行三次 SQL;已有数据库启动时自动创建索引。 - 大量订阅下复用日期格式器、筛选结果和未变化的列表,延迟屏幕外条目的布局与绘制;相对时间仍定期更新,原有列表、卡片、搜索和批量操作保留。
- 设置栏目共用短期内存缓存并合并并发请求,保存、导入和切换账号或工作台时更新或清除缓存;加载文字显示当前栏目。设置和用户管理页面暂停完整订阅列表轮询。
- 没有编辑会话或抓取任务时,Chromium 空闲 60 秒后自动退出,下一次请求重新启动;翻译缓存连续命中不再反复写入保留时间。
- Docker 改为多阶段构建,仅带无头 Chromium,清理安装缓存,前端依赖只参与构建,排除本地开发目录。保留字体、浏览器沙箱、CLI 和维护命令,依赖版本不变。
- 本机 arm64 对比:gzip 镜像层约 621 MB 降至 346 MB;小型测试页面在 1 CPU、512 MiB 内存且无额外交换空间下完成识别、抓取和 RSS 输出,内存峰值约 367 MiB。具体测量口径和限制见性能文档,复杂网站用量取决于实际页面。
检查阈值与聚合选择
- “设置 → 通知 → 告警策略”新增个人检查阈值,默认连续失败 3 次,可设为 1–1000;成功抓取一次清零,中断不计失败,重启和清理日志保留次数。
- 未达到阈值的失败保留原因和日志,启用中的订阅显示“等待重试”;侧栏、仪表盘、列表和用户管理统一口径。检查阈值与推送通知阈值分开,未开启通知也生效,核心规则异常仍独立提示。
- 更换通知渠道只取消旧的推送任务和去重状态,保留实际失败次数,保存本身不补发通知。
- 新建或编辑聚合时,可按名称或网址搜索后全选匹配结果;取消选择只作用于当前结果,其他已选订阅保留,成员不会重复添加。
升级提示
- 可从 v0.9.0 直接更新,数据库仍为 schema 23,无需手工迁移;旧个人设置默认采用 3 次检查阈值。
- 保留原数据卷及
master.key。不改变订阅内容保留规则、累计采集和翻译计数,不自动转换 PubMed RSS 订阅。 - 服务端与 CLI 同步更新到 0.10.0;版本镜像为
ghcr.io/jaaayden/feedlantern:0.10.0,latest继续跟随通过 CI 的 main。
v0.9.0 — 2026-10-25
仪表盘与导航
- 新增仪表盘,集中显示订阅数、自动更新数、当前保留内容和需要检查的数量;紧凑图表提供 7/30/90 天的采集、翻译与订阅变化趋势。
- 原“订阅管理”改名为“全部订阅”,保留原来的列表、卡片、搜索、筛选、排序和批量操作;统计和聚合分别移至仪表盘与独立的“聚合订阅”页面。
- 侧栏新增“需要检查”,与仪表盘、用户管理统一统计抓取失败和核心规则异常;用户管理显示每个账号的待检查数量,包括零。
- 设置保留左侧栏目、右侧详情的布局;新增页面支持中英文、明暗主题和移动端,图表支持键盘查看。
独立保存累计数量
- 累计采集、累计翻译与消息内容分开保存,超过保留上限清理内容、删除订阅、清理日志或重启均不会扣减累计值;写入失败回滚时计数也会回滚。
- 仍已保存的条目重复抓取不重复累计;重新翻译成功另计一次。日趋势按 UTC 日期保留 90 天,累计值长期保留。
- 备份包含累计值和趋势,恢复不会把导入的内容重复计数。界面显示开始记录的日期,不补造旧版未记录的历史。
升级提示
- 支持从 v0.7.0 直接升级,无需手工执行 SQL。服务启动时自动从 schema 19 依次升级至 23;从 v0.8.x 升级则从 schema 22 升至 23。
- 保留原数据卷及其中的
master.key,账号、订阅地址、内容和译文保持原有身份。升级前保存完整数据卷与部署配置;回退时同时使用旧镜像和升级前的数据。 - 累计统计从此次升级启用时开始记录。旧版已清理的内容无法补算;恢复不含统计的旧备份后,从恢复时重新开始记录。
- 不自动转换已有 PubMed RSS 订阅;遇到 NCBI 验证页时,可在界面核对查询条件后确认转换为 PubMed 检索订阅。
- 服务端与 CLI 同步更新到 0.9.0,镜像可固定为
ghcr.io/jaaayden/feedlantern:0.9.0。
依赖维护
- 更新 TypeScript、Vite、tsx、concurrently 和 sanitize-html,完成构建、302 项后端测试、54 项浏览器测试及 amd64/arm64 容器验证。
规则预警分级与日志提示
- 修复条目数、标题和链接正常,仅日期、图片或摘要缺失时仍统一显示“规则可能失效”并推送通知的问题。现在显示“部分字段缺失”轻提示,订阅继续输出,不计入“需要检查”,可单独筛选;条目数骤降、标题或链接异常仍保留规则告警。
- 已有可选字段告警在升级后自动降级,尚未发送的通知取消;轻提示升级为真正异常时仍能按原有通知策略告警。恢复正常后清除提示。
- “重新识别缺失字段”默认只勾选已重新找到的受影响自动字段;没有找到时不会默认删除旧规则,正常规则和手动字段保留,预览并确认后才保存。
- 抓取日志中的成功状态和规则提示相邻显示,适配明暗主题与手机宽度。旧日志没有分级信息时显示“规则检查记录”,不猜测历史严重程度。
- API 的
ruleHealth新增severity(warning/notice);新日志返回warningSeverity,旧日志可能没有该字段。
v0.8.1 — 2026-10-25
PubMed 限流修复
- 修复服务繁忙或事件循环停顿后,多个预先分配的时隙一起到期、请求集中发出的情况。现在按实际放行时间依次排队,继续保持匿名请求 350 毫秒、带 API Key 请求 110 毫秒的间隔。
- NCBI 返回 429 后的暂停同时作用于已在等待的请求;取消请求会及时退出,后续请求仍可继续。排队时间估算保留,用单调时钟计算间隔。
- 增加事件循环停顿、暂停期间排队和取消的确定性回归测试。沿用 v0.8.0 的数据库 schema 22,升级方式相同。
文档网站
- 新增 GitHub Pages 静态网站,提供中英文介绍页、文档导航、站内搜索、深色模式和手机布局。中文文档完整呈现;现有英文使用指南、部署和配置参考同步提供,其他文档明确标注为中文。
- 网站从仓库中的 Markdown 构建,合并到 main 后自动检查链接并部署。
v0.8.0 — 2026-10-25
这一版新增原生 PubMed 检索订阅、Agent CLI / MCP 和中英文界面。
PubMed 检索订阅
- 在“新建订阅 → PubMed 检索”中按关键词、标题/摘要、作者、期刊、机构、MeSH 等字段组合条件,支持 AND / OR / NOT、发表日期和文章类型筛选,也可手写查询式。默认不加引号,每行可选“精确短语”;无法还原为条件的合法查询式按原文保留。
- 预览显示匹配总数、最新 5 篇、NCBI 实际执行的查询式和提示,可直接在 PubMed 中对照。输入防抖、结果缓存和全局限流共同减少重复请求。
- 通过 NCBI E-utilities 按最新收录顺序抓取 10 / 20 / 50 / 100 篇,支持原文、译文、双语输出,以及现有的过滤、保留条数、聚合、通知和网络配置。修改查询式保留已有文章。
- 订阅名默认为“查询式原文 +
- PubMed”,随查询式更新;手动命名后保留自定义名称。超过 200 字符时省略名称中间部分,完整查询式不变。RSS、Atom 和 JSON Feed 使用同一频道标题。 - PubMed RSS 按原地址抓取,移除期刊 RSS 在后台自动改走 E-utilities 的处理。期刊 RSS 和检索式 RSS 都可在验证候选查询式后显式转换;无法确认一致的进入构建器核对。
- 批量验证在后台运行,最多同时验证 5 个订阅,并共用 NCBI 限流队列。任务和结果持久化,关闭页面后继续、服务重启后恢复,支持缓存、取消、重试及边验证边转换。
- 转换保留订阅 ID、对外订阅地址、已有条目和译文,以及翻译、过滤、输出、保留、聚合、刷新和网络设置。默认保留旧名称,单个或批量转换时可勾选按查询式重命名,并预览新名称。
- “设置 → PubMed(NCBI)”支持保存前测试 API Key 和邮箱,显示响应状态及速率上限;密钥加密保存、不回显。所有 NCBI 请求共用限流器,无 Key 时每秒最多 3 个,有 Key 时最多 10 个,429 后暂停并重试。
- 新增 PubMed 预览、转换、后台验证任务和密钥测试 API;CLI / MCP 同步支持预览、创建、验证、转换和可选重命名。
Agent CLI 与 MCP
- 新增
feedlantern命令行(packages/cli):通过个人访问令牌管理订阅、识别网页、预览规则、刷新、查看条目和日志、管理聚合及批量任务。支持 JSON / 表格输出、多个配置档案和稳定的错误代码、退出码。 - 写操作支持
--dry-run;删除操作需--yes。配置文件权限为 0600,读取和写入能力受令牌权限约束。 feedlantern mcp通过 stdio 提供同一批工具,支持只读模式;删除和 PubMed 转换要求显式确认。- 新增令牌自身信息与调用记录接口。CLI 版本号与服务端同步;目前从仓库打包安装,未发布到 npm 注册表,见 安装与使用。
English 与简体中文
- 界面、日期和数字格式、错误提示及个人通知支持中英文,语言按账号保存。登录页和初始化页也可切换语言。
- 旧账号升级后保留简体中文;新账号默认跟随浏览器。不支持的语言使用
DEFAULT_LOCALE(默认en,可设zh-CN)。 - API 保留稳定错误代码,并返回本地化说明;订阅输出内容仍按原文或目标翻译语言显示。
- 新增英文 README、使用指南、部署和配置参考;修复登录页密码错误被误报为登录失效的问题。
报错改进
- RSS 来源返回网页、验证页或异常 2xx 响应时,预览、日志和通知说明实际原因,不再误报 XML 实体声明问题。合法 RSS 即使被标为 HTML 仍可解析,外部实体和 DTD 仍被拒绝。
升级提示
- 从 v0.7.0 升级时,数据库自动从 schema 19 迁移到 22,加入账号语言和 PubMed 验证任务等存储。升级前导出完整备份;回退旧版本时同时恢复升级前的数据。
- 已有订阅、对外订阅地址和已保存内容保留。曾由期刊 RSS 自动走 E-utilities 的订阅会恢复普通 RSS 抓取;若遇 NCBI 验证页,可在界面核对并转换为 PubMed 检索订阅。
- CLI 与服务端同时更新到 0.8.0;Docker 镜像可固定为
ghcr.io/jaaayden/feedlantern:0.8.0,latest继续跟随通过 CI 的 main。
v0.7.0
这一版新增了 10 组功能,涉及订阅输出、通知、开放接口、翻译、聚合、预警、翻页、网络和界面。
条目过滤、Atom / JSON Feed 与输出条数
- 条目过滤:在“订阅设置 → 输出内容”为每个订阅(网页订阅和 RSS 翻译订阅)填写“包含关键词”和“排除关键词”(每行一个,不区分大小写,排除优先),可选按正则表达式匹配。过滤只影响输出,不删除已存储的条目,保存后立即生效;填写时实时显示“输出 / 过滤”条数,“订阅内容”中被过滤的条目淡化并标注原因。正则每条不超过 200 个字符,拒绝嵌套重复(如
(a+)+)和反向引用,运行超过 100 毫秒会被中断。 - 更多输出格式:同一订阅除 RSS 2.0(
.xml)外,新增 Atom 1.0(.atom)和 JSON Feed 1.1(.json)地址,内容、过滤和条数完全一致。订阅面板可在三种格式之间切换并复制地址(按浏览器记住选择);轮换密钥后三种地址同时失效。浏览器直接打开.xml的预览页不变。 - 输出条数可调:每个订阅可设置 10–500 条(默认仍为 100),批量修改设置也支持。网页订阅保留 max(200, 输出条数) 条历史,RSS 翻译订阅保留 max(100, 输出条数) 条;调小不会立即删除,下次抓取时再清理。
- 接口:新增
GET /feeds/:id/:token.atom、GET /feeds/:id/:token.json、POST /api/feeds/:id/output-preview;PATCH /api/feeds/:id与批量设置支持itemFilter、outputLimit;GET /api/feeds/:id返回全部已存储条目和outputStatus。轻量配置导出导入包含这两项。
多通知渠道
- 故障告警支持多个通知渠道:除 Bark 外新增通用 Webhook(POST JSON,含事件类型、订阅名称、错误、时间和订阅面板链接,可选自定义请求头和 HMAC-SHA256 签名头
X-FeedLantern-Signature-256)、ntfy(服务器地址 + 主题,可选访问令牌)和 Telegram Bot(Bot Token + Chat ID)。每个用户可同时启用多个渠道,抓取失败和 RSS 翻译失败告警会发到所有已启用的渠道。 - “设置 → 通知”改为渠道列表:每个渠道单独启用/停用、保存和发送测试通知;失败阈值、超时、重试和冷却作为“告警策略”对所有渠道生效。原有 Bark 设置和告警策略原样保留,无需重新配置。
- 每个渠道分别重试并记录发送结果,抓取日志显示为“通知:Bark 已发送 · Webhook 发送失败(…)”;任一渠道送达即视为已通知,不重复推送。
- Webhook 地址、签名密钥、自定义请求头、ntfy 令牌和 Telegram Bot Token 与 Bark 地址一样加密保存,接口和页面不回显;完整备份和轻量配置导入导出包含新渠道配置。
- 所有通知(包括 Bark)的出站请求改为经过网络安全策略:拒绝内网、回环和云元数据地址,固定连接到检查过的 IP,且不跟随重定向。
- 接口:新增
GET/PUT /api/notifications、POST /api/notifications/test;FetchLog.notification新增channels;轻量配置新增可选notificationChannels。原/api/notifications/bark接口继续可用。
访问令牌与 OpenAPI
- 个人访问令牌:在“设置 → 访问令牌”创建,供脚本和 AI Agent 以
Authorization: Bearer fl_…调用 API。可命名、选择只读(read)或读写(write)权限和有效期,查看最近使用时间并随时吊销;完整令牌只在创建时显示一次,数据库只保存哈希。 - 令牌的权限和工作台隔离与所属账号的网页会话一致;只读令牌不能执行任何写操作。备份导出 / 恢复、账号管理中的创建 / 修改 / 重置密码 / 删除,以及令牌自身的管理只能在网页登录后操作。账号停用、删除、修改密码或恢复备份时令牌立即失效;令牌验证失败按来源地址限速。
- 新增公开的 OpenAPI 3.1 文档
GET /api/openapi.json,标明每个接口的登录要求和令牌所需权限;doc/development.md增加用 curl 调用 API 的示例。 - 接口:新增
GET/POST /api/tokens、DELETE /api/tokens/:id;带令牌调用GET /api/auth/status时返回tokenScope。
可替换的翻译服务与多目标语言
- 翻译服务可替换:除 Google 免费通道(仍为默认,行为不变)外,新增 DeepL(免费版与付费版接口)和 OpenAI 兼容接口(可配置接口地址、模型、API Key 与自定义系统提示词,支持 Ollama 等本地模型)。管理员在“设置 → 应用设置 → 翻译服务”中配置并选择默认服务,每个服务可一键测试;每个订阅可单独选择服务,默认跟随全局。
- 每个服务的并发、启动间隔和限流退避分别生效,一个服务被限流不影响其他服务的订阅。OpenAI 兼容接口只发送文字片段并逐段编号,返回的段数或标签对不上、输出被截断时整批失败重试,不会发布半成品。
- 多目标语言:除简体中文外,支持繁体中文、英语、日语、韩语。“仅中文 / 双语”改为“仅译文 / 双语 + 目标语言”,RSS 的
<language>、Atom 的xml:lang和 JSON Feed 的language随目标语言输出。更换目标语言或翻译服务会重新翻译已有文章,条目 ID 不变。 - 翻译缓存按服务和目标语言区分,互不串用;升级前的缓存作为“Google + 简体中文”继续使用。
- API Key 加密保存,接口和页面不回显,轻量配置导出不含 Key;完整加密备份包含 Key。DeepL 与 OpenAI 兼容接口的请求经过网络安全策略,本机或局域网模型需管理员把精确的
host:port加入网络白名单。 - 接口:订阅新增
targetLanguage、translationProvider;translationMode的chinese改名为translated(旧值仍可提交、导入)。新增GET /api/translation/providers与POST /api/settings/translation/test;应用设置translation新增defaultProvider、deepl、openai。
聚合订阅
- 新增聚合订阅:把自己名下的多个订阅(网页订阅和 RSS 翻译订阅都可以)合并成一个订阅地址
/bundles/聚合ID/密钥.xml(同一密钥的.atom、.json为 Atom 1.0 与 JSON Feed 1.1)。内容按发布时间(没有则按首次发现时间)合并,每条注明来源订阅(RSS 用<category>,Atom 用category,JSON Feed 用tags),同一链接只出现一次,默认最多 100 条(可设为 10–500)。成员只贡献它自己订阅地址中的条目(翻译订阅只输出已翻译完成的条目,成员的条目过滤和输出条数同样生效);成员都翻译成同一目标语言时聚合声明该语言,否则不声明;聚合只读取已保存的条目,不触发抓取。成员删除时自动移出,暂停时已有条目仍输出;所有者停用后聚合地址与单个订阅地址一样不可用。在浏览器中直接打开聚合地址时显示可读预览页,并标注每条的来源。 - 订阅页“新建订阅”菜单新增“聚合订阅”;创建后列表上方出现“聚合订阅”区,可复制地址、打开、编辑名称与成员、轮换密钥和删除。批量操作栏新增“加入聚合”,可把所选订阅加入已有聚合或新建一个。
- 列表表头的“导出 OPML”同时导出全部聚合订阅(放在“聚合订阅”文件夹中)。
- 完整备份和轻量配置导入导出包含聚合订阅;没有聚合订阅的旧备份和旧配置文件照常导入。删除用户时一并删除其聚合订阅,删除前的确认中显示数量。
- 接口:新增
/api/bundles(列出、创建、修改、追加成员、轮换密钥、删除,已列入 OpenAPI 文档,访问令牌可调用:读接口需 read,写接口需 write);轻量配置新增可选字段bundles,备份新增bundles、bundle_feeds表(可选,备份格式仍为 version 3)。
规则失效预警
- 规则失效预警:网页订阅每次抓取成功后,与最近正常抓取的中位数比较条目数、标题、链接、日期、图片和摘要。条目数骤降、字段大面积缺失、链接全部相同或大面积重复时,订阅标记为“规则可能失效”:抓取仍记为成功、条目照常保存,列表、状态栏“需要检查”、状态筛选(新增“抓取失败”“规则可能失效”)、订阅面板和抓取日志都会提示。新订阅积累 5 次正常抓取前不判断,阈值见使用指南。
- 订阅面板的预警旁可“重新识别”:在订阅网页上运行自动识别,把当前规则和新识别规则的条目数与前几条内容并排对比,逐个字段勾选替换;手动选择过的字段默认保留。确认前不会修改规则。也可以“忽略此警告”,以当前结果作为新的基线。
- “设置 → 通知 → 告警策略”新增“规则可能失效时通知”(默认开启):预警发到所有已启用的渠道(Bark、Webhook、ntfy、Telegram),每次出现只推送一次,与抓取失败告警分开去重;推送标题为“订阅灯:规则可能失效”,Webhook 事件类型为
rules.warning。 - 接口:新增
POST /api/feeds/:id/health/redetect、/health/preview、/health/ignore,均已列入 OpenAPI 文档(写操作需要 write 令牌);Feed新增可选ruleHealth,抓取日志新增可选warning,告警策略新增ruleHealthAlerts(旧配置和备份缺少时默认true)。
自动翻页与多页采集
- 多页采集:编辑匹配规则时可开启翻页,支持点选“下一页”链接或按钮、URL 页码模板(起始页码和步长)和“加载更多”按钮。默认仍只抓源网址一页;最多 10 页,每页之间默认间隔 3 秒(2–30 秒,带随机抖动)。一页的条目都已见过时提前停止,日常刷新通常只看第 1 页。
- “试抓多页”使用与后台刷新、批量确认相同的翻页逻辑,显示每页抓到几条以及在哪一页、因为什么原因停止。跨页按链接去重,第 1 页的条目在最前。
- 翻页沿用订阅的 Cookie 和同一浏览器会话,每一页都经过网络安全检查,指向内网的“下一页”会被拦截。第 2 页及以后失败时保留已抓到的条目,抓取日志标明“第 k 页失败”;只有第 1 页失败才算整体失败。单次多页抓取最长约 3 分钟。
- 接口:
FeedInput/Feed新增可选pagination(不传则保留原设置,null表示只抓一页);POST /api/browser/:id/preview可带pagination,返回pagination报告;PickRequest.target新增next;抓取日志新增pages、note。完整备份和轻量配置导出包含翻页设置,旧备份可照常导入。 - 规则失效预警只统计第 1 页的条目:一次抓了几页会随增量停止和最多页数变化,不会被当成条目数骤增或骤降;“重新识别”对比的同样是第 1 页。
每个订阅的代理与请求头
- 每个订阅可选“网络配置”:代理(HTTP、HTTPS、SOCKS5,可带用户名密码)、User-Agent、Referer 和最多 20 个额外请求头。在“设置 → 网络配置”中管理,一组配置可被多个订阅复用;新建订阅(“加载与网络设置”)、RSS 翻译、批量添加和订阅设置中都可以选择。编辑器预览、批量识别、重新识别和后台刷新(包括翻页的每一页)使用同一份配置。
- 代理密码和请求头的值加密保存,接口不回显;编辑时留空保持原值,更改代理地址后必须重新填写代理密码,已保存的密码不会被转到别的代理服务器。
- 代理服务器地址同样受内网拦截:不能指向回环、私网或云元数据地址,除非管理员把该
host:port加入允许访问的主机;目标网址仍在本机解析并校验,代理只收到已校验的 IP。额外请求头只发往订阅所在网站及其子域名,不发给第三方资源,重定向到其他网站时不再携带;不能设置 Host、Cookie、Proxy-*、Connection 等请求头。 - 网络配置可“测试连接”;代理不可达、认证失败或代理类型不对时,预览和抓取日志会直接说明原因(不含用户名和密码)。
- 接口:新增
/api/network-profiles(列表、创建、修改、删除、POST /:id/test,已列入 OpenAPI 文档,访问令牌读接口需 read、写接口需 write);FeedInput、PATCH /api/feeds/:id、POST /api/browser、POST /api/rss/preview和批量任务条目新增可选的networkProfileId。 - 完整备份包含网络配置(格式版本不变,旧备份照常恢复);轻量配置只导出不含密钥的网络配置,含密钥的订阅导入后暂停,等待重新绑定。
保留条数、可读的超时提示与恢复备份
- 保留条数可设置:“订阅设置 → 输出内容”新增“保留条数”,即数据库为该订阅最多保存的历史条目数。留空为自动(网页订阅 max(200, 输出条数),RSS 订阅 max(100, 输出条数),与之前相同),也可填 10–1000,但不能少于输出条数。调小后不立即删除,下次抓取时清理。网页上仍能看到的条目总会保留,RSS 订阅已见过的条目清理后也不会重新入库,因此不会被当成新条目重复推送;被清理条目的待翻译任务一起删除。批量修改设置可保持原值、改为自动或指定条数;轻量配置导入导出和完整备份都包含该设置。
- 网页订阅一次抓到的条目超过保留量时(例如翻页采到 300 条、保留 200 条),本次看到的条目现在全部保留,不再在下次抓取时把多出的部分当作新条目重复入库。
- 抓取超时提示改为可读中文:RSS 来源和网页超时不再显示 “The operation was aborted”,而是“连接 rss.example.com 超时(20 秒未响应)”,并提示常见原因:本机代理软件开启了增强模式或 Fake-IP 时 FeedLantern 不读取系统代理,需开启 TUN/增强模式并打开 DNS-over-HTTPS,或为该订阅配置网络代理(已配置代理时提示检查代理)。抓取日志、订阅列表的错误原因和 Bark 等告警使用同一文案,只写主机名,网址查询参数照旧隐藏。手动取消或服务停止导致的中止记为“中断”,不再误报为超时。网页“等待元素”超时也单独说明。
- 完整恢复默认保留本机的服务器与网络设置(公开访问地址、监听地址和端口、安全 Cookie、可信代理、网络访问白名单、DNS over HTTPS、后台并发数、会话有效期)。之前把正式服务器的备份恢复到测试实例后,页面会立即提示“请求来源不被允许”,重启后还会换端口。恢复预览列出本机与备份的差异;确需沿用备份设置时,勾选“同时恢复备份中的服务器与网络设置”(接口
restoreServerSettings,默认不勾选)。 - 配置了网络代理的订阅,加密 DNS(DNS over HTTPS)查询也经同一代理发出。之前关闭代理软件(如 Surge)的增强模式后,本机直连不到
cloudflare-dns.com,代理订阅也会报“加密 DNS 查询失败”。查到的地址仍在本机做内网和保留地址检查,再交给代理连接;网页订阅的每一页、RSS 订阅和“测试连接”都生效。经代理与直连的查询结果分开缓存;失败时提示“经代理 … 的加密 DNS 查询失败”。 - 网络配置的“测试连接”会预填测试网址:优先用该配置第一个订阅的来源地址,其次用这个浏览器里上次测试过的网址,都没有时用连通性检查地址
https://cp.cloudflare.com/generate_204,仍可修改。目标返回任意 2xx(包括 204)都算成功;其他状态码会显示实际状态码并提示原因。 - 接口:
Feed、PATCH /api/feeds/:id和批量设置新增retentionLimit(null为自动);POST /api/backups/preview返回serverChanges;POST /api/backups/restore新增restoreServerSettings。OpenAPI 文档已同步。
调用记录与界面改版
- 访问令牌新增调用记录:在“设置 → 访问令牌”中展开某个令牌,可查看每次调用的时间、方法、接口(路由模板,如
/api/feeds/:id)、状态码、耗时和来源 IP,按“成功 / 被拒绝 / 出错”筛选并分页,失败的请求标红;令牌旁显示最近 24 小时的调用和失败次数。写操作以及 401、403、429 也会记录;不记录令牌本身和查询参数,网页登录后的操作不记录。记录按“日志保留天数”清理,每个令牌最多 2000 条、全站最多 20000 条;吊销令牌时一并删除。记录先进入内存、每秒批量写入,不拖慢请求。 - 管理员在用户工作台的“设置 → 访问令牌”中可只读查看该用户的令牌和调用记录;创建和吊销令牌只能由本人操作。
- 订阅面板重新整理:“订阅内容”只展示条目,翻译状态改为条目上的“翻译中 / 翻译失败”小标记;“抓取日志”标签改名为“运行日志”,翻译订阅在其中用“抓取记录 / 翻译记录”切换查看,翻译进度、未完成文章和翻译日志都移到这里;“重试未完成翻译”移到面板顶部的翻译统计旁。非翻译订阅不再显示任何翻译相关内容。地址栏仍为
#/feed/订阅ID/logs。 - 订阅内容改为阅读器样式:去掉大边框,每条显示来源域名与相对时间、衬线标题、默认折叠为三行的摘要和缩略图,可原位“展开全文”;双语订阅的原文标题和原文段落以较浅的字体跟在译文后。正文仍在隔离框架中显示(不能运行脚本,链接只在新标签页打开),高度随内容自适应,亮色、暗色和手机宽度下都适配。
- 接口:新增
GET /api/tokens/:id/logs(仅限网页会话,已列入 OpenAPI 文档);GET /api/tokens返回usage24h,管理员可带X-FeedLantern-User只读查看其他用户的令牌;POST /api/tokens和DELETE /api/tokens/:id在其他用户的工作台中返回 403。翻译完成的条目新增translatedTitle、sourceTitle。 - 设置页按分组分页:原“应用设置”拆成“日志与显示”“翻译服务”“服务器与网络”三个独立分组(仅管理员可见),与通知、Cookie 凭据、访问令牌、备份与迁移等并列;点击左侧导航只显示该组,不再是一整页长滚动。当前分组写入地址栏(例如
#/settings/translation),刷新和浏览器前进后退都能保持。每组的保存按钮只提交本组实际修改的字段,有未保存修改时显示“未保存”,切换分组、离开设置页或关闭页面前会提示。手机宽度下导航为顶部横向切换。导航名称与页面标题统一(例如“个人通知”改为“通知”,账号页标题为“账号与密码”),补充说明放在副标题里。 - 翻译服务改为服务卡片:Google、DeepL、OpenAI 兼容接口各一张卡片,标出“默认 / 已配置 / 未配置”;默认服务的卡片自动展开,其余点击展开;在卡片上“设为默认”,未配置的服务不能设为默认并说明缺什么。未设为默认的服务仍可在单个订阅中选用;API Key 不回显、留空保留原值的规则不变。
升级提示
- 数据库从 v0.6.3 的
user_version=8自动迁移到user_version=19,首次启动时完成。各步迁移都按表或列是否存在来判断,重复启动也是安全的;已有订阅、RSS 地址、条目 ID、译文缓存和刷新设置都保持不变,已有订阅默认只抓一页、没有过滤规则、保留条数为自动。 - 迁移后旧版程序不能直接读取新数据库。如需回退,请同时恢复升级前的数据卷或完整备份,升级前务必先从“设置 → 备份与迁移”导出一份完整备份。
- 完整备份格式版本不变,旧备份可以直接恢复到新版本;包含新功能数据(聚合订阅、翻页、网络配置、保留条数等)的备份需要 v0.7.0 或更新版本才能完整恢复。访问令牌、调用记录和健康统计不进入备份,恢复后需重新创建令牌。恢复完整备份时默认保留本机的服务器与网络设置。
- 所有通知(包括 Bark)的出站请求现在都经过网络安全策略。如果 Bark、ntfy 或 Webhook 自建在内网,需要管理员把对应的
主机:端口加入“服务器与网络 → 网络白名单”,否则推送会显示“地址被网络安全策略阻止”。 - 翻译输出模式“仅中文”改名为“仅译文”(数据中的
chinese自动迁移为translated),接口仍兼容旧值。 - 部署文件(Compose、沙箱配置、镜像入口)没有变化,按“升级”一节拉取新镜像即可。
v0.6.3
- 超过 8000 像素的长网页不再只显示开头:调整匹配时按每段 8000 像素分段截图,滚动到接近底部自动加载下一段;自动识别的列表在下面时会先加载到那里再滚动过去。最多显示 48000 像素。
- 接口:新增
POST /api/browser/:id/segment {top};ScreenFrame新增documentHeight,height表示已截取的高度。元素地图改为累计,后续分段不改变已有序号。
升级提示:数据库结构与 v0.6.2 相同,无需迁移;部署文件(Compose、沙箱配置)没有变化。建议升级前从“设置 → 备份与迁移”导出完整备份。
v0.6.2
- 手动调整匹配更流畅:网页一次截取整页,在本地滚动;鼠标悬停立即框出将要选中的元素,按 ↑ / ↓ 扩大或缩小范围(取代“父级层数”下拉框),选中后也可用“扩大 / 缩小”按钮调整。点选与订阅预览合并为一次请求。
- 去掉“浏览模式 / 选择模式”切换:按住 ⌘ / Ctrl 点击链接即可跳转,跳转后可一键“以此页为源网址”或“返回源网址”,不会再出现画面变了却无法保存的状态。
- 接口:
POST /api/browser/:id/pick支持按元素node点选、exact和rules(返回items/previewError);新增POST /api/browser/:id/follow。截图与高亮坐标改为相对整页顶部,ScreenFrame新增viewportHeight和map。 - 找不到 Chromium 时直接提示运行
pnpm browser:install(后台抓取日志同样显示),不再只显示“网页操作失败”。 - 网页操作或后台抓取只能显示通用提示时,服务端日志记录原始错误(隐藏网址参数和凭据);Chromium 启动失败同一原因只记一次。
- e2e 测试端口可用
E2E_PORT/E2E_FIXTURE_PORT覆盖。
升级提示:数据库结构与 v0.6.1 相同,无需迁移;部署文件(Compose、沙箱配置)没有变化。截图接口返回整页截图和元素地图,高亮坐标改为相对整页顶部;直接调用 /api/browser 接口的脚本需要按新坐标处理。建议升级前从“设置 → 备份与迁移”导出完整备份。
v0.6.1
- 在浏览器地址栏直接打开 RSS 地址时显示可读的预览页(名称、来源、复制按钮、最近内容和“查看原始 XML”);阅读器、插件和脚本仍然得到标准 RSS。判断只依赖浏览器顶层导航自带的 Fetch Metadata 请求头,
?format=xml始终返回 XML。 - RSS 频道新增
ttl(刷新间隔)、generator和说明来源的中文描述;有图片的条目附带media:thumbnail。订阅地址响应增加X-Robots-Tag: noindex和Vary。 - 导出 OPML:列表表头导出当前结果,批量操作栏导出所选订阅;批量添加 RSS 翻译时可从 OPML 文件导入地址。
- 地址栏记住当前页面和打开的订阅面板,刷新后保持原位,支持浏览器前进 / 后退;标签页标题跟随当前页面。
- 订阅列表:首字母头像、排序(添加顺序 / 名称 / 最近更新 / 需要检查优先)、相对时间(悬停显示完整时间)、点击错误原因直达抓取日志、点击状态栏“需要检查”筛选、无结果时一键清除筛选、批量操作栏可取消选择。
- 订阅面板可在新标签页打开订阅页;条目超过 20 条时可“显示全部”。
- 按
/聚焦搜索,Esc 清空;新建订阅时如果还没有 Cookie 凭据,提示去“设置 → Cookie 凭据”添加。 - 翻译订阅在 RSS 中声明
<language>zh-cn</language>。 - 管理员工作台:侧栏顶部新增工作台切换器,可直接切换到任意账号;管理他人时侧栏与顶栏以琥珀色提示;地址栏记录目标账号,刷新和前进 / 后退保持在同一工作台(修复了在他人工作台打开订阅面板后刷新提示“订阅不存在”)。
- 一步直达出错订阅:订阅页“需要检查”显示“点击筛选”,点击即筛选并滚动到列表;订阅的“需要检查”标签同样可点;用户管理中“出错订阅”可筛选账号,每个账号的“N 出错”直接进入该工作台并只看出错订阅。
- 用户管理改为总览:每个账号显示订阅数(出错 / 暂停)、凭据数、最近活跃和创建时间,顶部汇总账号与出错订阅;编辑、停用 / 启用、删除收进“⋯”菜单;账号较多时可搜索。用户列表接口增加对应统计字段。
- 通过
http://服务器IP访问(非 HTTPS)时复制按钮也能使用:浏览器不提供剪贴板接口时自动改用兼容方式。 - 订阅面板的标签与地址栏同步;切换标签或关闭面板不会堆积浏览记录。标签页在后台时暂停订阅列表轮询,切回时立即刷新。已暂停的订阅在列表中淡化显示。
- 批量任务显示各状态数量和彩色状态标记,操作按钮靠右排列;批量输入框提供示例。
- 新建网页或 RSS 订阅时,若已有订阅使用相同地址会给出提示(仍可保存)。
- 应用设置与通知设置的保存按钮在长表单中吸附在屏幕底部;RSS 地址框按回车即可预览;手动刷新完成后提示。
- 登录页记住上次的用户名并直接聚焦密码;会话失效时提示重新登录;新建菜单支持方向键。
- 界面出现意外错误时显示可重新加载的提示页,而不是空白页;编辑器已打开网页时刷新或关闭标签页会先确认。
- RSS 来源的条目摘要显示为纯文本,不再露出 HTML 标签;没有订阅时不显示全为 0 的状态栏;次要文字对比度提升至 4.6:1。
- 修复:管理员修改自己的用户名或角色后,订阅列表会空白最长 30 秒。
- 修复:滚动准备每步停留 220 毫秒(原 150 毫秒),延迟约 250 毫秒才显示内容的页面在较慢的主机上也能被完整抓取。
升级提示:数据库结构与 v0.6.0 相同,无需迁移;用户列表接口新增只读统计字段。订阅地址在浏览器中直接打开会显示预览页,阅读器不受影响。建议升级前从“设置 → 备份与迁移”导出完整备份。
v0.6.0
全新界面
- 重新设计整个网页界面:以深林绿、暖纸色和灯笼黄绿光为主色,标题使用衬线字体,网址与时间使用等宽字体;支持亮色 / 暗色,顶栏可在“跟随系统 / 亮色 / 暗色”之间切换并按浏览器记住。
- 订阅详情与订阅设置合并为一个面板:订阅地址、状态和“立即刷新”固定在上方,下方为“订阅内容 / 抓取日志 / 订阅设置”标签,未保存的设置在关闭或切换标签前提示。
- 订阅页首屏更紧凑:四项状态栏(新增“需要检查”数量)、筛选与视图切换合为一行、全选移到列表表头,勾选后出现吸顶批量操作栏。
- “新建订阅”改为拆分按钮,菜单提供网页生成 RSS、RSS 翻译和批量添加;批量添加页增加返回入口,并在提交前标出无效或重复的网址。
- 设置页增加分组导航;Cookie 凭据从侧边栏移入设置。
- 用户管理改为“创建用户”按钮加弹窗,账号列表以标签显示角色和状态。
- 手机端改为底部悬浮导航,弹窗从底部弹出。
加固与维护
- 修复:完整备份导出在翻译缓存超过 20000 行时失败。缓存每小时才清理一次,翻译活跃的实例经常超限;现在导出只取最近使用的 20000 条。导出校验失败时界面会显示出错的表和字段,未预期的服务器错误会写入日志。
- 数据库体积有了上限:翻译进度事件每个订阅只保留最新 200 条(此前只按 7 天清理,繁忙实例可达数百 MB);新数据库启用增量回收,清理后空闲页每小时逐步还给磁盘。新增
scripts/compact-db.ts,用于一次性压缩已有数据库。 - 安全与依赖:升级 fastify、@fastify/static 和多个传递依赖,
pnpm audit --prod不再报告已知漏洞;网页界面响应增加X-Frame-Options: DENY;过期登录会话每小时清理。 - 运行:
start与容器改为node --import tsx直接启动,应用成为容器主进程,停止更干净;镜像新增HEALTHCHECK。检测到反向代理但未设置可信代理时,日志会提示登录限速的影响。 - 性能与健壮性:会话的
last_seen_at最多每分钟更新一次,用户按 ID 直接查询;创建订阅和凭据时一次写入所有者,不再先写默认值再更新。 - 新增项目图标(灯笼里亮着 RSS 信号):网页标签页图标、界面 Logo 和 README 顶部。
- 文档:重写 README,补充 Nginx 可信代理步骤、数据保留与体积、备份大小上限和排障条目,并更正多处过时说明。
- 依赖更新:@fastify/cookie、fast-xml-parser、zod、sanitize-html、lucide-react(1.x)以及 GitHub Actions 固定版本。新增 Dependabot 配置。
升级提示:数据库结构与 v0.5.1 相同,无需迁移,可直接拉取新镜像升级;仍建议升级前从“设置 → 备份与迁移”导出一份完整备份。界面布局有调整,Cookie 凭据现在位于“设置”中。
v0.5.1
- 每个用户可独立设置 Bark 地址、开关、失败阈值与重试参数,并向明确显示的接收账号发送测试通知;故障只通知订阅所有者,不回退管理员地址。
- 用户管理新增改名、角色升降级和永久删除;删除前展示资源数量并要求输入用户名。所有管理员同权,事务保护最后一名启用的管理员,禁止停用或删除自己。
- 管理员可进入任意账号的订阅、凭据、批量任务和个人通知工作台,持续显示当前目标;停用用户仅允许查看和修改静态配置。
- 队列及浏览器操作校验操作人和所有者,身份变化撤销会话并取消相关操作;切换工作台丢弃旧响应,Cookie 与 Bark 密钥不回显。
- 数据库升级至版本 8,旧全局 Bark 迁移给原管理员;完整备份升级至 version 3,兼容旧备份、多管理员及个人通知,保留已有 RSS 地址。
- 整站备份验证当前管理员密码;本机
admin:reset在多管理员时要求选择目标。更新 API、端到端测试及使用维护文档。
升级前请备份完整数据卷;回退旧程序时同时恢复旧数据卷。轻量配置只包含操作管理员自己的订阅与通知密钥,请私密保存。
v0.5.0
- 新增管理员创建、停用/启用普通用户及重置密码;所有用户使用统一登录页并可修改自己的密码。
- 订阅、Cookie 凭据、批量任务及浏览器编辑会话按用户隔离,管理员工作台也只显示自己的数据。
- 系统设置和整站备份仅管理员可用;修改密码只撤销目标账号会话,账号切换时丢弃旧请求响应。
- 停用账号撤销登录、关闭编辑会话、取消后台操作并暂停 RSS 访问;重新启用恢复待处理任务,保留手动暂停的订阅。
- 数据库迁移至版本 7,完整备份升级至 version 2 并兼容旧备份,保留原管理员密码、订阅历史及 RSS 地址。
- 新增用户权限、并发停用、账号切换、迁移与端到端测试,并更新使用和维护文档。
升级提示:升级前备份完整数据卷。升级后需重新登录;原数据归原管理员。回退旧版程序时须同时恢复升级前数据卷。
v0.4.1
- 支持 Science 等网站提供的 RSS 1.0(RDF)订阅,读取 RDF 条目标识、正文与 Dublin Core 日期,修复有效订阅被误判为非 RSS 的问题。
v0.4.0
- 新增 RSS/Atom 中文与双语订阅,支持批量添加、后台翻译、持久化缓存和失败重试。
- 使用 Google 浏览器翻译接口,原生数组批量提交并发请求;只有标题和正文均完成的条目才进入公开订阅。
- 网页抓取订阅可选择原文、中文或双语输出,翻译已有标题与摘要,保留订阅地址、历史和图片。
- 订阅列表区分来源及输出模式,支持按来源和是否翻译筛选。
- 增加实时翻译进度与日志、限流退避状态、手动重试和翻译失败 Bark 告警;Bark 设置增加测试通知按钮。
- 数据库自动升级至版本 6,已有网页订阅保持原文;支持配置与完整备份迁移。
- 修复批量任务结束时立即重试可能不唤醒队列的问题。
升级提示:Google 免费浏览器翻译通道仍为实验性,部署主机需能访问 translate-pa.googleapis.com。升级前请导出加密备份;新数据库及备份不支持直接降级到旧程序。
v0.3.0
增加订阅抓取日志:记录所有实际抓取的来源、结果、耗时和新增条目数,支持筛选、分页、自动更新与重启中断恢复;默认保留 30 天。
增加 Bark 故障通知:首次失败告警、连续失败去重、后台重试及持久化恢复,不因没有新文章误报。
网页统一管理 Bark、日志、并发、网络白名单、DNS、可信代理及服务器设置;监听地址与端口重启生效。
应用设置随配置导入导出与完整备份迁移,Bark 地址在数据库中加密保存;普通配置文件包含 Bark 密钥,需私密保管。旧环境配置首次自动迁入网页设置。
恢复网页上下按钮滚动,改善论坛日期识别。
拆分订阅详情与设置入口,明确匹配规则编辑,设置支持直接修改名称和刷新间隔,无需重新预览网页。
修改间隔后重新计算下次检查时间,保留暂停状态及历史,避免旧抓取或调度覆盖设置;未保存修改提供离开提醒。
日期点选支持从分类、来源等混合文本中提取时间;相对时间标记为估算,保存后不随刷新漂移,准确时间可纠正估算。
霂明导航
/intel按文章链接读取原始时间戳;统一日期预览、自动识别和后台抽取,兼容旧数据库和备份。
v0.2.2
- 本机 Nginx 反代自动识别域名与 HTTPS,无需 PUBLIC_ORIGIN 或 .env;修复默认部署下域名访问被拒绝的问题。
- 保留来源校验,隔离并发请求的 RSS 地址与 Cookie 配置;简化 Nginx 文档为模板,移除证书申请说明。
v0.2.1
- 统一订阅列表名称与 RSS 频道标题,改名不改变地址、历史和调度;兼容旧数据及备份中的自定义频道名称。
- README 改为直接下载 Docker Compose 配置并启动,移除一行安装脚本;首次设置码在服务启动日志中显示。
0.2.0 — 2026-09-07
- 默认列表视图,支持卡片切换、服务器持久化偏好、选择和批量复制/暂停/恢复/刷新/删除。
- 独立修改阅读器中的 RSS 频道名称,无需重新抓取,保留原订阅地址和历史。
- 批量网址创建支持高可信自动保存、人工确认、取消、重试及服务重启恢复。
- 增加密码加密完整备份、跨主密钥恢复和轻量配置合并;初始化页支持直接恢复。
- 提供非 root Chromium 沙箱 Docker 镜像构建、Compose、Nginx HTTPS 示例和版本化安装脚本。
- README 精简为入口,完整部署、使用、迁移、维护、开发文档集中到 doc/。
- CI 增加双架构原生容器、真实 Nginx HTTPS 和数据持久化验收,标签通过后发布 GHCR 与 Release。
0.1.0 — 2026-09-06
- 实现中文管理网页:首次初始化、登录、退出、修改密码及本机重置。
- 支持 Cookie 字符串和 OpenCookie JSON 导入,加密存储和独立浏览器上下文。
- 自动发现重复内容列表,提取标题、链接、摘要、图片和日期,提供候选和订阅预览。
- 支持截图点选、缩放坐标映射、选择器编辑和手动字段保留;只允许保存已完成预览的规则。
- 实现订阅编辑、暂停、恢复、定时与立即刷新、失败保留历史、URL 去重及 RSS 密钥轮换。
- 管理请求校验登录、CSRF、Origin 和 Host,浏览器通过受限代理固定目标 IP,默认阻断私网与保留地址。
- 增加本地 fixture、真实 Chromium 验收和 Node.js 24 CI。
- 修复公网检查发现的日期标签误作标题,以及并发刷新、凭据域绑定、RSS 摘要转义问题。
- 修复管理错误退化为 Bad Request、HTTPS 隧道 EPIPE、正文选择器扩展到页脚;支持可选加密 DNS,兼容本机 Fake-IP 代理环境。
- 通过上科大科研进展和 Pepper 博客的公网自动推荐复验,结果及早期网络限制记录于
doc/history/public-smoke.md。镜像、安装包和 Release 自动分发留待后续。
0.1.0-dev.1
- 建立 TypeScript、React、Fastify 工程与共享接口。
- 确定自动识别优先、可视化纠偏、单管理员登录和 Cookie 导入的首版范围。