Thanks for your interest in contributing. This document explains how to get your changes merged.
- Read the README for project overview and setup.
- For code layout, conventions, and where things live, see AGENTS.md (written for AI agents but useful for humans too).
- Clone the repo and install dependencies:
npm install, thennpx pod-install iosfor iOS. - Copy
.env.exampleto.envand adjust if needed. - Run the app:
npm start, thennpm run iosornpm run android.
Run these locally; CI will run them as well:
- Biome:
npm run lintrunsbiome check .(no writes).npm run formatapplies fixes (biome check . --write). There is no ESLint/Prettier in this repo. - Type-check:
npx tsc --noEmit - Tests:
npm test - Guards (if you touched relevant files):
- After changing SVGs:
npm run gen:iconsand ensurenpm run check:iconspasses. - After changing i18n keys:
npm run i18n:all. npm run check:importsmust pass (path aliases only, no deep relative imports).
- After changing SVGs:
Use a short, descriptive branch name, e.g. fix/auth-redirect, feat/settings-theme-toggle, docs/readme-quick-start.
- Keep PRs focused: one feature or fix per PR when possible.
- Ensure all quality checks above pass.
- If your change is user-facing or notable, add an entry to CHANGELOG.md under
## Unreleased. - Do not include unrelated refactors or formatting-only changes in the same PR.
Use the bug report or feature request templates when opening an issue. Include environment details (React Native version, Node version, OS) for bugs.
For security concerns, do not file a public issue. Use GitHub → Security → Report a vulnerability if enabled for this repository, or contact the maintainers privately.
Use the relevant checklist(s) when reviewing or submitting a PR.
- Keys defined in
api/keys.ts— not inline in components. - Freshness profile from
src/shared/services/api/query/policy/freshness.ts— no magic numbers. - Mutations include
meta.tags;api/keys.tshas the tag → keys mapping. - API response validated with Zod before caching.
- Normalized errors only (
normalize-error.ts). - Pagination uses infinite queries; resets on params change.
- Offline behavior and post-replay invalidations defined.
- One responsibility per slice; no monolithic store.
- Actions atomic; no side effects inside store definitions.
- Narrow selectors; components subscribe to specific fields.
- Only safe bits persisted (theme/locale); no secrets in Zustand.
- No server data duplicated from React Query.
- Logout resets all slices and clears sensitive storage.
- Route constants from
src/navigation/routes.ts— no inline strings. - ParamList entries added to the feature's
navigation/param-list.ts. - Provider order matches
App.tsx(i18n → GestureHandler → SafeArea → Theme → ErrorBoundary → Query → Nav). - Half-sheet / modal screens use
HALF_SHEET_OPTIONSpreset.
- No raw colors, spacing, or font values — theme tokens only.
- SVGs under
assets/svgs/;icons.tsregenerated (npm run gen:icons). -
npm run check:iconspasses. - Light and dark mode both reviewed for contrast.
- No sensitive data in logs or analytics.
- Secrets and tokens in Keychain / Keystore — not in Zustand or plain storage.
- Accessibility roles, labels, and hit targets on all interactive elements.
- Offline UX acceptable (cached data shown; pull-to-refresh available).
- i18n keys present in all locales (
en,de,ru).