在微信读书上,一口气刷了两章。停下来的时候发现:刚才看了什么?一个字没记住。

微信读书的「想法」功能打开,满屏划线像弹幕,把书拆成了碎渣。Kindle 用了五六年,划了 500 多条线。一条都没回看过。

所有阅读产品都在比谁读得多、读得快,却没有人在意一件事:你读完了,究竟留下了什么。

而我想要的很简单————读完一本,能带走其中的判断和行动线索,不是500 条划线,是一个我能回头看的深思。

最早,我使用 Google AI Studio 开了 DeepRead (深读)项目,完成了框架,但在实际处理 epub 格式的阅读上,一直遇到问题无法解决。

最近,我用 Codex 重拾这个项目,没想到很快就做出来我想要的样子。

DeepRead 开源出来,如果你喜欢阅读,或许能帮你读得更慢更深。这是一个本地的 epub 阅读器,启动后在网页上可以阅读。为了内置 AI 辅助你更好阅读,你可以打开设置,配置上你的 API Key,立即就能使用。尽管放心使用,所以信息都是保存在你电脑本地,不会泄露。

穿过黑夜,进入书桌

An image to describe post

深读打开,不是一排排书本,是黑夜里的一个灯火通明的小屋。

构思 DeepRead 之前,进入我脑海,就是这么一个具体的画面。我在深夜的温暖灯光下,坐在书桌前翻阅手中的书页。这样的氛围下,整个人很专注,有一种沉浸在书中的感觉。

深读,就是从此刻开始。

DeepRead 启动画面是深邃的暗蓝渐变,远处是建筑剪影,近处有一栋楼。楼上大部分窗户是暗的,只有一扇亮着暖橘色的光。星星在呼吸——30 颗随机分布的光点,每一颗有自己独立的闪烁节奏。

你的视线会集中在那扇亮着的窗户,点了窗户之后,整个画面向你涌来,你穿过窗口,缓缓进入书桌。

一段 1.6 秒的过渡动画,就是启动阅读的小小仪式感。

为什么要做这个?

因为我发现一个问题:当我们打开阅读 app 时,一进去就是书单,点开就是正文。整个过程太快了,快到大脑还没从「刷信息」切换到「想问题」,就已经开始看字了。

数字阅读丢掉了这个「沉浸」的动作。

你在微信刷一篇公众号文章,和在书桌前翻开一本纸质书的身体感受,是不一样的。不同的心理姿势,决定了完全不同的阅读状态。

那个黑夜里的亮窗,是一个心理开关。点下去,意味着「我现在要安静下来,认真读一本需要想的东西了」。

此处还藏着小小私心。城市夜景的隐喻我特别喜欢——深夜里的一扇窗,意味着里面有人还没睡,在看书,在想事情。你这时没有刷手机。你在做一件安静但重要的事。

那段星星呼吸动画,也是花了点时间调参数。每个光点的大小 1-3px 随机,闪烁周期 3-5 秒,延迟 0-3 秒,让它不是整齐划一地闪,而是有自然星空那种不规则感。标题「深读」两个字用了 2 秒的渐入,刻意慢了半拍——让你在页面上先看见星空,再看见字。

入口最下面那行小字,记录着:这里存放的不是书,而是你的时间与智慧。

打开书之前,先回答一个问题

An image to describe post

每次进入读一本新书时,DeepRead 会拦住你,弹出一行字:

今天,你为了什么翻开这本书?

一个输入框,一行提示,一条会随输入延展的深色动画线。写完按 Enter,进入阅读。

这个交互看起来极其简单。但它是我最坚持的设计。

你带着一个目标进入阅读,行为会完全不同——你会主动搜索答案,而不是被动接收文字。

同一本《工作、消费主义和新穷人》,如果你写的是「996 到底是不是自愿的」,你会注意到作者的工作伦理论述;如果你写的是「消费社会怎么把我变成消费者」,你会注意到那些被营销包装成「选择」的陷阱。

同一个文本,不同的入口,走出完全不同的路。

这也是阅读开始仪式的一部分,有效减少自己稀里糊涂地翻开一本书。一开始填写了,随着阅读过程进程而变化了,这个目标还可以修改,伴随你阅读而让目标生长起来。

当然,DeepRead 并不适合所有类型的书,起码你刷刷小说是用不上的,反而是当你需要深度阅读时才需要它。

划完线,拖入你的卡片

An image to describe post

市面上几乎所有阅读器的划线逻辑是一样的:选中文字 → 点「高亮」 → 文字变色。完了。

DeepRead 的摘录方式是拖拽。选中一段文字,右侧会浮出一个「抓取」按钮。你把它拖到右边的思维流面板里,松手,一张卡片生成。

