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.
Click any preview to view it at full size.
Native layers |
Eraser controls |
Custom covers |
Page and notebook tools |
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.
- 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.
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.
| 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.
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.
Requirements: Docker, Python 3, objdump, and matching user-extracted
firmware libraries.
git clone --recurse-submodules https://github.com/MRoiban/KoboNotebookPlus.git
cd KoboNotebookPlusPlace 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.pyBuild 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 koborootDownload 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.
- Back up
/mnt/onboard/.kobo/KoboReader.sqlite,Kobo eReader.conf, and your notebooks. - Copy
KoboRoot.tgzto/mnt/onboard/.kobo/over USB. - Eject the device; Nickel installs the package and reboots.
If Nickel crash-loops or notebooks misbehave after install:
- Remove the plugin: connect over USB (or telnet, if enabled) and delete the
plugin
.sofrom 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.
- 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
GestureRecognizerinterface and register with the samePassiveInputRouter; seenotes/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 1754instead of2480 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 namedNotebookName-ddMMyyyy; range exports add-pSTART-pEND, for exampleLeather-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.
mods/custom-notebook-templates/ Plugin source and NickelTC Makefile
scripts/ ABI and artifact verification tools
third_party/NickelHook/ Upstream NickelHook submodule
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.