Skip to content

Releases: dkuester/NickelReadingStats

NickelReadingStats v0.3.0

Choose a tag to compare

@github-actions github-actions released this 22 Oct 09:06
12746ee

Chapter bars and time-left estimates now also work for books bought in a
Tolino store. This is also the first release built and published by CI on
GitHub.

Deutsch, kurz: Kapitelbalken und Restzeit-Schätzung funktionieren jetzt auch für Bücher aus einem Tolino-Shop (ohne Kopierschutz). Das Projekt ist von Codeberg nach GitHub umgezogen, und Releases werden ab jetzt automatisch gebaut. Installation wie bisher: Kobo.tgz nach .kobo/ kopieren und neu starten.

New

  • Tolino store books: chapter bars and the "time left" estimate now also
    work for books bought in a Tolino store. On a Tolino these are regular EPUBs
    stored under .kobo/kepub/, which the mod did not pick up before. Activity
    (reading time, sessions, pages per minute) was already recorded for them.
  • Encrypted (DRM) books are skipped deliberately: their chapters cannot be
    read without bypassing the DRM, which the mod does not do. They keep
    Activity data but show no chapter bars. Watermarked store books are not
    encrypted and are fully supported.

Compatibility

  • Kobo firmware 5.18 and 6.0: the firmware check (symbols, calling
    conventions, class layout, offsets) passes for Kobo 5.18.270971 and
    6.0.276679. The mod has not been tested on a Kobo device yet; feedback is
    welcome.
  • Tolino firmware 5.18 remains the tested platform (5.18.264769).

Project

  • Moved to GitHub: the repository is now
    dkuester/NickelReadingStats.
    The Codeberg repository is archived.
  • Releases are built by CI: Kobo.tgz is cross-built from the tagged
    commit and published with SHA256SUMS.
  • New README with screenshots, feature and compatibility tables. The
    technical details are in docs/ARCHITECTURE.md
    and docs/DEVELOPMENT.md.
  • The "time left" estimate is no longer listed as a known limitation; it has
    been accurate since v0.2.0.

Tested

On a Tolino with firmware 5.18.264769:

  • Store book without DRM: chapter bars, read chapters highlighted and "time
    left" estimate work.
  • Sideloaded EPUBs and Activity work as in v0.2.1.

Host tests (Qt 5 and Qt 6) and the ARM build run in CI. The firmware checks
against Tolino 5.18, Kobo 5.18 and Kobo 6.0 pass (run locally; the firmware
files are not part of the repository).

Known limitations

  • Encrypted (DRM) books show no chapter bars or "time left" estimate.
  • A book made of a single large HTML file shows a single chapter bar.
  • Kobo devices have not been tested on a device yet.
  • Firmware 5.18+ (Qt 6) only; firmware 4.x is not supported.

Install

  1. Download Kobo.tgz from the assets below (checksums in SHA256SUMS).
  2. Copy it to .kobo/ on the device.
  3. Eject; the device installs the update on the next start. If it does not
    restart by itself, restart it.

Updating from an earlier version needs no uninstall. To uninstall, place an
empty file readingstats_uninstall in the device root and restart.

Reverse-engineered with AI assistance; full credits and attribution are in
the README. Licensed under MIT.

NickelReadingStats v0.2.1

Choose a tag to compare

@dkuester dkuester released this 21 Oct 12:03

Privacy hotfix. Everyone on v0.2.0 or v0.1.0 should update.

Deutsch, kurz: In v0.1.0 und v0.2.0 lief auf dem Tolino Kobos Google-Analytics-Erfassung mit. Lese-Ereignisse wie Buch öffnen und schließen, die Buch-ID, Akkustand und Schriftart wurden in .kobo/Kobo/Analytics.conf gesammelt und bei WLAN an Google übertragen. v0.2.1 legt das vollständig still und löscht noch nicht übertragene Einträge beim nächsten Start. Bereits übertragene Daten lassen sich nicht zurückholen. Installation wie bisher: Kobo.tgz nach .kobo/ kopieren und neu starten.

What was wrong

To record reading sessions and page turns on a Tolino, the mod has to let Kobo's EventEngine initialise. That also creates Kobo's Google Analytics client. v0.2.0 already dropped the events that go through Nickel's own analytics table, but the Google Analytics client has its own queue (.kobo/Kobo/Analytics.conf) and sends it to ssl.google-analytics.com. On a test Tolino the queue held 52 entries, including opening and closing books with a book ID, battery level and font settings. A stock Tolino never creates this client.

Fixes

  • Google Analytics silenced on Tolino: no new entries, nothing uploaded. The stored queue is not loaded at startup, so the next save empties it. On a Kobo nothing changes.
  • Narrower Kobo mode: isTolino() now answers "not Tolino" only to the five Kobo reading-life functions that need it, recognised by the calling address. Everything they call further down sees the real device, for example the store affiliation (Thalia vs. Kobo). This closes the remaining risk behind the tester report in which a Tolino showed Kobo menus and lost its Thalia account (mainly fixed in v0.2.0).

Tested

