作为一个电子纸(E-Ink/墨水屏)的重度爱好者,我始终坚信:电子纸是桌面AOD(Always-On Display)低频信息展示的最佳方案。它无需耗电即可维持显示,超低功耗;无自发光特性,既不刺眼也不抢夺注意力;而其类纸的质感,作为简洁优雅的桌面摆件再合适不过。

教程
硬件方案选择
目前市面上(淘宝/闲鱼)有不少基于“电子价签+STM32”的DIY方案,但对于大多数电子纸爱好者而言,手中往往都有一台闲置的 Kindle。
我也不例外。正值黑五,陪伴我从高中到硕士的 Kindle Oasis 2 光荣退役。与其让它在抽屉里吃灰,不如将其变废为宝。这款拥有7英寸屏幕且做工精良的设备,自然成了我改造的首选目标。当然,本文介绍的“服务端渲染”方案具有通用性,即使你使用的是STM32等开发平台,相信也能从中获得灵感。
软件方案选择
1. 过去的尝试:自带浏览器方案
几年前,我曾尝试将 Paperwhite 3 改造为副屏,当时参考了 kindle-weather-dashboard 项目。该方案利用 Kindle 自带的“体验版浏览器”展示信息,只需在搜索框输入特定指令(如 ~ds)即可禁用息屏,优势在于无需越狱。
但该方案存在明显的局限性:
- 屏幕利用率低:亚马逊不允许网页全屏显示,顶栏和底栏会浪费宝贵的显示面积。
- 性能瓶颈:Kindle 的浏览器内核老旧,性能羸弱,难以承载复杂的动态渲染(如图表绘制)。
- 开发成本高:当时 ChatGPT 尚未问世,想要定制个性化页面,前端适配的学习成本极高,导致我最终搁置了该计划。
2. 当前的选择:越狱客户端 + 服务端渲染
为了突破上述限制,我确立了新的思路:既然 Kindle 渲染能力弱,那就把渲染任务交给服务端;既然浏览器无法全屏,那就越狱后直接输出图像。
技术实现细节
客户端:FBInk 与 进程博弈
Kindle 原生并不提供直接绘图的接口,好在越狱社区大神 NiLuJe 开发了 FBInk 工具。它不仅能方便地全屏显示图片和文字,还支持控制局部刷新(Partial Refresh)或全局刷新,这对控制墨水屏残影至关重要。
基本思路:Kindle 每隔几分钟从服务端下载一张渲染好的图片,调用 FBInk 显示。但在实现过程中,我踩了两个主要的坑:
-
画面抢占与进程信号(Signal)问题 FBInk 属于底层的强制画面输出,并非覆盖层(Overlay)。这意味着 Kindle 原生系统的 UI 框架(Framework)更新会覆盖掉我们的画面。 直观的解法是执行
stop framework停止系统界面。在 SSH 调试时这很有效,但当我将其封装为 KUAL 插件运行时,脚本却莫名退出了。 经过排查,这是典型的Unix信号连坐机制:KUAL 是 UI Framework 的子进程,我的脚本又是 KUAL 的子进程。脚本杀死了 Framework,导致父进程 KUAL 终止,进而连带着杀死了脚本自己。最终,我编写了一套复杂的逻辑来处理信号免疫和进程守护,才解决了这个问题。 -
时间显示的实时性 从服务端获取图片的频率通常在几分钟一次,但作为副屏,时间的显示需要分钟级的更新。 为了优雅地解决这个问题,我利用 FBInk 完善的局部文字刷新功能:背景大图由服务端定时更新,而左上角的时间区域则由本地脚本每分钟调用 FBInk 进行局部刷新。
服务端:Vibe Coding 加持下的现代化开发
服务端的任务核心在于:获取信息、渲染页面、生成适配墨水屏的灰阶图片。这部分技术栈采用了 Flask + Tailwind CSS + Playwright。得益于当下流行的 Vibe Coding(AI 辅助编程)模式,即使我前端基础薄弱,也能快速构建出美观的界面。
1. Dashboard 页面 (/dashboard)
这个页面参考了我个人的信息获取习惯,包含以下模块:
- 日期时间:包含公历、农历、星期及节假日/调休信息(由AI计算下一个休息日)。
- 天气:不仅有实时温湿度、UV、AQI,还特别加入了未来两小时降雨概率及通勤时段天气预报。
- 新闻:数据源自 Hacker News,这部分通过 AI 进行了标题重写(详见下篇)。
- 金融:通过图表展示汇率、BTC 等资产的价格与波动。
2. 渲染接口 (/render)
Kindle 并不直接访问上述网页,而是请求这个接口。服务端会在后台启动 Playwright 加载 Dashboard,进行截图,并针对电子纸特性进行图像处理(灰阶抖动算法、分辨率缩放),最终返回一张针对 Kindle 屏幕优化的高质量图片。
3. 配置与优化
为了方便开源社区复用,我将语言、地理位置、金融标的等参数抽离到了 .env 配置文件中。
由于 Playwright 渲染消耗资源且耗时较长,建议在部署时(通过 Caddy/Nginx 反代)仅暴露 /render 接口,并配合 Cloudflare 等 CDN 设置缓存规则,缓存 TTL 略低于 Kindle 的请求间隔即可,既保证时效性又能大幅降低服务器压力。
总结
至此,我们已经拥有了一套完整的软硬件方案:一个能适配墨水屏特性的渲染后端,以及一个能完美全屏显示的 Kindle 客户端。通过简单的配置,你就能拥有一个优雅的桌面信息中心。
但你可能要问:副屏有了,标题里的“AI”体现在哪?
别急,在普通的 API 数据之外,如何利用 AI 筛选并重写高价值的新闻内容,才是有趣的灵魂所在。请期待下篇,我将详细介绍我的 AI 新闻服务实现。