Contributing
Thanks for wanting to help! Tavern is a GTK 4 / Libadwaita Homebrew client written in Python with Blueprint UI definitions.
Dev setupβ
Install build dependencies (Homebrew on Linux or macOS):
brew install gtk4 libadwaita meson ninja pygobject3 gettext desktop-file-utils blueprint-compiler
Build, install to ~/.local, and launch:
./run.sh # normal run
TAVERN_LOG=debug ./run.sh # with verbose logging
For a sandboxed Flatpak build (requires just):
just dev # build + install + run as Flatpak
Testsβ
Running the test suite requires PyGObject and GTK 4/Libadwaita development bindings installed on the host system:
python3 -m pytest tests/ # full suite
python3 -m pytest tests/test_backend.py -v # one file
python3 -m pytest tests/test_benchmarks.py --benchmark-enable # benchmarks
Tests run headlessly β the autouse fixtures in tests/conftest.py mock Gio.Settings and dialog .present() calls so nothing pops on screen. If you add new dialog types, extend that fixture.
Working on the UIβ
Blueprint files (.blp) compile to .ui XML at build time via blueprint-compiler. Always rebuild after editing a .blp:
./run.sh # re-runs blueprint-compiler
When adding a new page, keep Blueprint, Python, window wiring, gresource registration, and meson sources in sync β the repo layout in README.md and src/ shows where each piece lands.
Localizationβ
Wrap every user-visible Blueprint value in _(), for example
label: _("Install");, and add new Blueprint/Python sources to
po/POTFILES.in. Python UI strings should use gettext.gettext (_) or
ngettext for plurals. Before opening a PR, run:
python3 tools/check-translations.py
meson setup build
meson compile -C build tavern-pot
Add a locale code to po/LINGUAS only when its .po catalog is ready to
ship. Translation-only PRs are welcome and do not require changes to Python.
Additional maintainer guides cover the cache lifecycle, curation feed, accessibility release pass, and release process.
The files under docs/reports/ are dated historical
verification snapshots, not maintained contributor instructions.
Pull requestsβ
- Keep PRs focused β one change, one PR.
- Include a screenshot or short clip for any user-visible UI change.
- Run
python3 -m pytest tests/locally before opening. - Reference the issue you're closing (
Closes #123).
Code styleβ
- Match the surrounding style β Tavern is a small codebase, consistency matters more than any specific rule.
- Logging is off by default. New code should use
_log = get_logger('module_name')fromlogging_util, not bareprint. - Backend I/O goes on a thread and reports back via
GLib.idle_addβ don't block the UI thread.
Project docsβ
- README.md β user-facing docs.
- ROADMAP.md β what's planned.