把浏览器书签搬到自己的服务器上

我的浏览器里存了许多书签。

有些是常用工具,有些是读到一半的文章,还有一些,当时只觉得也许哪天用得上。时间一长,书签越积越多,慢慢成了我的资料库。

可这座资料库一直住在浏览器里。

平日在自己电脑上使用,并不觉得不便。换一台设备,或临时想从手机上找一个存过的网页,就麻烦了:先登录同一个浏览器账号,等同步完成,再到层层文件夹里翻找。离开原来的浏览器,这些书签几乎等于不存在。

我要的其实很简单:把书签放到自己的服务器上,需要时打开网页即可搜索,不再受某个浏览器账号的限制。

找不到合适的,就自己写一个

动手之前,我找过一圈现成工具。

有些书签服务功能齐全,能加标签、稍后阅读、保存网页快照,甚至用 AI 自动分类;但我不想再养成另一套收藏习惯,也不想把原有文件夹全部搬过去。另一些自托管项目又偏重,需要数据库、后台服务和一长串配置。

我的需求并不复杂:浏览器负责收藏,服务器负责保存,网页负责查找。

既然没有合适的现成工具,我就写了一个轻量的书签系统。它不替代浏览器,也不重新发明书签管理,只把困在浏览器里的内容接出来,放到一个随时能访问的地方。

整套系统如何工作

这套系统分成四段:

  1. 浏览器插件 floccus bookmarks sync 读取本地书签;
  2. 插件通过 WebDAV 把书签同步到服务器;
  3. 服务器把书签保存成一个通用的 XBEL 文件;
  4. 网页读取这个文件,提供文件夹浏览和搜索。

可以把它理解成这样一条路线:

浏览器书签 → 同步插件 → WebDAV → XBEL 文件 → 网页查看器

同步插件 floccus 和 WebDAV 都是成熟工具。我只补上缺失的中间一环:一个能读懂书签文件、适合日常查找的网页。

这样拆分有一个好处:浏览器继续做它擅长的事,收藏网页时不用改变习惯;同步交给现成插件,省去处理不同浏览器接口的麻烦;网页端保持简单,只负责展示和搜索。每一部分各司其职,出了问题也容易判断卡在哪一段。

轻量是第一条要求

我给这个项目定的第一条原则是轻量。

书签同步是一项长期运行的基础服务,平时没有存在感,需要时却必须可靠。如果只为保存几个链接,先搭一套数据库和复杂后台,日后的维护成本很可能超过它带来的方便。

因此,这个系统没有数据库。全部书签保存在一个 XBEL 文件里,本质上是结构清晰的文本文件,可以备份,可以迁移,别的工具也能读取。哪天我不再使用这个网页,书签仍完整地留在手里。

服务本身用容器运行,部署后只需关心书签文件和少量配置。更新界面不影响书签数据,迁移服务器时只要带走数据目录。

这种简单并不等于功能残缺。真正高频的动作只有两个:按原有文件夹浏览,或输入关键词搜索。把这两件事做好,胜过堆砌许多很少用到的功能。

网页端只解决”找到”这件事

网页打开后,左侧是原有的书签目录,右侧是当前文件夹的内容。搜索框可以查标题和链接。它保留了浏览器里的组织方式,第一次打开无需重新学习。

后来我又补了移动端布局。手机屏幕放不下固定侧栏,文件夹列表改成可以滑出的抽屉,搜索框单独占一行,设置面板也换成适合触控的样式。这样临时在外面找书签时,不必缩放网页,也不会被过长的网址挤得看不清标题。

访问入口带有密码,WebDAV 也使用独立账号。这个项目只为自己服务,没有公开注册、分享或社交功能。功能少一些,暴露在外面的入口也少一些。

做完之后,我才看清真正的问题

最初,我以为自己缺的是”书签同步”。做完之后才发现,更准确的问题,是访问权。

书签明明是我亲手收集的资料,过去却只有进入某个浏览器、登录某个账号,才能方便地使用。同步只是手段。我真正想拿回来的,是在任何设备上查找这些资料的自由。

现在,我仍像以前一样在浏览器里收藏网页。唯一的变化是,书签不再只属于眼前这台电脑。需要时,我打开自己的网页,输入几个记得的词,它们就会重新出现。

这正是我最初想要的结果。