Thanks for taking the time to contribute.
- Report bugs (include reproduction steps + device/platform)
- Request features (explain the user problem and expected UX)
- Improve docs (README, setup notes, screenshots)
- Submit PRs (small, focused changes are easiest to review)
- Node.js (LTS recommended)
pnpm- Expo tooling (Android Studio / Xcode depending on target)
pnpm installpnpm startRun the narrowest checks that cover the change while iterating, then run the final applicable gate before opening a PR:
pnpm typecheck
pnpm exec eslint <changed-file>...
pnpm test -- <path/to/file.test.ts>
pnpm test
pnpm verify:ciUse pnpm test:e2e:sync* only when the required real-service credentials and authorization are available. Use the Android E2E commands in E2E.md only with an explicitly authorized device session.
Create a What's New entry for a noteworthy user-facing feature: a major new setting, a new integration or option, or a substantial improvement to an existing flow. Skip minor bug fixes, internal refactors, and cosmetic changes.
Scaffold the entry instead of creating it by hand:
pnpm new-whats-new "vX.Y.Z" "Feature Name"Then:
- Replace the template with a short markdown description covering what changed, how to use it, and relevant limitations.
- For a noteworthy feature, ask the user for a suitable screenshot or illustration and save it beside the entry as
.png,.webp, or.jpgusing the generated filename. - Run
pnpm generate-whats-newsosrc/constants/whats-new/_registry.tsstays synchronized.
- Keep changes minimal and focused; avoid drive-by refactors.
- Prefer TypeScript strict correctness.
- Use the existing theme tokens and shared components.
- For TV-interactive UI, use the existing focus primitives/components (for example,
Focusable). - For data fetching, prefer the existing React Query hooks.
- Do not hardcode UI strings in components. Use
useTranslationand add strings to the appropriate namespace insrc/i18n/translations/en/.
We welcome translations for any language! To add a new language:
- Create a new folder
src/i18n/translations/<your-language-code>/. - Copy all JSON files from
src/i18n/translations/en/to your new folder. - Translate the values in the new JSON files. Keep the keys exactly the same.
We use a namespaced JSON structure where each file represents a namespace (for example, common, settings, profiles).
- Fork the repo
- Create a branch
- Make a focused change (include tests when the behavior is covered by an existing test layer)
- Run the applicable focused checks and
pnpm verify:cibefore opening a PR - Open a PR with:
- what changed
- why
- how you tested it
Please include:
- Platform (Android TV / Android / tvOS), OS version
- Device model (if relevant)
- Steps to reproduce
- Expected vs actual behavior
- Logs if available