Three Lua plugins for KOReader that fetch and merge metadata and covers by ISBN from free sources, show a random quote from your books on startup or resume from suspend, and draw a title and progress badge over each cover.
Lua
0
25 commits
updated Sep 30, 2026
EN · PT
A collection of KOReader plugins that improves how you organize, describe, and discover your books.
The repository bundles three independent plugins, all written in Lua and
installed as .koplugin folders:
| Plugin | Folder | What it does |
|---|---|---|
| Update metadata | atualizarmetadados.koplugin | Fetches metadata and cover by ISBN from several free sources and writes them to the book. |
| Random highlight | destaquealeatorio.koplugin | Shows a random quote from your books when KOReader starts or resumes from suspend. |
| Mosaic shelf | estantemosaico.koplugin | Draws the title and a reading-progress badge on each cover in the mosaic shelf. |
atualizarmetadados.koplugin)Fetches a book's metadata by ISBN from several free sources, merges the results field by field, and lets you edit everything before saving — including picking the highest-quality cover.

custom_props and the cover via flushCustomCover,
making KOReader refresh the shelf immediately.FileManager itself, which moves the .sdr sidecar along,
updates history and collections, and avoids name collisions.destaquealeatorio.koplugin)Shows a random highlight (quote) from your books in a popup — when KOReader starts and/or when it resumes from suspend. It can also be triggered at any time from the menu.

metadata.*.lua sidecars: for each book it stores only the modification time
and the number of highlights.annotations) and the old one
(bookmarks with highlighted, and the pre-2014 highlight table), with
the same coverage as KOReader.history/ folder is not scanned (only the current sidecar
locations: next to the book, central folder, and hash folder).estantemosaico.koplugin)Adds a visual layer over the mosaic shelf: a translucent central band with the book's title and a subtle badge with the reading state (percentage read, or ✓ when finished) on each cover.

BookInfoManager metadata; if metadata has not been
extracted yet, it falls back to the file name without extension.Plugins are folders ending in .koplugin. To install, just copy them into the
plugins folder of your KOReader installation — the same folder that already
contains native plugins such as coverbrowser.koplugin.
.zip file from the latest version (generated on every v*
tag)..koplugin folders.plugins folder.git clone https://github.com/raelales/FineKo.git
.koplugin folder into KOReader's plugins folder.plugins folder isIt lives inside the KOReader installation folder. The path varies by device;
locate the KOReader folder and look for the plugins subfolder (the one that
contains coverbrowser.koplugin). Some common examples:
.adds/koreader/plugins/koreader/plugins/koreader/plugins/ on internal storage or the SD card.plugins/ next to the KOReader
executable.Tip: to install only some plugins, copy only the matching folders. They work independently.
Replace the old .koplugin folders with the new ones and restart KOReader. Your
settings are stored in KOReader's settings (G_reader_settings) and are not
lost.
Just delete the corresponding .koplugin folder and restart KOReader.
The three plugins are translated into the 21 languages covered by the Atkinson Hyperlegible Next font: Portuguese, English, Spanish, German, French, Indonesian, Italian, Malay, Dutch, Norwegian, Swedish, Swahili, Afrikaans, Albanian, Catalan, Danish, Filipino, Finnish, Galician, Icelandic, and Luxembourgish. The interface follows the language selected in KOReader.
The message catalog lives in i18n/translations.py. The msgid is the
Portuguese text as it appears in the Lua code, so for pt the translation is
the msgid itself. To change or add a translation:
i18n/translations.py.python3 i18n/build.py
This requires the msgfmt utility (gettext package) in the PATH.<plugin>/l10n/<lang>/fineko.po and fineko.mo for the
three plugins and checks that the three copies of fineko_i18n.lua stay
identical.FineKo/
├── atualizarmetadados.koplugin/
│ ├── _meta.lua # plugin name and description
│ ├── main.lua # search, merge, and save logic
│ ├── fineko_i18n.lua # loads the catalog for KOReader's active language
│ └── l10n/<lang>/ # gettext catalogs (fineko.po and fineko.mo)
├── destaquealeatorio.koplugin/
│ ├── _meta.lua
│ ├── main.lua # index, draw, and quote popup
│ ├── fineko_i18n.lua # same file as in the other plugins
│ └── l10n/<lang>/
├── estantemosaico.koplugin/
│ ├── _meta.lua
│ ├── main.lua # menu and lifecycle
│ ├── em_overlay.lua # drawing of the band and badge over the covers
│ ├── fineko_i18n.lua # same file as in the other plugins
│ └── l10n/<lang>/
├── i18n/
│ ├── translations.py # message catalog and the 21 translations
│ └── build.py # generates the .po and .mo files
├── .github/assets/ # support button used in this README
├── .github/workflows/release.yml # packages and publishes the release on each tag
├── README.md # this file (English)
└── README.pt-BR.md # Portuguese
The workflow in .github/workflows/release.yml runs when a tag starting with
v is pushed. It first checks that every .lua file loads under luajit, then
packages the entire repository (except .git, .github, and .zip files) into
a single FineKo-<tag>.zip file and publishes it to Releases with
automatically generated notes.
To create a new version:
git tag v1.0.0
git push origin v1.0.0
Lua
62.4%
Python
37.6%
Three Lua plugins for KOReader that fetch and merge metadata and covers by ISBN from free sources, show a random quote from your books on startup or resume from suspend, and draw a title and progress badge over each cover.
Lua
0
25 commits
updated Sep 30, 2026
EN · PT
A collection of KOReader plugins that improves how you organize, describe, and discover your books.
The repository bundles three independent plugins, all written in Lua and
installed as .koplugin folders:
| Plugin | Folder | What it does |
|---|---|---|
| Update metadata | atualizarmetadados.koplugin | Fetches metadata and cover by ISBN from several free sources and writes them to the book. |
| Random highlight | destaquealeatorio.koplugin | Shows a random quote from your books when KOReader starts or resumes from suspend. |
| Mosaic shelf | estantemosaico.koplugin | Draws the title and a reading-progress badge on each cover in the mosaic shelf. |
atualizarmetadados.koplugin)Fetches a book's metadata by ISBN from several free sources, merges the results field by field, and lets you edit everything before saving — including picking the highest-quality cover.

