Skip to content

Repository files navigation

KoboNotebookPlus

Native layers, custom paper templates, writable covers, notebook sleep screens, page tools, and a configurable eraser for Kobo Advanced Notebooks.

KoboNotebookPlus is a NickelHook plugin that extends the stock Advanced Notebook experience on the Kobo Elipsa 2E. Instead of overlaying a separate app, it hooks the native notebook UI and the MyScript ink engine directly, so layers, previews, and erasing all behave like built-in features.

On-device previews

Click any preview to view it at full size.

Native Layers popup on a Kobo Elipsa 2E
Native layers
Brush and object eraser controls with five eraser sizes
Eraser controls
Custom notebook cover picker on a Kobo Elipsa 2E
Custom covers
Notebook menu with layers and page operations
Page and notebook tools
Kobo notebook library showing a custom checkerboard cover
Custom covers in the notebook library

Caution

This plugin calls private Kobo and MyScript C++ APIs by firmware address. It is tested only on a Kobo Elipsa 2E (condor) running firmware 4.38.23697. A mismatched build can crash Nickel, corrupt notebooks, cause data loss, or force a factory reset. Back up your Kobo database, settings, and notebooks first, and test only with disposable notebooks. See Recovery before installing anything.

Features

  • Layers — a native-style Layers popup below the notebook toolbar: add, select, and delete real MyScript document layers, with per-layer preview thumbnails and independent pen/eraser routing per layer.
  • Eraser controls — brush and object eraser modes plus a five-step eraser-size row; the hardware (stylus) eraser follows the configured size.
  • Three-finger notebook gestures — glide three fingers left to undo, or right to redo. The reusable passive-input router never consumes Kobo's touch events, and it queues custom actions until the current Kobo event finishes dispatching.
  • Custom paper templates — drop in your own full-page PNG templates.
  • Writable covers — custom notebook covers you can write on as a first page.
  • Notebook sleep screens — when sleep or power-off starts from a visible Advanced Notebook, show either its cover (page zero) or its current page, including the active built-in or custom paper template; books and every non-notebook view retain Kobo's stock cover behavior.
  • Page operations — duplicate pages, move them one step, or insert the current page at an exact page number.
  • Clean library — plugin support images stay out of Home/My Books without touching the Kobo database.

Status

Experimental alpha. The current release has passed host-side ABI, relocation, packaging, ARM disassembly, and on-device feature verification. It is still firmware-specific software built on private APIs, not a stable or portable Kobo extension.

Compatibility

Item Supported target
Device Kobo Elipsa 2E (condor)
Firmware 4.38.23697
Qt 5.2.1
Compiler NickelTC GCC 4.9.4, ARM hard-float

Every private symbol, vtable slot, instruction sequence, and hook relocation used by the current build is pinned by the verification scripts in scripts/. Supporting a different firmware requires a fresh binary audit — changing only the version check is unsafe.

Release package and source

The source repository contains no firmware images, Binary Ninja databases, device backups, notebooks, or generated build products. Firmware-pinned alpha releases provide a checksum file and a complete KoboRoot.tgz containing the ARM plugin, exact stock libiinknote.so, and pinned Best/Fast exporter payload required by the supported firmware. Source builders can instead supply their own matching firmware files using the process below.

Building

Requirements: Docker, Python 3, objdump, and matching user-extracted firmware libraries.

git clone --recurse-submodules https://github.com/MRoiban/KoboNotebookPlus.git
cd KoboNotebookPlus

Place the firmware libraries at:

extracted/rootfs/usr/local/Kobo/libiink.so
extracted/rootfs/usr/local/Kobo/libiinknote.so
extracted/rootfs/usr/local/Kobo/libnickel.so.1.0.0
extracted/rootfs/usr/local/Kobo/libiinkuiref.so.1.0.0
extracted/rootfs/usr/local/Kobo/iink
mods/custom-notebook-templates/package/libiinknote.so

Expected stock libiinknote.so SHA-256 for the supported firmware:

f80a7de7a1c482173a89b18f2bb8164fcfb53b8fab9b2a75bd23998813a528ea

Expected stock iink SHA-256:

98bb2032f47f75bd1c3796f3cda2f016edc43a57435007035d6b5b8657dd7bb1

The build generates size-preserving iink-export-best and iink-export-fast executables only after every pinned patch-byte precondition matches that stock image.

Run the ABI gates before every build:

python3 scripts/verify-layer-abi.py
python3 scripts/verify-layer-preview-abi.py
python3 scripts/test-verify-layer-artifacts.py

Build only with NickelTC, keeping clean and compile steps sequential:

