Skip to content

Contributing

K M Rejowan Ahmmed edited this page Oct 25, 2026 · 1 revision

Contributing

Every contribution helps, whether it's a bug report, an idea, a translation or code. The full guide is CONTRIBUTING.md; this page summarizes it.

Bugs and ideas

Translations

On Crowdin; see Languages and Translation.

Code

  1. Fork the repository and branch from feature.
  2. Make your change, following the existing style: Kotlin conventions, small composables, state hoisted into ViewModels.
  3. Run the checks from Building from Source.
  4. Open a pull request against feature.

Commit messages follow the conventional format, for example feat: add night mode or fix: keep the page when rotating. Pull requests into feature are squash-merged, so a tidy history in the PR isn't required.

Branches

  • feature: where development happens and pull requests go.
  • master: updated from feature with a merge commit when a set of changes is ready, and the branch releases are built from.
  • l10n_feature: created by Crowdin for translation updates.

Releases

Maintainers release in two steps:

  1. A docs commit, last before the release, updates everything a version change touches: versionName and versionCode in app/build.gradle.kts, a new ## [x.y.z] - YYYY-MM-DD entry at the top of CHANGELOG.md below [Unreleased], the in-app changelog, and the changelog section of every README.
  2. Actions > Release > Run workflow, choosing Full release or Pre-release. Nothing else is entered: the version and the release notes come from the newest CHANGELOG.md entry. The run stops if that version doesn't match versionName, and skips without building if the version is already released.

Full releases are marked Latest and offered by the in-app update check. Pre-releases are signed the same way but never offered to users.

Upgrading PDF.js

The bundled PDF.js carries a few edits. Re-apply them after an upgrade as described under Upgrading PDF.js in CONTRIBUTING.md; BundledPdfJsPatchesTest fails until they're back.

Code of conduct

Please follow the Code of Conduct.

Clone this wiki locally