Thank you for your interest in contributing. Zen UI is a small, focused plugin β contributions that keep it clean, minimal, and well-behaved are most welcome.
| Β | Β |
|---|---|
| π Bug report | Open an Issue describing what went wrong |
| π‘ Feature request | Open an Issue with your idea |
| π Translation | Add or improve a .po file in locales/ |
| π§ Code | Fork, branch, change, and open a Pull Request |
| π Documentation | Improve the README or add inline comments |
Open an Issue and include:
If the bug causes a crash, the KOReader log (crash.log or reader.log in the KOReader folder) is very helpful.
Open an Issue describing the feature and why it would be useful. Keep Zen UIβs philosophy in mind β features should reduce clutter or add something genuinely useful. Screenshots or mockups are welcome.
Translations live in the locales/ folder as standard .po files. No programming knowledge is needed.
locales/en.po to locales/<lang>.po using the standard locale code β for example de.po, ja.po, ko.po."Language: de\n"
msgstr field with your translation:
msgid "Quick settings"
msgstr "Schnelleinstellungen"
Open the existing .po file for your language, correct or complete the msgstr values, and submit a Pull Request.
msgid β only edit msgstr%d, %s, %%, and \n must appear in msgstr exactly as they do in msgidmsgstr "" empty for any string you are unsure about β the English original will be shown as a fallbackPlural-Forms in the header accordinglyZen UI is a standard KOReader plugin written in Lua. No build system or compilation step is required. The plugin runs directly from source.
To test changes:
zen_ui.koplugin folder to the plugins/ directory on your device or the KOReader emulator.The KOReader emulator is the fastest way to iterate without a physical device.
Zen UI uses LuaCheck for static analysis.
Install it locally (one-time):
luarocks install luacheck
Run lint checks from the plugin root:
luacheck -q _meta.lua main.lua common config modules
The project config is in .luacheckrc and is aligned with KOReaderβs baseline (for globals like G_reader_settings and G_defaults).
git checkout -b fix/my-bug-description
_():
-- correct
text = _("Something went wrong.")
-- incorrect β not translatable
text = "Something went wrong."
locales/en.po:
msgid "Your new string"
msgstr ""
git commit -m "Fix progress bar not updating after resume"
main.If you have Python 3 available, you can scan all Lua files for translatable strings and print any that are missing from locales/en.po:
import re, pathlib
strings = set()
pattern = re.compile(r'_\("([^"]+)"\)')
for f in pathlib.Path(".").rglob("*.lua"):
strings.update(pattern.findall(f.read_text(errors="ignore")))
existing = pathlib.Path("locales/en.po").read_text(errors="ignore")
for s in sorted(strings):
if f'msgid "{s}"' not in existing:
print(f'msgid "{s}"\nmsgstr ""\n')
local variables; avoid polluting the module-level scope_()zen_ui.koplugin/
βββ main.lua β plugin entry point and lifecycle
βββ _meta.lua β plugin metadata
βββ config/
β βββ defaults.lua β schema and default values
β βββ manager.lua β persistence, migration, getters/setters
βββ common/
β βββ utils.lua β shared utilities
βββ modules/
β βββ registry.lua β module loader and feature registry
β βββ filebrowser/ β file browser patches and layout
β βββ menu/ β menu patches (quick settings, zen mode)
β βββ reader/ β reader patches (clock, status, banner)
βββ settings/
β βββ zen_settings.lua β unified settings menu entry
β βββ zen_settings_build.lua β menu tree builder
β βββ zen_settings_apply.lua β apply settings to live state
β βββ zen_settings_updater.lua β update checker and installer
β βββ zen_updater.lua β GitHub release fetcher
βββ locales/ β gettext .po translation files
βββ icons/ β UI icons
βββ CONTRIBUTING.md
βββ SECURITY.md
βββ README.md
Before submitting, please check:
_()locales/en.poThank you for helping make Zen UI better.