custom_props and the cover via flushCustomCover,
making KOReader refresh the shelf immediately.FileManager itself, which moves the .sdr sidecar along,
updates history and collections, and avoids name collisions.destaquealeatorio.koplugin)Shows a random highlight (quote) from your books in a popup — when KOReader starts and/or when it resumes from suspend. It can also be triggered at any time from the menu.

metadata.*.lua sidecars: for each book it stores only the modification time
and the number of highlights.annotations) and the old one
(bookmarks with highlighted, and the pre-2014 highlight table), with
the same coverage as KOReader.history/ folder is not scanned (only the current sidecar
locations: next to the book, central folder, and hash folder).estantemosaico.koplugin)Adds a visual layer over the mosaic shelf: a translucent central band with the book's title and a subtle badge with the reading state (percentage read, or ✓ when finished) on each cover.

BookInfoManager metadata; if metadata has not been
extracted yet, it falls back to the file name without extension.Plugins are folders ending in .koplugin. To install, just copy them into the
plugins folder of your KOReader installation — the same folder that already
contains native plugins such as coverbrowser.koplugin.
.zip file from the latest version (generated on every v*
tag)..koplugin folders.plugins folder.git clone https://github.com/raelales/FineKo.git
.koplugin folder into KOReader's plugins folder.plugins folder isIt lives inside the KOReader installation folder. The path varies by device;
locate the KOReader folder and look for the plugins subfolder (the one that
contains coverbrowser.koplugin). Some common examples:
.adds/koreader/plugins/koreader/plugins/koreader/plugins/ on internal storage or the SD card.plugins/ next to the KOReader
executable.Tip: to install only some plugins, copy only the matching folders. They work independently.
Replace the old .koplugin folders with the new ones and restart KOReader. Your
settings are stored in KOReader's settings (G_reader_settings) and are not
lost.
Just delete the corresponding .koplugin folder and restart KOReader.
The three plugins are translated into the 21 languages covered by the Atkinson Hyperlegible Next font: Portuguese, English, Spanish, German, French, Indonesian, Italian, Malay, Dutch, Norwegian, Swedish, Swahili, Afrikaans, Albanian, Catalan, Danish, Filipino, Finnish, Galician, Icelandic, and Luxembourgish. The interface follows the language selected in KOReader.
The message catalog lives in i18n/translations.py. The msgid is the
Portuguese text as it appears in the Lua code, so for pt the translation is
the msgid itself. To change or add a translation:
i18n/translations.py.python3 i18n/build.py
This requires the msgfmt utility (gettext package) in the PATH.<plugin>/l10n/<lang>/fineko.po and fineko.mo for the
three plugins and checks that the three copies of fineko_i18n.lua stay
identical.FineKo/
├── atualizarmetadados.koplugin/
│ ├── _meta.lua # plugin name and description
│ ├── main.lua # search, merge, and save logic
│ ├── fineko_i18n.lua # loads the catalog for KOReader's active language
│ └── l10n/<lang>/ # gettext catalogs (fineko.po and fineko.mo)
├── destaquealeatorio.koplugin/
│ ├── _meta.lua
│ ├── main.lua # index, draw, and quote popup
│ ├── fineko_i18n.lua # same file as in the other plugins
│ └── l10n/<lang>/
├── estantemosaico.koplugin/
│ ├── _meta.lua
│ ├── main.lua # menu and lifecycle
│ ├── em_overlay.lua # drawing of the band and badge over the covers
│ ├── fineko_i18n.lua # same file as in the other plugins
│ └── l10n/<lang>/
├── i18n/
│ ├── translations.py # message catalog and the 21 translations
│ └── build.py # generates the .po and .mo files
├── .github/assets/ # support button used in this README
├── .github/workflows/release.yml # packages and publishes the release on each tag
├── README.md # this file (English)
└── README.pt-BR.md # Portuguese
The workflow in .github/workflows/release.yml runs when a tag starting with
v is pushed. It first checks that every .lua file loads under luajit, then
packages the entire repository (except .git, .github, and .zip files) into
a single FineKo-<tag>.zip file and publishes it to Releases with
automatically generated notes.
To create a new version:
git tag v1.0.0
git push origin v1.0.0
Lua
62.4%
Python
37.6%