在微信读书上,一口气刷了两章。停下来的时候发现:刚才看了什么?一个字没记住。
微信读书的「想法」功能打开,满屏划线像弹幕,把书拆成了碎渣。Kindle 用了五六年,划了 500 多条线。一条都没回看过。
所有阅读产品都在比谁读得多、读得快,却没有人在意一件事:你读完了,究竟留下了什么。
而我想要的很简单————读完一本,能带走其中的判断和行动线索,不是500 条划线,是一个我能回头看的深思。
—
最早,我使用 Google AI Studio 开了 DeepRead (深读)项目,完成了框架,但在实际处理 epub 格式的阅读上,一直遇到问题无法解决。
最近,我用 Codex 重拾这个项目,没想到很快就做出来我想要的样子。
DeepRead 开源出来,如果你喜欢阅读,或许能帮你读得更慢更深。这是一个本地的 epub 阅读器,启动后在网页上可以阅读。为了内置 AI 辅助你更好阅读,你可以打开设置,配置上你的 API Key,立即就能使用。尽管放心使用,所以信息都是保存在你电脑本地,不会泄露。
穿过黑夜,进入书桌

深读打开,不是一排排书本,是黑夜里的一个灯火通明的小屋。
构思 DeepRead 之前,进入我脑海,就是这么一个具体的画面。我在深夜的温暖灯光下,坐在书桌前翻阅手中的书页。这样的氛围下,整个人很专注,有一种沉浸在书中的感觉。
深读,就是从此刻开始。
DeepRead 启动画面是深邃的暗蓝渐变,远处是建筑剪影,近处有一栋楼。楼上大部分窗户是暗的,只有一扇亮着暖橘色的光。星星在呼吸——30 颗随机分布的光点,每一颗有自己独立的闪烁节奏。
你的视线会集中在那扇亮着的窗户,点了窗户之后,整个画面向你涌来,你穿过窗口,缓缓进入书桌。
一段 1.6 秒的过渡动画,就是启动阅读的小小仪式感。
为什么要做这个?
因为我发现一个问题:当我们打开阅读 app 时,一进去就是书单,点开就是正文。整个过程太快了,快到大脑还没从「刷信息」切换到「想问题」,就已经开始看字了。
数字阅读丢掉了这个「沉浸」的动作。
你在微信刷一篇公众号文章,和在书桌前翻开一本纸质书的身体感受,是不一样的。不同的心理姿势,决定了完全不同的阅读状态。
那个黑夜里的亮窗,是一个心理开关。点下去,意味着「我现在要安静下来,认真读一本需要想的东西了」。
此处还藏着小小私心。城市夜景的隐喻我特别喜欢——深夜里的一扇窗,意味着里面有人还没睡,在看书,在想事情。你这时没有刷手机。你在做一件安静但重要的事。
那段星星呼吸动画,也是花了点时间调参数。每个光点的大小 1-3px 随机,闪烁周期 3-5 秒,延迟 0-3 秒,让它不是整齐划一地闪,而是有自然星空那种不规则感。标题「深读」两个字用了 2 秒的渐入,刻意慢了半拍——让你在页面上先看见星空,再看见字。
入口最下面那行小字,记录着:这里存放的不是书,而是你的时间与智慧。
打开书之前,先回答一个问题

每次进入读一本新书时,DeepRead 会拦住你,弹出一行字:
今天,你为了什么翻开这本书?
一个输入框,一行提示,一条会随输入延展的深色动画线。写完按 Enter,进入阅读。
这个交互看起来极其简单。但它是我最坚持的设计。
你带着一个目标进入阅读,行为会完全不同——你会主动搜索答案,而不是被动接收文字。
同一本《工作、消费主义和新穷人》,如果你写的是「996 到底是不是自愿的」,你会注意到作者的工作伦理论述;如果你写的是「消费社会怎么把我变成消费者」,你会注意到那些被营销包装成「选择」的陷阱。
同一个文本,不同的入口,走出完全不同的路。
这也是阅读开始仪式的一部分,有效减少自己稀里糊涂地翻开一本书。一开始填写了,随着阅读过程进程而变化了,这个目标还可以修改,伴随你阅读而让目标生长起来。
当然,DeepRead 并不适合所有类型的书,起码你刷刷小说是用不上的,反而是当你需要深度阅读时才需要它。
划完线,拖入你的卡片

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

欢迎来试试。你只要复制 github 地址给你的 agent,让它帮你安装和运行,很方便。
有任何想法和建议,提 issue、提 PR,都行。
好了,我去看书啦。