前两天我想找一个自己上个月看过的技术博客,明明还记得那篇文章里的几个关键词,但开着 Chrome 历史记录翻了十分钟硬是没捞着。浏览器自带的历史搜索只匹配 URL 和标题,页面正文完全不参与搜索,等于我只记得内容却忘了链接,就彻底没戏了。也就是在这个时间点,我发现了 hindsight——一个本地优先的浏览器历史全文搜索工具。它把 Chrome 的 History 数据库搬到自己的私密空间里,建好全文索引,再用一个本地网页和一套 REST API 把历史“还给”我。如果你也经常靠网页吃饭——写博客、做研究、整理素材,或者单纯不想被浏览器自带的历史搜索气死,这篇就值得你花十分钟看完。
1. 浏览器自带的历史搜索,为什么一到关键时刻就指望不上
1.1 三个硬伤:只搜 URL 和标题、没有全文、翻页体验差
Chrome 的历史记录入口chrome://history确实能搜,但它的索引范围窄得让人想叹气,基本就俩字段:URL 和页面标题。这个设计在浏览器还很单纯的年代够用,放在现在就非常难受。
第一个硬伤是“搜正文必失败”。你看一篇文章,标题往往起得语焉不详,比如“第 3 章实现细节”“深入理解某种机制”,但真正写进你脑子的是文章里的一句话、一个术语、一个数字。回查的时候你只能记住内容里的碎片,可浏览器压根不索引正文,于是怎么搜都是零结果。第二个硬伤是“没有相关性排序”。就算你撞大运搜到了,也是一大堆按时间倒序排列的结果,几年前的、无关的、广告页全混在一起,你想要的偏偏不在第一屏。第三个硬伤最要命——没有 API。浏览器的历史数据关在自家 UI 里,你没法把它接进任何自动化流程,没法导出,没法统计,更没法做二次加工。对普通用户这也许不痛不痒,但对写东西、做资料整理的人来说,历史数据是一座沉默的金矿,而浏览器亲手把矿门焊死了。
1.2 市面上不是没有“历史增强”工具,但 hindsight 的取向完全不同
市面上其实有一堆帮你“管理”浏览历史的工具,但它们的核心逻辑几乎都是:把历史同步到云端,然后在云端给你做搜索和统计。这种方案的代价是隐私边界越来越模糊,你的浏览轨迹等于交了出去。hindsight 的取向完全不同,它是本地优先,所有数据默认留在你自己的机器上,不会上传任何一家服务器。它不是做一个云端的“历史管理后台”,而是把自己定位成一个本地搜索引擎加一个开发者友好的 API 服务。
我画个简单的横向对比,你就能明白它的定位差异。
| 维度 | Chrome 自带历史搜索 | 云端历史同步类工具 | hindsight |
|---|---|---|---|
| 索引范围 | URL + 标题 | URL + 标题为主 | URL + 标题,页面正文可扩展 |
| 搜索体验 | 关键字硬匹配 | 关键字硬匹配 | 全文索引 + 相关性排序 |
| 数据存放 | 本机 | 第三方云端 | 只在本机 |
| 是否提供 API | 无 | 基本没有 | 有本地 REST API |
| 能否自动化 | 不能 | 有限 | 能写脚本自己接 |
单看“能不能搜到正文”这一条,hindsight 就已经把原生体验甩开几条街了。但真正让我长期用下去的原因,是它的“可编程性”。历史数据一旦变成 API,就不再只是回忆过去的工具,而成为你个人工作流里一个可以随时调用的数据源,这个价值在后面我专门用一章展开。
2. hindsight 的运作原理:从浏览器 History 数据库到本地全文索引
2.1 Chrome 的 History 文件到底长什么样
要搞清楚 hindsight 在做什么,得先知道浏览器的历史数据是怎么存的。Chrome 内核的浏览器(Chrome、Edge、Brave、Arc 这些都属于 Chromium 系)会把历史记录写进一个 SQLite 数据库文件。在 macOS 上路径大致是~/Library/Application Support/Google/Chrome/Default/History,Linux 在~/.config/google-chrome/Default/History,Windows 在%LOCALAPPDATA%\Google\Chrome\User Data\Default\History。
这个文件里最关键的两张表,一张叫urls,记录每个页面的 URL 和标题;另一张叫visits,记录你是什么时间点访问的,以及访问来源。两张表通过 URL 的 ID 关联起来。理论上,只要你能读这个文件,就能拿到全部历史数据。但这里有个麻烦:Chrome 运行时会对这个文件保持锁定,而且最新数据会先存在内存里,等浏览器落盘后才能被读到。如果哪个程序直接去读,经常碰上database is locked之类的错误。hindsight 的实际做法是复制出临时副本,或者等浏览器空闲时再读,尽量避免和浏览器抢同一个文件。这也是我第一次用它时最佩服的一点:它在“数据源是别人正在使用的文件”这种苛刻条件下,还能稳定地把索引建起来。
2.2 两级索引方案:URL 与标题索引 vs 页面全文索引
建索引这件事,hindsight 把选择权交给你,按需启用。
默认情况下,它只对 URL 和页面标题做索引。这个模式的好处是零负担——不用装任何额外组件,启动后直接抓历史数据库然后建索引,搜索走本地全文索引,已经比 Chrome 原生自带的体验好很多了。如果你只是经常要找“那个网站叫什么来着”或者“那篇文章标题里有 XX 关键词”,这个模式完全够用。
但如果你和我一样,经常只记得正文里的一句话,那就要开启第二级:页面全文索引。这需要安装一个配套的浏览器扩展。扩展在访问每个页面时,会把可见文本内容捕获下来,交给 hindsight 存在本地数据目录里,然后再进全文索引。装完扩展之后,你再搜文章里那句你想不起来出处的话,就能一击命中。
我把两种模式的取舍整理一下,方便选。
| 模式 | 能搜到什么 | 安装成本 | 资源占用 | 隐私影响 |
|---|---|---|---|---|
| URL + 标题索引 | 网址、标题关键字 | 只需安装 hindsight | 很低 | 数据全在本地 |
| 页面全文索引 | 页面可见正文内容 | 需要额外装扩展 | 稍高 | 数据仍然全在本地,但本地磁盘占用上升 |
我的建议是:先跑默认模式,用顺手了再决定要不要开全文。一开始就开全文会比较猛,因为首次抓取时会把历史里所有页面都过一遍,索引时间会明显变长。
2.3 “本地优先”不是口号,而是一整套隐私默认值的重新设定
我见过不少号称隐私友好的工具,实际就是把数据库放在你本地,但功能逻辑绕不开云端。hindsight 在隐私设计上最让我放心的是,它没有云端同步这一说,你机器以外的部分根本不在架构里。历史数据从浏览器里被复制出来后,所有的搬运、索引、搜索、API 响应,全是在本机进程里完成的。
对写作者和研究者来说,这意味着一个很实用的场景:你搜索自己看过的医学资料、竞品分析、投资线索这类敏感内容时,不用担心这些关键词经过第三方服务器。你的历史记录里藏着太多搜索词和阅读行为,这些数据一旦上传,你甚至不知道它们会被如何建模、如何关联。本地优先的工具等于在最底层把这种风险直接拿掉了。当然,代价是你没法多设备同步、手机上看不到,但对“自己的数据自己做主”的人来说,这个交易非常划算。
3. 从零跑通 hindsight:安装、启动、日常搜索
3.1 三种安装方式怎么选
安装 hindsight 的方式不少,我实际试下来,最省事的是官网提供的安装脚本,在终端里执行:
curl -s https://hindsight.dev/install.sh | sh执行完它会自动把可执行文件放到合适的位置。另外,如果你日常用 Homebrew,也可以试:
brew install lazerwalker/brew/hindsight在 Node.js 环境里,它也有 npm 包分发渠道。具体用哪种,可以以官网当前给出的说明为准。我个人体会是:能用包管理器就用包管理器,后续升级方便;安装脚本适合快速体验。
注意:安装前确认一下自己机器的网络环境和权限,别用 sudo 硬装到系统目录里,尽量装到用户目录,后面升级维护省心。
3.2 首次启动、索引等待与 Web 界面
安装完成后,直接在终端输入hindsight启动。第一次运行它会先检查浏览器历史数据文件的位置,然后做一次全量索引。索引需要多久,取决于你的历史积累量。我自己的历史有好几年的量,第一次索引大概花了几分钟,期间界面上能看到进度,不需要你干预。
索引完成后,浏览器打开http://localhost:1927,就进入了它的搜索界面。这个界面特别简洁,就一个搜索框加一个结果列表。我在里面输入记忆碎片里的关键词,结果立刻列出来。第一次用的时候,我甚至有点恍惚:这些东西本来就在我的浏览器里,为什么现在才变得可搜。
需要提醒的是,1927 这个端口在启动时会被本地服务占用。如果你防火墙很严格或者端口被其他程序抢先占用了,启动日志里会有报错,你可以在启动参数里调整监听端口,具体参数名用hindsight --help查一下即可。
3.3 安装浏览器扩展,解锁完整全文搜索
如果你决定上全文索引,就去官网下载配套浏览器扩展。下载后按普通扩展流程安装,Chrome 系的浏览器一般会提示你授权该扩展读取你访问页面的内容。因为捕获文本只能在页面加载时同步进行,所以授权范围通常覆盖全部站点——这是它工作的前提,不用慌。
安装完扩展,新访问的页面就开始进入全文索引流程了。对那些你希望“连正文也一起记住”的站点,这个模式非常爽;不想要的站点,也可以在扩展设置里做排除。注意这不是即时的:扩展捕获完文本,还需要本地服务完成索引写入,通常隔几秒到几十秒,新页面就能被搜到了。
4. REST API 才是灵魂:把历史数据接进自己的工作流
4.1 先理解 API 的价值在哪
如果说搜索界面是 hindsight 的门面,那 REST API 就是它的引擎室。打开http://localhost:1927/history?q=关键词,你可以直接拿到 JSON 格式的搜索结果。这意味着什么?意味着你不需要守在浏览器前面点搜索框,而是可以写脚本,在任意时间把历史数据拉出来,交给自己的程序去处理。
对喜欢自动化的人来说,这个 API 把“浏览器历史”从一个死数据变成了活接口。你可以做定时统计、周报生成、素材整理、写作灵感捕捉……一切取决于你想让历史数据干什么。
4.2 快速验证:用 curl 确认 API 可用
启动 hindsight 之后,最直接的验证就是在终端敲一行 curl:
curl "http://localhost:1927/history?q=hindsight&limit=5" | jq .返回结果大致是一个 JSON 数组或包裹数组的对象,每个条目里包含页面标题、URL、访问时间这些基本信息。具体字段名以你本地安装的版本为准,不用纠结,能看到数据列表就已经说明 API 通了。
q是搜索关键词,limit是返回条数。还可以根据自己的需要加时间范围参数,比如只看某一天、某一周的数据。这些参数在官网 API 文档里都有,记性不好就先把文档存好。
4.3 一个真实脚本:把“最近看过的高质量页面”存成 Markdown
API 只解决“能拿到数据”,拿回来干什么才是关键。我给你分享一个我实际在用的脚本:每天晚上把当天访问过且标题里含指定关键词的历史记录,整理成 Markdown 文件,追加到我的笔记目录里。这样我白天浏览的技术文章,晚上自动变成笔记素材,不需要我手动剪藏。
import requests import datetime from urllib.parse import quote API = "http://localhost:1927/history" KEYWORDS = ["rust", "sqlite", "local-first", "distributed"] OUTPUT_FILE = "/path/to/notes/daily-history.md" def fetch_today_links(keyword): date_from = datetime.date.today().isoformat() params = {"q": keyword, "from": date_from, "limit": 20} resp = requests.get(API, params=params, timeout=10) if resp.status_code != 200: return [] data = resp.json() if isinstance(data, dict): items = data.get("results") or data.get("data") or [] else: items = data return items links = [] for kw in KEYWORDS: items = fetch_today_links(kw) for item in items: title = item.get("title") or item.get("url") url = item.get("url") if title and url and url not in [x[1] for x in links]: links.append((title, url)) with open(OUTPUT_FILE, "a", encoding="utf-8") as f: f.write(f"\n## {datetime.date.today().isoformat()}\n") for title, url in links: f.write(f"- [{title}]({url})\n")这段代码思路很简单:遍历关键词,查当天数据,去重后追加到 Markdown。你完全可以改成自己的场景,比如只保留某个域名、只统计某个标签、或者输出成 CSV 交给表格软件分析。
4.4 定时任务的落地
脚本写好之后,剩下的事就是让它自动跑。macOS 可以用 launchd,Linux 用 cron,Windows 用任务计划程序。比如在 Linux 下我想每天晚上 23 点执行一次,就写:
0 23 * * * /usr/bin/python3 /home/me/scripts/history_to_md.py >> /tmp/history_sync.log 2>&1本质上,hindsight 在这条链路里扮演的角色就是“数据出口”。你只需要保证它启动着,剩下的数据处理全在你自己手里。
5. 实战排坑:我踩过的几个问题,和对应的解决思路
5.1 刚看的页面搜不到,先别怪工具
最常见的情况是:前脚刚点开一个页面,后脚去 hindsight 里搜,结果为空。原因基本上出在两方面。一是浏览器还没把这次访问真正写进 History 文件,尤其 Chrome 有时会在内存里攒一批再落盘,过个几十秒甚至几分钟才可见;二是虽然页面被记录了,但索引建立是异步的,hindsight 需要一个处理周期。
遇到这种情况,我的做法是:先把页面访问一下,等几分钟再回来搜;如果还是搜不到,重启一下 hindsight 服务,强制它做一次增量同步。绝大多数“搜不到”都能这样解决。千万别急着删缓存。
5.2 数据库锁与权限问题
如果 hindsight 在启动时直接报错,或说无法读取历史文件,大概率是浏览器正在运行导致 SQLite 文件被锁。旧版本的工具会直接打不开,新版本大多会自动复制临时副本,但权限不对时仍可能失败。
我的经验是:首次安装后做全量索引前,先把浏览器完全退出一次,让 hindsight 能独占读取文件,跑完首次索引再正常开浏览器。日常使用则不用频繁退出浏览器,靠增量机制就够了。另外留意一下历史文件所在目录的权限,不要用 sudo 运行 hindsight,否则生成的索引文件归属 root,后面你自己用起来反而麻烦。
5.3 多浏览器、多 Profile 的配置问题
我平时主力是 Chrome,但也会开 Brave 和 Edge,偶尔还要切另一个 Profile。hindsight 默认读取的是你主浏览器的默认 Profile 路径。如果你的内容分散在多个浏览器或多个 Profile 中,默认配置显然不够用。
解决办法是让所有浏览器的历史数据汇到一个地方。最简单粗暴的方式是用软链接:把其他浏览器的 History 文件链接到 hindsight 会去读取的位置,或者反过来。比如在 Linux 下我让 Edge 的历史指向一个统一管理的目录,然后告诉 hindsight 去那个目录读。这需要一点命令行功底,但配置一次就能一劳永逸。如果你只想搜一个主力浏览器,那跳过这里就行,别给自己找事。
5.4 索引体积膨胀与隐私焦虑
开全文索引之后,最大的代价是本地磁盘占用会逐渐涨起来。页面正文全都存下来,一天浏览几十个页面,日积月累就是好几 GB。这个体积对一般人可能无所谓,但对存储空间紧张的人就是个麻烦。
我的建议是定期做数据归档:把历史索引目录整体压缩备份一次,然后清掉旧索引重新建,保住最近几个月的数据就够日常用了。另外,如果你在意隐私,可以只对特定站点启用扩展抓取,其他站点只保留 URL 和标题。毕竟“全文索引”是便利,不是义务。
6. 进阶方向:把浏览历史当成个人知识库的底座
6.1 浏览历史不只是“找东西”,更是你的注意力日志
用了一段时间 hindsight 之后,我对浏览历史的看法发生了转变。它不再只是“出错时找回链接”的工具,而是一份忠实记录我注意力流向的日志。每天看了哪些类型的文章、在哪些主题上停留多久、哪些站是长期供给源——这些以前被浏览器 UI 藏起来的信息,现在变成了一组可查询、可统计的数据。
把历史当数据之后,很多玩法就打开了。你可以写脚本统计一周内高频出现的技术关键词,用来反向评估自己的学习重心;可以按月份导出阅读清单,当作个人阅读年报;还可以结合域名过滤,看看自己在信息流消费上花了多少时间。这些都不难,难的只是过去没有数据出口,现在有了。
6.2 历史数据接入笔记系统,让素材自动沉淀
我最推荐的玩法,是把它接入 Obsidian、Logseq 这类本地笔记工具。前面那个“每日历史转 Markdown”的脚本就是最小可行实现。你可以在此基础上做得更聪明:搜索结果里过滤掉娱乐型标题,只保留包含技术关键词、且页面标题里不含敏感词的条目;再按你的笔记组织方式,生成带标签的 Markdown 文件。这样,你白天浏览的几十个页面,晚上自动变成笔记库里带日期、带链接、带关键词的素材卡片,剪藏软件都可以省了。
这种做法的核心收益是:你不需要改变任何浏览习惯,知识沉淀就悄悄发生了。hindsight 只负责把历史数据安全地交给你,剩下的所有加工逻辑,都在你自己的代码里。
6.3 与本地 AI 组合的想象空间
更进一步,如果你本地跑过语言模型,那么完全可以把 hindsight 的 API 结果作为“记忆检索”的输入,做成一个真正不依赖云端的个人知识问答工具。思路很简单:当你想问“我以前看过一篇讲 XX 方案的文章,里面怎么说的”,先通过 hindsight 的 API 搜出相关页面,再把页面内容喂给本地模型做总结,最后直接得到答案。这个过程所有数据都在自己机器上,意义不只是隐私,更在于它是可解释、可追溯的——模型给出的每一段回答都能定位到具体的页面来源。
我还没有把这一步做成完整成品,但方向已经很清晰:本地工具负责数据,模型负责理解,两者加起来,一条完全私有的知识管道就通了。
最后再分享一点个人体会
我用 hindsight 替代浏览器自带历史搜索已经快两个月,最大的感受不是“搜索变快了”,而是终于能搜到自己脑子里只残留碎片的内容。那些以前注定丢失的阅读记忆,现在成了可以随时调用的资产。最后一个小技巧:把它设成开机启动,这样你临时想查历史时不用先想起“哦,还得先去启动服务”。历史搜索这件事,最好的体验就是当它不存在——你只管搜,剩下的它早就准备好了。