Properties2
TypeProject
Note createdMay 20, 2026

After a month away from reading I found my Kobo Libra Colour booted into stock Nickel with a NickelMenu “Generator error”:

kfmon: error checking ‘/tmp/kfmon-ipc.ctl’: stat: No such file or directory (src/generator_c.c:93)

Background firmware update during idle had wiped KFMon’s hook out of /etc/init.d/on-animator.sh, so the daemon never started → no IPC socket → NickelMenu couldn’t enumerate KFMon launchers → KOReader unreachable. Fixed the immediate problem, then hardened so this can’t sneak back.

Hotfix

KFMon ships an OCP-KFMon-*.zip whose .kobo/KoboRoot.tgz is what restores the init hook. Latest is v1.4.6-179-ge000d65 (same version that was already installed — only the rootfs-side install was lost).

# Copy the package's KoboRoot.tgz into .kobo/, eject, let Nickel run "Updating..."
cp KoboRoot.tgz /Volumes/KOBOeReader/.kobo/

Requires battery >25% or Nickel refuses the install.

Backups (before any other change)

Full snapshot at ~/Backups/Kobo/2026-05-20-pre-koreader-first/:

LayerWhatHow
FAT mirrorbooks, KOReader settings, statistics DB, sidecars, patches, KoboReader.sqlitersync over USBMS
FAT tarballsame as above, single filetar -czf
Rootfs/etc/init.d/on-animator.sh (patched), /usr/local/kfmon/, /etc/hosts, /etc/wpa_supplicant/tar piped over SSH
Stock firmwarekobo-update-4.45.23684.zip from pgaskin’s mirrordirect download

DB sanity check via sqlite3 confirmed page_stat, book, content, Bookmark tables intact and queryable.

Hardening

Anti-fragility against the failure mode that started this. Two pieces:

/etc/hosts OTA block

Redirects firmware-update endpoints to localhost. Active block:

127.0.0.1 redirect.kobobooks.com
127.0.0.1 ereaderfiles.kobo.com

Backup of the pristine /etc/hosts lives at /etc/hosts.bak. Toggleable via NickelMenu (below).

NickelMenu hardening entries

Config file .adds/nm/hardening:

menu_item :main :Block OTA firmware updates  :cmd_output :2000 :/bin/sh /mnt/onboard/.adds/scripts/block-ota.sh
menu_item :main :Allow OTA (restore hosts)    :cmd_output :2000 :/bin/sh /mnt/onboard/.adds/scripts/unblock-ota.sh
menu_item :main :OTA block status             :cmd_output :2000 :/bin/sh /mnt/onboard/.adds/scripts/ota-status.sh
menu_item :main :Reinstall KFMon (then reboot):cmd_output :5000 :/bin/sh /mnt/onboard/.adds/scripts/reinstall-kfmon.sh

Scripts live in .adds/scripts/. The “Reinstall KFMon” entry copies a staged KoboRoot.tgz from .adds/kfmon-recovery/ into .kobo/ and reboots — one-tap recovery for the original failure mode.

KOReader UX upgrades

  • ProjectTitle (v2026.03-v3.7) — replaces the bundled CoverBrowser with a polished cover-grid home + “currently reading” hero widget. Requires disabling the built-in Cover Browser plugin first; ProjectTitle registers under the same coverbrowser slot.
  • OPDS Plus — community OPDS browser with cover thumbnails and caching. Point it at Calibre’s content server / Standard Ebooks / Gutenberg.

Both installed via tar piped over SSH (no rsync on the device).

Why not go full Nickel-less

Researched it. Blocked by mt8113t-specific issues:

  • Standby is broken on this SoC outside Nickel: 2–3 %/hr drain — kernel rejects /sys/power/state writes from KOReader (koreader#13986).
  • Touch input lags above ~3 taps/sec (#12867).
  • No documented unbrick path for MediaTek Kobos (the older NXP iMX uuu workflow doesn’t apply).
  • No reports of g_ether USB networking working on this hardware.

Net: keep Nickel as the boot environment, use NickelMenu/KFMon to jump straight into KOReader. Effectively one tap from boot.

Recovery cheat-sheet

FailureRecovery
Future firmware update wipes KFMon againTap “Reinstall KFMon” in NickelMenu
OTA block needs to come offTap “Allow OTA” in NickelMenu (restores from /etc/hosts.bak)
Lost book / borked KOReader settingsrsync from ~/Backups/Kobo/2026-05-20-pre-koreader-first/KOBOeReader/
Nickel corrupted / won’t bootCopy stock-firmware/kobo-update-4.45.23684.zip contents into .kobo/ over USB
Hard brickNo known recovery path on mt8113t — warranty channel only