On a Tolino with firmware 5.18.264769:

  • The Google Analytics queue went from 52 to 0 with Wi-Fi off (cleared, not sent) and stays empty with Wi-Fi on and a sync.
  • The per-book stats page, Activity (hours, minutes per session, pages per minute) and page counting work.
  • The Thalia account, sync and book downloads work; no Kobo menus.

Built against Qt 6.5.2. Host tests and the firmware symbol/ABI checks pass, including new checks for the functions that are allowed to see "not Tolino".

Known limitations

Unchanged from v0.2.0:

  • The "time remaining" estimate can read too low until the reading speed has been learned.
  • Fixed-layout content and image-only books are excluded.
  • Firmware 5.18+ (Qt 6) only. Kobo devices on 5.x are expected to work but have not been verified yet.

Install

  1. Download Kobo.tgz from the assets below.
  2. Copy it to .kobo/ on the device.
  3. Eject and restart.

To uninstall, place an empty file readingstats_uninstall in the device root and restart.

SHA-256 of Kobo.tgz:
c896532b743bf7d2c194cf53f6c7ac498583e4daabc7727f46be16ab18d505f4

Notes

Reverse-engineered with AI assistance; full credits and attribution are in the README. Licensed under MIT.


Originally released on Codeberg on 2026-10-21.

NickelReadingStats v0.2.0

Choose a tag to compare

@dkuester dkuester released this 21 Oct 12:03

⚠️ Superseded by v0.2.1. Please update (privacy). v0.2.0 still let Kobo's Google Analytics run on Tolino, which collected reading events such as opening and closing books with a book ID and uploaded them to Google when Wi-Fi was on. v0.2.1 silences it and deletes entries that have not been sent yet.

Deutsch: Bitte auf v0.2.1 aktualisieren (Datenschutz). In v0.2.0 lief auf dem Tolino noch Kobos Google-Analytics-Erfassung mit; v0.2.1 legt sie still.


Bugfix and privacy release. Everyone on v0.1.0 should update.

Deutsch, kurz: v0.1.0 konnte auf dem Tolino Teile des Systems in den Kobo-Modus versetzen (Kobo-Menüs, Thalia-Konto/Sync weg) und hat Nutzungsdaten wie Buchtitel und Lesezeit an Analytics übertragen. Beides ist in v0.2.0 behoben. Installation wie bisher: Kobo.tgz nach .kobo/ kopieren und neu starten; die alte Version muss vorher nicht entfernt werden.

Fixes

  • Tolino partly turning into a Kobo (Kobo menus, Thalia account and sync missing). v0.1.0 lifted the isTolino() gate globally, for all threads, while the reading-life code ran (for example at boot), so other parts of Nickel could set themselves up as Kobo. The override now applies only to the calling thread, for the duration of those calls.
  • Analytics upload caused by the mod. With v0.1.0 Nickel queued analytics events for sideloaded books, including title, author, ISBN and reading time, and uploaded them on the next sync. A stock Tolino queues none. All analytics events are now dropped on a Tolino; on a Kobo nothing changes. The reading-life data behind the stats is stored on the device and is not affected.
  • Wrong session length passed on. EventEngine::endReadingSession() returns the session length in seconds but was declared bool.
  • Chapter bars shifted when an EPUB had a missing spine file or percent-encoded file names (Chapter%201.xhtml).
  • Stats offered for the wrong books. The per-book stats now follow Nickel's own rules for kepubs, applied to plain EPUBs: no fixed-layout, no image-only books, same accessibility check. Whether a book's stats page is shown is left to Nickel again, so it no longer appears on an empty or misaligned word-count list.
  • Parental control. The Activity entry is hidden if its guards cannot be checked, instead of being shown.

Improvements

  • Word counting runs in the background (no UI freeze when opening large books), is cached per file, and caps each file at 8 MB.
  • More accurate word counts: body text only (no chapter titles), comments and scripts ignored, punctuation-only tokens not counted, more space entities, UTF-16 chapters.
  • Every hook is optional: a symbol missing on some firmware build disables only that feature.

Tested

On a Tolino with firmware 5.18.264769:

  • The per-book stats page shows chapter bars with read chapters highlighted.
  • Activity: hours read, minutes per session and pages per minute work.
  • Thalia sync and book downloads work.
  • No Kobo menus appear, and the analytics queue stays empty.

Built against Qt 6.5.2 (strayrose/nickeltc toolchain). Host tests and firmware symbol/ABI checks pass.

Known limitations

  • The "time remaining" estimate can read too low until the reading speed has been learned (unchanged from v0.1.0).
  • Fixed-layout content (fixed-layout EPUBs, PDFs, comics) and image-only books are excluded.
  • Firmware 5.18+ (Qt 6) only. Kobo devices on 5.x are expected to work but have not been verified yet; firmware 4.x is not supported.

Install

  1. Download Kobo.tgz from the assets below.
  2. Copy it to .kobo/ on the device.
  3. Eject and restart.

To uninstall, place an empty file readingstats_uninstall in the device root and restart.

SHA-256 of Kobo.tgz:
f36cb4fc1d5e333189ad96c017c8f06f255434af16428c297704d7a75458ff42

Notes

Reverse-engineered with AI assistance; full credits and attribution are in the README. Licensed under MIT.


Originally released on Codeberg on 2026-10-20.