Contribute to Interlude

How to build, test, and submit changes · Last updated

Interlude is a fork of Metrolist and follows its contribution model: small, focused pull requests; a clear issue before large changes; and GPL-3.0 compatibility for everything you submit. This page covers the practical steps.

Before you write code

For anything larger than a typo fix, open an issue first. It saves you from spending a weekend on a feature that's already in progress or out of scope. The issue tracker and the roadmap are the source of truth for what's planned.

Building locally

You need a JDK (17 or newer) and the Android SDK. Android Studio installs and configures both for you; if you're building from a terminal, install them via Android command-line tools.

git clone https://github.com/naklirajveerfr/Interlude-Music.git
cd Interlude-Music
./gradlew assembleFossDebug

# first build downloads dependencies and takes several minutes
# APK output: app/build/outputs/apk/foss/debug/

adb install -r app/build/outputs/apk/foss/debug/*.apk

Build variants

Signing key mismatch

A debug build and a release build have different signing keys. Installing a debug build over a release install (or vice versa) will fail with "App not installed". Uninstall the existing app first — this deletes its data, so back up first.

Coding conventions

Interlude follows standard Kotlin and Android conventions, with a few project-specific rules:

Running tests

The test suite is split into unit tests (JVM, fast) and instrumented tests (on-device, slow):

# unit tests
./gradlew testFossDebugUnitTest

# instrumented tests (requires a connected device or emulator)
./gradlew connectedFossDebugAndroidTest

Not every change needs a new test, but changes to playback, the lyrics pipeline, and the download manager should include one. Bug fixes should ideally include a regression test that fails without the fix.

Translating

Interlude uses Android's standard string resources. Translations live in app/src/main/res/values-<locale>/strings.xml. To add a language:

  1. Copy app/src/main/res/values/strings.xml to app/src/main/res/values-<locale>/strings.xml (e.g. values-fr for French).
  2. Translate the string values, not the keys.
  3. Do not translate strings that are proper nouns or API parameters; those are marked with a translatable="false" attribute.
  4. Open a pull request with the new file. Partial translations are accepted as long as untranslated strings fall back gracefully to English.

Submitting a pull request

  1. Fork the repository and create a branch from main with a descriptive name: fix/gapless-at-44khz, feat/phase-aligned-mix.
  2. Make your changes in small, focused commits. Squash any "wip" commits before opening the PR.
  3. Run ./gradlew ktlintFormat testFossDebugUnitTest and confirm it passes.
  4. Open a PR against main. In the description, include a short summary, a link to the issue you're fixing (if any), and screenshots or a screen recording for UI changes.
  5. A maintainer will review within a few days. Expect feedback on scope, testing, and conventions — this is normal and not a rejection.

What gets merged faster

Small PRs that fix one thing and include a test. Large PRs that touch many files at once, or that introduce new dependencies, take much longer to review and may be asked to split.

License

Interlude is licensed under GPL-3.0. By submitting a pull request you agree to license your contribution under the same terms. If your change includes code from another project, verify that project's license is GPL-3.0 compatible before including it — ask in the issue or PR if you're unsure.

Getting help