Cobalt:在Kobo电纸书上运行AI应用的开源平台
Cobalt:在Kobo电子阅读器上运行AI应用
Your Kobo can run apps now.
你的 Kobo 现在可以运行应用了。
Cobalt is an open-source application platform for Kobo e-readers: a launcher, a signed App Store, a Rust SDK, and a runtime that keeps every app in its own unprivileged process.
Cobalt 是一个面向 Kobo 电子阅读器的开源应用平台:它包含一个启动器、一个经过签名的应用商店、一套 Rust SDK,以及一个将每个应用隔离在独立无特权进程中的运行时环境。
Install it once over USB. Every app after that installs, updates and removes on the reader itself, over Wi-Fi. A reboot returns to the stock Kobo reader.
通过 USB 安装一次即可。此后所有应用的安装、更新和卸载均可直接在阅读器上通过 Wi-Fi 完成。重启设备后,系统将恢复为默认的 Kobo 阅读器界面。
Install on your Kobo Read the source
在你的 Kobo 上安装 查看源代码
The launcher on a Kobo Clara BW.
Kobo Clara BW 上的启动器界面。
Not affiliated with Rakuten Kobo
与 Rakuten Kobo 无关
Recorded on-device at 3× speed. Watch as video.
设备端录制,播放速度为 3 倍。以视频形式观看。
Running on a Kobo.
在 Kobo 设备上运行。
Every app is a static ARM binary running as its own unprivileged process on stock hardware. The App Store installs, updates and removes them over Wi-Fi, with signatures verified before anything launches.
每个应用都是静态 ARM 二进制文件,在默认硬件上作为独立的无特权进程运行。应用商店通过 Wi-Fi 进行安装、更新和卸载,并在任何应用启动前验证其签名。
arXiv papers and coding agents, on the panel.
arXiv 论文和编码代理,显示在面板上。
These are photographs of the device, not simulator captures. The arXiv app reads the HTML rendering arXiv publishes for every paper since December 2023: abstracts, sections, math and result tables, paginated for the panel.
这些是设备的实拍照片,而非模拟器截图。arXiv 应用自 2023 年 12 月起读取 arXiv 为每篇论文发布的 HTML 渲染内容:包括摘要、章节、数学公式和结果表格,并按面板分页显示。
A preprint, page 8 of 54, on the panel.
一篇预印本的第 8 页(共 54 页),显示在面板上。
A results table from the same paper.
同一篇论文中的结果表格。
Math notation and a numbered algorithm.
数学符号和带编号的算法。
Sidekick showing a question from Claude Code, with tappable answers.
Sidekick 显示来自 Claude Code 的问题,并提供可点击的答案。
Sidekick paired over the local network, waiting for the next question.
Sidekick 通过局域网配对,等待下一个问题。
Apps
应用
The apps.
应用列表。
Every screenshot below is a capture from a Kobo Clara BW. Store apps version independently of the platform; the rest ship with the platform install.
以下每张截图均来自 Kobo Clara BW。应用商店中的应用版本可与平台版本独立维护;其余应用随平台安装包一同分发。
Launcher
启动器
Opens installed apps and always keeps a route back to the Kobo reader.
打开已安装的应用,并始终保留返回 Kobo 阅读器的路径。
App Store
应用商店
Installs, updates, removes and reinstalls signed apps over Wi-Fi.
通过 Wi-Fi 安装、更新、卸载和重新安装已签名的应用。
arXiv
arXiv
Browses a subject's newest preprints and reads the full text on the panel.
浏览该主题的最新预印本,并在面板上阅读全文。
Sudoku
数独
Store-only by design: installing it proves delivery of an app the USB package never contained.
仅商店设计:安装它证明了交付了一个 USB 包从未包含的应用程序。
Morse
摩斯
Sends a typed message in Morse on the front light, one letter across the whole panel.
在前灯上以摩斯电码发送打字消息,每个字母横跨整个面板。
Audiobook Studio
有声书工作室
Researches, writes, narrates and plays an original audiobook.
研究、撰写、朗读并播放原创有声书。
Gutenbird
古腾堡鸟
Reads any OPDS library: Project Gutenberg, Standard Ebooks, Open Library, or yours.
读取任何 OPDS 图书馆:Project Gutenberg、Standard Ebooks、Open Library 或你自己的。
Hacker News
Hacker News
Top, New, Ask and Show stories with complete comment threads.
带有完整评论线程的热门、新帖、提问和展示故事。
Feeds
订阅源
Discovers a site's feed and presents its articles without the site's layout.
发现网站的订阅源,并以无网站布局的方式呈现其文章。
Daily Brief
每日简报
Collects the day's stories in the background while you use another app.
在你使用其他应用时,在后台收集当天的故事。
AI Command Center
AI 指挥中心
Asks a question and turns the answer into touch-friendly reading.
提出问题并将答案转化为适合触摸阅读的内容。
Sidekick
副驾
Approve or deny requests from coding agents, away from the keyboard.
远离键盘时批准或拒绝来自编码代理的请求。
Terminal
终端
A panel-native shell with keys that send input immediately.
一个面板原生的 shell,按键可立即发送输入。
Components
组件
The UI toolkit's controls, layouts, typography and states, on the panel.
UI 工具包的控件、布局、排版和状态,都在面板上。
Settings
设置
Connectivity, hardware, and platform updates, kept separate from Store.
连接性、硬件和平台更新,与商店分开维护。
Todo
待办事项
A persistent list with touch entry and completed-item states.
具有触摸输入和已完成项状态的持久化列表。
Tic-tac-toe
井字棋
Two players, partial refreshes for individual cells.
双人对战,单个单元格支持局部刷新。
Magnet
磁铁
Locates the hall sensor behind the bezel and reports its changes.
定位边框后的霍尔传感器并报告其状态变化。
The SDK
SDK
An app is one Rust file.
一个应用对应一个 Rust 文件。
Implement KoboApp, describe screens declaratively, and the runtime handles layout, e-ink refresh planning, Back navigation and lifecycle.
实现 KoboApp,以声明式方式描述屏幕,运行时负责布局、电子墨水屏刷新规划、返回导航及生命周期管理。
Apps don't open device resources; they ask. Network, storage, audio, frontlight and Wi-Fi are capability-gated, and a refusal comes back as a value the app can handle.
应用不直接打开设备资源;而是发起请求。网络、存储、音频、前光和 Wi-Fi 均受能力门控限制,拒绝响应将以应用可处理值的形态返回。
E-ink UI
电子墨水屏 UI
Text, tiles, dialogs, keyboards, pagination, partial refresh planning
文本、图块、对话框、键盘、分页、局部刷新规划
Simulators
模拟器
Browser and runtime simulators with layout diagnostics
带有布局诊断功能的浏览器和运行时模拟器
Async work
异步工作
HTTPS, ranged downloads, cancellable tasks, scheduled wakes
HTTPS、范围下载、可取消任务、计划唤醒
State
状态
Atomic per-app keyed storage
按应用键分组的原子存储
Shipping
发布
Signed static ARMv7 binaries, published when an app PR merges
签名的静态 ARMv7 二进制文件,在应用 PR 合并时发布
kobo new my-app
cd my-app
kobo devkobo new my-app
cd my-app
kobo devRead the SDK docs
阅读 SDK 文档
use kobo_sdk::{
ActionId, Context, KoboApp, ScreenBuilder,
};
#[derive(Default)]
struct Hello { taps: u32 }
impl KoboApp for Hello {
fn on_start(&mut self, ctx: &mut Context) {
self.show(ctx);
}
fn on_action(
&mut self, ctx: &mut Context, a: ActionId,
) {
if a == kobo_sdk::action_id("tap") {
self.taps += 1;
}
self.show(ctx);
}
}
impl Hello {
fn show(&self, ctx: &mut Context) {
let screen = ScreenBuilder::new("hello")
.top_bar("Hello")
.heading(format!("{} taps", self.taps))
.button("tap", "Tap me")
.build();
ctx.set_screen(screen);
}
}
fn main() {
let app = Hello::default();
let _ = kobo_sdk::run("hello", app);
}use kobo_sdk::{
ActionId, Context, KoboApp, ScreenBuilder,
};
#[derive(Default)]
struct Hello { taps: u32 }
impl KoboApp for Hello {
fn on_start(&mut self, ctx: &mut Context) {
self.show(ctx);
}
fn on_action(
&mut self, ctx: &mut Context, a: ActionId,
) {
if a == kobo_sdk::action_id("tap") {
self.taps += 1;
}
self.show(ctx);
}
}
impl Hello {
fn show(&self, ctx: &mut Context) {
let screen = ScreenBuilder::new("hello")
.top_bar("Hello")
.heading(format!("{} taps", self.taps))
.button("tap", "Tap me")
.build();
ctx.set_screen(screen);
}
}
fn main() {
let app = Hello::default();
let _ = kobo_sdk::run("hello", app);
}The Store
商店
Signed packages, verified before launch.
签名包,启动前进行验证。
Store reads a signed catalog from a fixed GitHub release. Each package holds one ARM executable and a signed canonical manifest. The runtime verifies the catalog, the package, the installed manifest and the binary before an app runs.
Store 从固定的 GitHub 发行版读取已签名的目录。每个包包含一个 ARM 可执行文件和已签名的规范清单。在应用运行之前,运行时会对目录、包、已安装的清单和二进制文件进行验证。
App releases are independent of platform releases: merging an app PR builds it for ARM, signs it, and updates the catalog. No Cobalt version bump, no reinstall. The app simply appears in Store.
应用的发布独立于平台的发布:合并应用的 PR 会为其构建 ARM 版本、签名并更新目录。无需提升 Cobalt 版本号,也无需重新安装。应用只需出现在 Store 中即可。
The Cobalt platform itself also updates over Wi-Fi, through Settings, on a channel separate from the app catalog. The USB cable is only ever needed once.
Cobalt 平台本身也会通过 Wi-Fi 进行更新,路径为设置(Settings),且与应用的目录分开。USB 线缆仅需使用一次。
Install and catalog transactions are recovery-safe; an interrupted update leaves the reader with the version it had.
安装和目录事务具备恢复安全性;中断的更新会让阅读器保留其原有的版本。
Publish your own app →
发布您自己的应用 →
Sudoku arriving over Wi-Fi.
数独应用正通过 Wi-Fi 送达。
FIG. 1 CLARA BW N365
图 1 CLARA BW N365
Install
安装
Installing from source.
从源代码安装。
- Charge a Kobo Clara BW (N365) and connect it over USB. Other models are refused, not guessed at.
- Run the setup:
- 给 Kobo Clara BW (N365) 充电并通过 USB 连接。其他型号会被拒绝,不会进行猜测适配。
- 运行设置:
git clone https://github.com/BandarLabs/Cobalt.git
cd Cobalt
rustup target add armv7-unknown-linux-musleabihf
cargo run -p kobo-cli -- setupgit clone https://github.com/BandarLabs/Cobalt.git
cd Cobalt
rustup target add armv7-unknown-linux-musleabihf
cargo run -p kobo-cli -- setup- Restart the reader and open Cobalt from Kobo's menu.
- Open Store. Everything from here on arrives over Wi-Fi.
- 重启阅读器并从 Kobo 菜单中打开 Cobalt。
- 打开 Store。从此处开始的一切都将通过 Wi-Fi 送达。
The complete walkthrough, including recovery steps, is in docs/INSTALL.md.
完整的操作指南,包括恢复步骤,位于 docs/INSTALL.md。
Contributing
贡献代码
Contribute an app.
贡献应用。
App contributions are regular pull requests. If it runs on your device and the PR shows it running, it gets merged and published.
应用贡献是常规的拉取请求(PR)。如果它在您的设备上能运行,且 PR 展示了其运行状态,它就会被合并并发布。
- Build it. Add the app as a workspace package under apps/<app-id>/ and register it in apps/catalog.json.
- Test it. Add unit and layout tests, and run it in the browser and runtime simulators.
- Run it on your own device. A real Clara BW, not just the simulator.
- Open a PR with a gif or photos of it running. Once reviewed and merged, the publish workflow signs it and it appears in Store. No platform release needed.
- 构建它。将应用作为 apps/<app-id>/ 下的工作区包添加,并在 apps/catalog.json 中注册它。
- 测试它。添加单元测试和布局测试,并在浏览器和运行时模拟器中运行它。
- 在您自己的设备上运行它。需要真实的 Clara BW,而不仅仅是模拟器。
- 提交一个包含其运行 GIF 或照片的 PR。经过审查和合并后,发布流程会对其进行签名,随后它就会出现在 Store 中。无需平台发布。
Own a different Kobo model? Porting is welcome too; open an issue first so the device profile can be agreed. Full details in docs/CONTRIBUTING_APPS.md.
拥有其他 Kobo 型号?同样欢迎移植;请先提交 issue 以便商定设备配置。详细信息见 docs/CONTRIBUTING_APPS.md。
Safety
安全性
Device support and safety.
设备支持与安全性。
Cobalt does not replace Kobo's boot chain. Device writes are gated on an exact hardware and firmware match, and a reboot returns to the stock reader. The first installation does modify files on the user storage partition, and it is provided without warranty.
Cobalt 不会替换 Kobo 的启动链。设备写入操作受限于严格的硬件和固件匹配条件,重启后会恢复为官方阅读器。首次安装会修改用户存储分区上的文件,且不提供任何保修。
Only the Clara BW profile has been hardware-tested. Don't install on another model until it has a reviewed, hardware-tested profile. Cobalt is an independent project, not affiliated with Rakuten Kobo.
目前仅对 Clara BW 型号进行了硬件测试。在拥有经过审核且通过硬件测试的配置之前,请勿在其他型号上安装。Cobalt 是一个独立项目,与 Rakuten Kobo 无关。
更进一步:量化金融体系
看懂新闻只是起点——沿量化金融路径,把它变成能交付的工程能力