- Fork this repository
- Follow the instructions for Running Locally
- Check out the issues if you need inspiration
- Hack, hack, hack
- Submit a Pull Request to sync the main repository with your fork
- Node.js v22
- Bun for managing dependencies
- Xcode for building
- Clone this repository
- Run
bun init-iosto initialize the project- This will install
npmpackages, installbundlerand required gems, and install required CocoaPods with React Native's New Architecture
- This will install
-
Run
bun startto start the Metro dev server -
Open
Jellify.xcworkspacewith Xcode, notJellify.xcodeproj -
Run in the simulator
- You will need to wait for Xcode to finish its "Indexing" step before the build completes
-
To run on a physical device, you will need access to the Signing repository
- Create a GitHub Personal Access Token and export it as
MATCH_REPO_PAT - Run
bun fastlane:ios:matchto fetch the signing keys and certificates
- Create a GitHub Personal Access Token and export it as
- Run
bun fastlane:ios:buildto use Fastlane to compile an.ipa
- Clone this repository
- Run
bun installto installnpmpackages
- Run
bun startto start the Metro dev server - Open the
androidfolder with Android Studio- Android Studio should automatically detect the run configurations and initialize Gradle
- Run on a device or in the emulator
- Run
bun fastlane:android:buildto use Fastlane to compile an.apkfor all architectures - Alternatively, run
cd android && ./gradlew assembleReleaseto use Gradle directly
src/
api/ # Jellyfin API calls and helpers
components/ # Shared UI components
configs/ # App configuration (Tamagui, etc.)
constants/ # App-wide constants
enums/ # TypeScript enums
hooks/ # Custom React hooks
providers/ # React context providers
screens/ # Top-level screen components
services/ # Background services (e.g. player)
stores/ # State management stores
types/ # TypeScript types and interfaces
utils/ # Utility / helper functions
jest/
contextual/ # Component and integration tests
functional/ # Unit tests for utilities and logic
setup/ # Jest setup and mock files
maestro/
flows/ # E2E UI test flows grouped by feature area
subflows/ # Reusable flows shared across multiple stacks
The project uses ESLint, Prettier, and TypeScript for code quality. Before submitting a PR, please ensure your changes pass all checks:
bun lint # Check for ESLint errors
bun format:check # Check Prettier formatting
bun format # Auto-fix Prettier formatting
bun tsc # Type-check with TypeScriptNotable style rules enforced by ESLint:
- No semicolons
@typescript-eslint/no-explicit-anyis an error — avoidanytypesreact/react-in-jsx-scopeis disabled (React 17+ JSX transform)
Tests are written with Jest and React Native Testing Library.
bun test # Run the full test suiteTests live in jest/contextual/ (component / integration tests) and jest/functional/ (unit tests). When adding new functionality, please include relevant tests.
Jellify also has an end-to-end UI test suite powered by Maestro. See the Maestro README for details on the flow structure and how to run the tests.
- PRs are submitted against the
mainbranch - Fill out the pull request template — include a clear description of what changed and what issue it addresses
- Tag
@anultravioletauroraas a reviewer - CI will automatically run the Jest test suite, TypeScript type-check, and ESLint on your PR — make sure all checks pass before requesting review