RBox 资源收藏乌托邦

个人互联网资料库:为人保存内容,为 AI 提供数据。

这是一个设想中的产品,目前尚未开发。 下面是它的功能与架构设计。想听听你的看法:如果它存在,你会想用吗?页面底部可以投票。

它想解决什么

我们收藏过很多东西:文章、图片、视频、音频。但收藏夹里大多只留下一条链接。

RBox 的思路是:收藏的时候,就把能拿到的正文、图片、媒体和来源信息一起保存下来。

核心功能

1. 保存内容本身,而不只是链接

保存标题、正文、作者、发布时间等信息,以及页面中的图片和媒体文件。原网页变化或失效之后,你手里仍有一份可用的副本。

2. 在你自己的设备上采集

手机分享一个链接,App 用内嵌 WebView 打开它;桌面端用浏览器扩展。采集发生在你已登录的环境里,不需要把账号交给服务器,也不由服务器替你去抓取网页。

3. 外部加工结果,带着来历一起保存

OCR、音频提取、视频转文稿等,一期由你用的外部 AI 或工具完成。保存时需要说明是怎么得到的,并附上过程记录。RBox 原样记住这些记录,不会重新加工一遍,也不会覆盖原始内容。

4. 保存之后找得到

提供网页界面浏览,支持全文搜索,也提供 REST API 和命令行(CLI),方便导入、导出和批量处理。

5. 对 AI 开放

通过 MCP,AI Agent 可以搜索、读取和保存你的资料。所有入口共用同一套数据模型和权限,不会出现网页能做、AI 不能做的两套逻辑。

一次收藏是怎么发生的

  1. 分享把链接分享给 RBox。
  2. 提取在 WebView 里打开,按站点规则脚本提取正文。
  3. 下载媒体图片、音视频由你的设备下载并上传。
  4. 入库云端校验、保存并建立索引。

一次只处理当前这一条:提取完成就提交,成功或失败都先告诉你结果,不在手机里堆积待上传任务。

架构设计

这一部分写给想看细节的人,也是 RBox 和普通收藏工具思路上的主要区别。

整体分层

客户端采集
手机 App(Flutter + WebView)、浏览器扩展、API 和 CLI。负责读取页面、提取内容、下载媒体并上传。
采集规则
按域名下发的规则脚本,注入页面执行,类似油猴的运行方式,但只运行 RBox 按版本发布的规则,不开放任意脚本安装。
云端存储
PostgreSQL 管理内容与元数据,S3 兼容对象存储保存媒体,起步用数据库全文检索。
数据访问
Web、REST API、CLI、MCP,共用同一套内容模型与权限控制。
内容加工
OCR、摘要、翻译、多来源合并等。一期只保留设计,不实现。

与常见做法的几点不同

环节常见做法RBox 的设计
采集位置服务器收到链接后自己去抓取在用户的设备上采集,用用户自己的登录态和环境;服务器默认不抓取
站点适配每个网站各写一套程序,或完全依赖通用提取通用脚本打底,站点规则只补充通用脚本覆盖不了的页面,并记录每次用的规则版本
提取不出正文服务器重新请求原网址客户端把已拿到的 DOM 或文章根节点交给服务端转 Markdown;服务端不请求网址、不下载媒体,这份 DOM 也不长期保存
媒体文件服务器下载,常遇到登录与防盗链一律由客户端下载再上传;服务端从 HTML 里发现的媒体地址,也只是交回客户端处理
保存状态一个“成功”标记采集、资源获取、云端入库三个阶段分别记录;正文成功而视频失败,会显示为部分成功
外部加工结果只保存最终文本文本连同产生方式、工具和过程记录一起保存,可追溯、可过滤
采集规则与结果协议

规则按域名匹配,包含:匹配模式、注入脚本及其 SHA-256 校验值、运行时机、判定“提取完成”所需的字段、提取不足时是否允许交给服务端。客户端会拒绝执行校验不一致的脚本。

脚本通过固定约定返回三种结果:

  • complete:客户端已得到所需正文和元数据。
  • need_server_extract:需要服务端根据 DOM 提取 Markdown。
  • failed:页面无法读取或脚本出错。

客户端完成采集后,整理为统一的 Capture Package 上传,包含来源 URL、采集时间、标题与正文、媒体资源及原始地址、各项获取状态、规则版本、正文来自客户端还是服务端、客户端类型版本,以及数据产生方式与上下文痕迹。

正文中已保存的附件会替换为稳定的云端路径,不使用会过期的签名 URL;没能保存的附件保留原始地址,并标明尚未保存。

数据模型

内容采用扁平模型,不做复杂的树形结构。

对象用途
Item一条收藏,或一份外部提交的加工结果:类型、标题、来源 URL、正文、元数据、状态。
ProductionContext数据产生上下文:方式(客户端采集、外部 OCR、音频提取、视频转文稿等)、生产者与版本、输入引用、过程痕迹。RBox 校验并保存,不重放。
Asset媒体资源:对象存储标识、原始地址、类型、大小、校验值。一条内容可关联多个资源。
CaptureRule按域名下发的采集规则与版本。
CaptureTask服务端已接收记录的过程与失败排查,不镜像手机上的队列。
ItemRelation来源关系(衍生自、参考了、替代了)。二次加工阶段才引入,一期不实现。
API、CLI 与 MCP

API 从 /api/v1 开始,是唯一的业务入口,CLI 和 MCP 都建立在它之上。

  • GET /capture-rules:按域名取规则。
  • POST /capture/extract:把 DOM 转成 Markdown,不抓取、不下载、不写入收藏。
  • POST /items/capture、POST /items:保存内容,必须带数据产生方式;支持幂等重试。
  • GET /items、GET /search:浏览与搜索。
  • GET /assets/{id}:获取媒体元数据与授权访问方式。

MCP 一期只提供少量可靠的工具:capture_url、search_items、get_item、list_assets、create_item。删除等破坏性操作需要明确授权。

它不做什么

先把边界说清楚,也方便你判断它是不是你要的东西。

一期明确不做

  • 由 RBox 执行 OCR、摘要、翻译、转写
  • 服务器默认抓取网页,或替你下载媒体
  • 手机端的采集队列与离线待传队列
  • 开放的用户脚本安装与脚本市场
  • 知识图谱、版本管理、工作流编辑器
  • 社交分享与多人协作

不会承诺的事

  • 所有网站的所有视频都能保存。遇到登录限制、加密媒体、动态签名地址时,会如实报告结果。
  • 页面能播放,不等于文件能完整保存。
  • 采集完成,不代表原网页今后一定可访问。来源链接、内容副本和媒体文件会分别记录。

一期想验证什么

如果它真的存在,你会想用吗?

点一下就好,不需要登录,也不会收集个人信息。