logo
Kurashizu Blogwhere ideas flow
  • Home
  • News
  • Blog
  • About
  • Home
  • News
  • Blog
  • About

© 2026 Kurashizu. All rights reserved.

Admin·New Post·Service Status
Powered by Cloudflare·05.11.26
← Back to news

Kobo can run apps now

Original article
bandarlabs.github.io|630 points|200 comments|by thepoet|Aug 21, 2026

Kobo Now Supports Applications

Cobalt is a comprehensive, open-source ecosystem designed to bring application functionality to Kobo e-readers. It consists of a dedicated launcher, a verified App Store, a Rust-based SDK, and a secure runtime environment that isolates every application within its own unprivileged process.

Once installed, the management of apps—including installation, updates, and removal—is handled directly on the device via Wi-Fi.

Kobo Clara BW running Cobalt

Disclaimer: This project is not affiliated with Rakuten Kobo.


🛠️ Technical Architecture

Every application is deployed as a static ARM binary. To ensure system stability and security, these binaries run as unprivileged processes on the device's stock hardware.

Security & Distribution

The App Store manages the lifecycle of these binaries over Wi-Fi. Before any application is permitted to launch, the system performs a strict signature verification.

The verification logic can be represented as: Launch  ⟺  (Binary∈Catalog)∧(Signature=Valid)\text{Launch} \iff (\text{Binary} \in \text{Catalog}) \land (\text{Signature} = \text{Valid})Launch⟺(Binary∈Catalog)∧(Signature=Valid)


📱 The App Ecosystem

The platform distinguishes between "Platform" apps (shipped with the install) and "Store" apps (versioned independently).

ApplicationPrimary Function
LauncherThe main hub; opens apps and provides a path back to the stock Kobo UI.
App StoreHandles the Wi-Fi installation, updating, and removal of signed packages.
arXivRenders HTML from arXiv (post-Dec 2023) including LaTeX\text{\LaTeX}LATE​X math and tables.
SidekickA remote interface for coding agents (e.g., Claude Code) with touch-input answers.
SudokuA Store-exclusive app used to verify the USB-independent delivery system.
MorseCommunicates via the front-light, flashing messages across the panel.
Audiobook StudioA full suite for researching, writing, narrating, and playing audiobooks.
GutenbirdAn OPDS client for Project Gutenberg, Standard Ebooks, and Open Library.
Hacker NewsAccesses Top, New, Ask, and Show threads with full comment support.
FeedsA clean RSS reader that strips site layouts for better e-ink reading.
Daily BriefBackground aggregator that collects news while other apps are active.
AI Command CenterConverts AI-generated answers into a touch-optimized reading format.
TerminalA native shell implementation with immediate-input keys.
ComponentsA showcase of the UI toolkit's typography, layouts, and states.
SettingsManages hardware, connectivity, and platform-level updates.
TodoA persistent task list with touch entry and completion toggles.
Tic-tac-toeLocal multiplayer game utilizing partial e-ink refreshes.
MagnetA utility to detect and report changes from the bezel's hall sensor.

💻 Developer Guide

Developers implement the KoboApp trait to define their application. The runtime manages the heavy lifting: layout, e-ink refresh cycles, navigation, and the app lifecycle.

Capabilities & Constraints

Access to the following is capability-gated:

  • Network →\rightarrow→ Storage →\rightarrow→ Audio →\rightarrow→ Frontlight →\rightarrow→ Wi-Fi

If a request is denied, the runtime returns a value that the app must handle gracefully.

Development Workflow

Example Implementation

To get started, use the CLI: kobo new my-app →\rightarrow→ cd my-app →\rightarrow→ kobo dev

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);
}

🚀 Installation & Deployment

Setup Checklist

  • Clone the repository: git clone https://github.com/BandarLabs/Cobalt.git
  • Enter directory: cd Cobalt
  • Add ARM target: rustup target add armv7-unknown-linux-musleabihf
  • Execute setup: cargo run -p kobo-cli -- setup
  • Restart device and launch Cobalt from the menu.

Detailed recovery steps are available in docs/INSTALL.md.

Publishing Apps

  1. Add the app as a workspace package in apps/app-id/.
  2. Register the app in apps/catalog.json.
  3. Implement unit and layout tests; verify in browser/runtime simulators.
  4. Merge the PR →\rightarrow→ the automated workflow signs and publishes the app.

⚠️ Safety and Compatibility

Install on any Kobo model →\rightarrow→ Only install on models with a reviewed, hardware-tested profile.

  • Hardware Safety: Device writes are restricted to exact hardware/firmware matches. A reboot will always return the device to the stock reader state.
  • Risk: The initial installation modifies the user storage partition and is provided without warranty.
  • Updates: The Cobalt platform updates via Settings on a separate channel from the App Store. All transactions are recovery-safe; interrupted updates will not brick the device.