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.
For the local KOReader development build, set KOREADER_DIR in .env, then run:
./build.sh --dev
This builds the plugin, replaces its copy in $KOREADER_DIR/plugins/, and
restarts the KOReader process launched by the previous --dev build.
Zen UIβs tests live under spec/ and run against KOReaderβs bundled LuaJIT.
Set KOREADER_DIR to a built KOReader emulator when it is not discoverable next
to this checkout. The first Python smoke run creates an ignored virtualenv.
./spec/run lua # Lua unit and KOReader patch integration specs
./spec/run smoke # Lua plus deterministic Python checks
./spec/run package-check # Assert release ZIP excludes every test asset
ZEN_UI_RUN_EMULATOR=1 ./spec/run smoke starts a disposable emulator overlay
with the current plugin source and test-only driver plugin; it never changes the
emulator or plugin installation you use for development. See spec/README.md
for pinned KOReader versions and golden-image workflow.
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"
dev.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.