TorrentBay is a React Native + Expo Android app for searching and browsing publicly available torrent metadata. It uses Apibay as the metadata provider, displays normalized torrent information, and supports local favorites, search history, and magnet-link actions.
TorrentBay does not host, store, stream, or download torrent content.
- Search torrent metadata by keyword with category and sort controls.
- Browse normalized result metadata including name, category, size, upload date, uploader, seeders, leechers, magnet link, provider details URL, and trusted/VIP status when available.
- Copy, share, or open magnet links with confirmation controls.
- Open provider/details pages externally.
- Save favorites locally and sort them by recent, name, seeders, or category.
- Keep local search history and replay previous searches with their selected category and sort.
- Configure local preferences, including mature-content category visibility and magnet-link confirmation.
- Handle loading, empty, retry, offline/provider error, and unsupported-action states.
- React Native 0.86 with React 19.
- Expo 57 and Expo Router.
- TypeScript with strict mode.
- NativeWind and Tailwind CSS for styling.
- Zustand for local state and persisted stores.
- Expo SQLite KV store for persisted local preferences, favorites, and history, with an in-memory fallback in tests.
- Apibay JSON metadata provider, plus parser utilities and provider URL helpers.
- Bun for dependency management, scripts, and tests.
- Bun installed and available on your PATH.
- Expo tooling via
bunx expo. - EAS CLI access via the GitHub Actions Expo setup or local
bunx easusage if you build manually. - Android Studio, an Android emulator, or a physical Android device for Android development.
- An Expo account and valid
EXPO_TOKENfor release builds.
From the project root:
bun installFor CI-style installs, use the lockfile:
bun install --frozen-lockfileRun the Expo development server:
bun run startLaunch platform targets:
bun run android
bun run ios
bun run webThis project is primarily scoped for Android. iOS and web scripts exist through Expo, but Android is the documented release target.
Run unit/store/service tests:
bun testRun quality checks:
bun run format:check
bun run lint
bun run typecheckRun Expo dependency checks before release:
bunx expo install --check
bunx expo-doctorThe release readiness checklist in docs/ReleaseReadiness.md also documents manual QA areas for launch, search, details, favorites, history, settings, accessibility, and performance.
Android APK releases are automated by .github/workflows/android-apk-release.yml.
- Push a numeric version tag matching
vX.Y.Z, such asv0.1.0, to trigger the workflow. - The tag version must match
package.jsonversionandapp.jsonexpo.version. - The workflow installs dependencies with
bun install --frozen-lockfile. - It runs formatting, linting, type checking, tests,
bunx expo install --check, andbunx expo-doctor. - It builds Android with EAS using the
apkprofile fromeas.json. - The
apkprofile setsandroid.buildTypetoapk. - If all checks, the EAS build, and artifact download succeed, the workflow publishes a non-draft GitHub Release and attaches
TorrentBay-<tag>.apk. - The workflow requires the
EXPO_TOKENGitHub repository secret.
See docs/ApkGithubReleasePlan.md for the full release runbook.
src/
app/ Expo Router screens and routes
assets/ App icon and splash assets
components/ Shared UI, navigation, and brand components
constants/ App, theme, and provider constants
features/ Search, torrent, favorites, and settings feature modules
hooks/ Shared React hooks
models/ Domain models and search parameter types
services/ Networking, provider URL, parser, and storage services
store/ Zustand stores and store tests
styles/ Global NativeWind styles
types/ Shared app-state types
utils/ Shared utility functions
docs/ Product, task, release, and APK release documentation
.github/workflows/ GitHub Actions release workflow
TorrentBay is a metadata browser only. It does not host files, store torrent payloads, download torrent files, stream media, or provide copyrighted content. Users are responsible for complying with applicable laws, provider terms, and rights-holder requirements in their jurisdiction. Only search for and access content you are legally permitted to use.