这个交互我自己用了之后才发现它的力量——拖拽这个动作本身在提醒你:你不是在做标记,你是把这句话从书里拽进自己的思考空间里。

物理隐喻会改变心理状态。点一下「高亮」是顺手的事,拖拽会费劲一点点,需要你一点点意愿——而就是那一点点意愿,筛掉了大量「好像重要但跟我没关系」的文字。

卡片上只有两样东西:「原文摘录」和「我的思考」。摘录是原材料,你的思考才是主菜。

每张卡片会自动保存——输入失焦即落库,删卡会同时清理定时器和待保存内容。保留这些细节,帮你积累起来「靠得住」的感觉。

AI 陪你深读

每张卡片下方有三个按钮:释义、反驳、联想。

这三个不是随便起的名字。它们的 prompt 设计是有心的——AI 收到的不只是那段摘录,还包括:书名、作者、你的阅读意图、以及你在卡片上写下的思考。

也就是说,AI 不是在帮你「看懂这段话」,是在回应你此时此刻的困惑。

如果你在看《乌合之众》,划了「群体中的个人会丧失独立思考能力」这句话,你的批注是「为什么有人能在群体里保持独立思考?」——点「释义」,AI 会说这段话在勒庞理论中的位置,以及他实际上在哪些章节做了例外讨论;点「反驳」,AI 会挑战这句话的适用范围:实验室条件下的群体效应和日常集体决策是两回事。

这就是我想要的「深读陪练」,在我的困惑点上继续往下挖,而不是给标准答案。

三个模式的系统指令我都写得很克制:字数限制 120-200 字,开门见山,不要过渡语,不要总结尾缀。AI 说太多就变成灌输,说太少不够锋利。

让 AI 推动我思考,而非取代我思考。

读到 95%,回头看

读到 95% 的时候,深读会提示你可以打开「回顾」。

打开是一个页面:最上面是你当初写下的阅读意图,中间是沿途摘录的卡片预览,下面是一个输入框——「你的最终收获是什么?」

写下来,这本书才真正「读完」。进度条走完只是时间到了,思考闭环才是读完了。

保存回顾后,书会从书桌的「正在阅读」移到「知识沉淀」堆叠里。画面上是一摞书叠在一起——视觉上告诉你,这些是读完了。

说几个踩过的坑

这个项目是 Codex 协助我完成的,彻底重构改写了之前 Gemini 的代码。我明确产品方向和设计约束,Codex 执行代码、跑验证。

中间踩的坑,挑两个说说。

第一个坑:epub.js 连续滚动的章节边界闪烁。 epub.js 的 continuous manager 为了内存管理,会在滚动时销毁离屏 iframe。问题是,当你往回滚,原先的章节变成了空白——闪一下才重新渲染。我试了很多方案,最后的选择是:patch 掉 createView / trim / erase / destroy 四个函数,扩大预加载窗口,保留离屏 iframe 不销毁。代价是内存占用大一些。但桌面本地阅读,内存不是问题,阅读流畅才是。

第二个坑:搜索高亮的生命周期。 用户在正文搜索关键词 → 点击结果跳转到对应位置 → 关键词高亮。听起来简单。但 epub.js 的 content hook 在跳转时会先清掉旧 iframe、加载新的,而高亮是在 content hook 中应用的——两个时机不同步。有时候跳过去了,高亮没上去。有时候高亮留在原来页面上,关不掉。修了好几个版本:先无条件扫所有 iframe 清高亮,再在 display 完成后用微任务延迟给所有可达 iframe 打高亮,最后在程序化跳转时临时恢复原始的 createView / trim / erase,跳完再重新 stabilize。

做给自己玩的,跟开源出来给别人用的,很不一样,会让自己更加认真维护起来。

数据都在你自己的机器上

DeepRead 没有账号系统,没有云端同步。EPUB 文件、阅读位置、卡片、AI 回应,全部存在浏览器的 IndexedDB 里。AI API Key 存在项目根目录的 .env.local,不上传任何地方。

我选这个方案不是因为偷懒——是想清楚了一个原则:你读的书、你写的思考,应该在你自己的硬盘上。如果需要导出,卡片可以一键导出为 Markdown。

回到开头那个场景。

这里存放的不是书,而是你的时间与智慧。

项目开源在 GitHub:https://github.com/AyingAI/deepread

An image to describe post

欢迎来试试。你只要复制 github 地址给你的 agent,让它帮你安装和运行,很方便。

有任何想法和建议,提 issue、提 PR,都行。

好了,我去看书啦。