docker run --rm -v "$PWD:/work" -w /work \
  ghcr.io/pgaskin/nickeltc:1 \
  make -C mods/custom-notebook-templates clean

docker run --rm -v "$PWD:/work" -w /work \
  ghcr.io/pgaskin/nickeltc:1 \
  make -C mods/custom-notebook-templates -j2

docker run --rm -v "$PWD:/work" -w /work \
  ghcr.io/pgaskin/nickeltc:1 \
  make -C mods/custom-notebook-templates koboroot

Installing

Download KoboRoot.tgz and its adjacent .sha256 file from the matching GitHub release. Verify the checksum before installing. Never install a package built for a different device or firmware. Source builders should also inspect the archive and confirm it contains the compiled ARM plugin, exact stock library, two pinned exporter variants, and their launcher.

  1. Back up /mnt/onboard/.kobo/KoboReader.sqlite, Kobo eReader.conf, and your notebooks.
  2. Copy KoboRoot.tgz to /mnt/onboard/.kobo/ over USB.
  3. Eject the device; Nickel installs the package and reboots.

Recovery

If Nickel crash-loops or notebooks misbehave after install:

  • Remove the plugin: connect over USB (or telnet, if enabled) and delete the plugin .so from the NickelHook plugin directory, then reboot.
  • If the device will not boot to USB, a factory reset recovers it — this is why backups and disposable notebooks are non-negotiable.

Usage

  • Templates — copy a full-size (1404 x 1872) paper PNG to /mnt/onboard/.kobo/iink/custom-notebook-templates/templates/Example.png.
  • Covers — copy a full-size cover PNG to /mnt/onboard/.kobo/iink/custom-notebook-templates/covers/Example.png.
  • Restart the Kobo after changing templates or covers.
  • Inside an Advanced Notebook, the notebook menu gains Covers, Layers, and page operations. Move page to… reuses the Export range page picker; the current page is inserted at the selected number and the displaced pages shift by one. The eraser popup shows the stock mode choices plus the size row.
  • In an Advanced Notebook, place three fingers together and glide at least roughly one eighth of the short screen dimension: left performs Undo and right performs Redo. No one-finger, two-finger, vertical, or held-input custom gestures are registered.
  • Additional touch gestures can implement the Qt-independent GestureRecognizer interface and register with the same PassiveInputRouter; see notes/PASSIVE_INPUT.md. Custom recognition can resolve its own conflicts, but it cannot cancel or replace a stock Kobo gesture.
  • In both normal and Advanced Notebooks, opening export first asks for Fast or Best quality. The normal export menu then opens with Export this page, Export full notebook, and Export range. Fast renders PDF pages at 1240 x 1754 instead of 2480 x 3508; Best preserves Kobo's stock resolution. Export range then asks for the start and end page as usual. Exports to visible onboard storage are named NotebookName-ddMMyyyy; range exports add -pSTART-pEND, for example Leather-26072026-p49-p66.pdf. A repeated same-day export adds -2, -3, and so on instead of overwriting an earlier file. Google Drive and Dropbox exports retain Kobo's provider-managed filename so their upload transaction receives the completed PDF instead of an empty placeholder.
  • Under Settings → Energy saving and privacy, enable Show notebook on sleep, then choose Cover or Current page under Notebook sleep image. The selector is disabled until the toggle is enabled. Rendering failure or a busy/hidden notebook falls back to Kobo's normal book cover.

All plugin support files live below .kobo/iink/custom-notebook-templates/, a notebook-related tree which Nickel excludes before plugins load. Existing .kobo/custom/ installations are migrated automatically. Layer metadata and preview caches live in its layers/ directory; native ink stays inside the .nebo document. Backups created by cover, page, and layer operations use the .nebo.backup extension so Nickel does not import them as duplicate notebooks. The pinned sleep-page cache lives separately in notebook-sleep/ and is never scanned as a paper template.

Repository layout

mods/custom-notebook-templates/  Plugin source and NickelTC Makefile
scripts/                         ABI and artifact verification tools
third_party/NickelHook/          Upstream NickelHook submodule

Credits and legal

KoboNotebookPlus is not affiliated with or endorsed by Rakuten Kobo or MyScript. Kobo and related marks belong to their respective owners.

NickelHook by Patrick Gaskin is included as a separate MIT-licensed submodule.

License: this project does not yet have a license. All rights reserved — public visibility does not grant permission to redistribute or reuse the source. No cover or template artwork is included because its publication license has not been established.

About

Native layers, custom paper templates, writable covers, and eraser controls for Kobo Advanced Notebooks — NickelHook plugin for the Elipsa 2E

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages