A cross-platform React Native app built with Expo that runs on iOS, Android, and Web for undoomscrolling Torah.
Before you begin, ensure you have the following installed:
- Xcode (v15 or later) - Install from the Mac App Store
- Xcode Command Line Tools - Run
xcode-select --install - CocoaPods - Run
sudo gem install cocoapods
- Android Studio - Download
- Android SDK (API 34 or later)
- Android Emulator or physical device with USB debugging enabled
- Any modern web browser (Chrome, Firefox, Safari, Edge)
-
Clone the repository
git clone <repository-url> cd tiktorah
-
Install dependencies
npm install
npm startThis launches the Expo development server and displays a QR code and menu options.
Option 1: iOS Simulator (macOS only)
npm run iosThis automatically opens the app in the iOS Simulator.
Option 2: Physical Device
- Install the Expo Go app from the App Store
- Run
npm start - Scan the QR code with your iPhone camera
Option 1: Android Emulator
npm run androidEnsure you have an Android emulator running or it will prompt you to start one.
Option 2: Physical Device
- Install the Expo Go app from the Google Play Store
- Enable USB debugging on your device
- Run
npm start - Scan the QR code with the Expo Go app
npm run webThis opens the app in your default web browser at http://localhost:8081.
The app includes bundled data from Sefaria.org and automatically checks for updates on startup.
| Data | API Endpoint | Description |
|---|---|---|
| Library Index | /api/index |
Complete catalog of texts (~4MB) |
| Topics | /api/topics |
Topic taxonomy and metadata (~1.3MB) |
- Bundled Data: The app ships with pre-downloaded JSON data files in
/data/ - Instant Loading: On startup, data loads immediately from bundled or cached files
- Background Updates: After loading, the app checks for updates in the background (non-blocking)
- Hash Comparison: Uses SHA256 hashing to detect if remote data has changed
- Automatic Caching: Updated data is persisted locally for future use
| Platform | Storage Method |
|---|---|
| iOS | File system (expo-file-system) |
| Android | File system (expo-file-system) |
| Web | LocalStorage via AsyncStorage |
import { useSefaria } from '@/contexts/SefariaContext';
function MyComponent() {
const { index, topics, isLoading, isCheckingForUpdates } = useSefaria();
if (isLoading) return <Loading />;
// Use index and topics data...
}Users can manage data from Settings:
- Check for Updates: Manually trigger an update check
- Reset to Bundled: Clear cached data and revert to bundled version
tiktorah/
├── app/ # App screens (Expo Router)
│ ├── _layout.tsx # Root layout with providers
│ ├── index.tsx # Entry point redirect
│ └── (tabs)/ # Tab-based navigation
│ ├── _layout.tsx # Tab bar configuration
│ ├── index.tsx # Home screen
│ ├── components.tsx # UI component showcase
│ └── settings.tsx # Settings screen
├── contexts/
│ └── SefariaContext.tsx # Sefaria data provider and hooks
├── services/
│ └── sefariaData.ts # Data loading, caching, and updates
├── data/
│ ├── sefaria-index.json # Bundled library index
│ └── sefaria-topics.json # Bundled topics data
├── assets/ # Images, fonts, and icons
├── constants/
│ └── theme.ts # App theme configuration
├── app.json # Expo configuration
├── package.json # Dependencies and scripts
├── tsconfig.json # TypeScript configuration
├── babel.config.js # Babel configuration
├── metro.config.js # Metro bundler configuration
└── eas.json # EAS Build configuration
| Command | Description |
|---|---|
npm start |
Start the Expo development server |
npm run ios |
Run on iOS simulator |
npm run android |
Run on Android emulator |
npm run web |
Run in web browser |
npm run lint |
Run ESLint |
npm test |
Run tests |
First, install the EAS CLI and log in:
npm install -g eas-cli
eas loginBuild for iOS:
eas build --platform iosBuild for Android:
eas build --platform androidBuild for both platforms:
eas build --platform allnpm run build:webThis creates a static export in the dist/ folder that can be deployed to any static hosting service.
npm testnpm run lintMetro bundler cache issues:
npm start -- --cleariOS build fails:
cd ios && pod install && cd ..Android build fails:
- Ensure Android SDK is properly configured
- Check that
ANDROID_HOMEenvironment variable is set - Try
npm run android -- --clear
Web styles not working:
- Clear browser cache
- Restart the development server with
npm start -- --clear
If you encounter persistent issues:
rm -rf node_modules
rm -rf .expo
npm install
npm start -- --clear- React Native 0.76 - Cross-platform mobile framework
- Expo SDK 52 - Development platform and tools
- React 18.3 - UI library
- TypeScript 5.6 - Type-safe JavaScript
- Expo Router 4 - File-based navigation
- React Native Paper 5 - Material Design 3 components
- React Native Reanimated 3 - Animations
- @expo/vector-icons - Icon library
- expo-file-system - Native file storage
- expo-crypto - SHA256 hashing for update detection
- AsyncStorage - Cross-platform key-value storage
This app uses data from Sefaria.org, a free living library of Jewish texts.
MIT