Kobo Hacks: Extracting Annotations

A lot of the reading I do takes place on my Kobo eReader these days and, while reading yesterday, I came across a line that was eminently quotable. So I highlighted it and created an annotation, which is not something I’ve actually bothered to do in the past.

Then I wondered how I was supposed to get the annotation out if the eReader. Not easily appears to be the answer.

Obviously, a one-line quote could easily be retyped, but I’m too lazy to want to type stuff, which is why I ended up spending most of the evening poking around at the innards of the device.

Plugging in a USB cable and displaying the hidden files and folders reveals that there is a folder called .kobo on the device and, when I go into that folder I find, among other things, these:

  • BookReader.sqlite
  • KoboReader.sqlite

The sqllite suffix tells me that these are SQLite databases, and that looks like a very promising place to start. So I copied both to my PC and started poking around.

BookReader.sqlite, it turns out, isn’t a database — or not one that I can access using the sqlite3 — but KoboReader.sqlite proved to be a lot more promising.

Finding your way around a database when you have no documentation can be a bit of a challenge, but I do know that this:

select distinct b.ShelfName, c.BookTitle, a.Text, a.Annotation, date(a.DateCreated), date(a.DateModified)
from Bookmark a
left outer join ShelfContent b on b.ContentID = a.VolumeID
left outer join content c on c.BookID = a.VolumeID
where date(a.DateCreated) = '2020-09-21';

Returns this:

ReadingList|Radical Uncertainty|And any bar-room conversation, or presidential tweet, will remind you that the degree of confidence with which a proposition is expressed is not the same as the probability that the proposition is true.|Quote of the day|2020-09-21|2020-09-21

Three hours to generate a two sentence blog post probably isn’t a hugely effective use of my time, but I am now wondering what else I can extract from this database…