Instead of simply praising KOReader, let me add that it is also incredibly hackable. The vast majority of KOReader is written in Lua, and adding your own feature is usually not that hard. I added support for Kobo natural light a few years ago, and found the code base to be very understandable and nice to work with.