跳转到内容

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 导入的首版范围。

基于 MIT 许可证开源 · 在自己的服务器上部署