A cross-platform Quran reader built with React Native and Expo — for iOS, Android, and Web.
- 📖 Page-by-page reading — All 604 pages with Uthmanic Hafs script
- 🔍 Full-text search — Arabic text, surah:ayah references, juz/hizb/page numbers
- 🔖 Bookmarks — Save and navigate to favorite verses
- 🎨 5 themes — Fajr (light), Layl (dark), Asr (sepia), Tahajjud (AMOLED), Masjid (green)
- 🌍 Bilingual — Arabic and English UI with full RTL support
- 📱 Native experience — Swipe navigation, haptic feedback, auto-hide headers
- ⌨️ Web experience — Keyboard navigation, ⌘K search, responsive layout, SEO optimized
- 📍 Reading progress — Automatically saves and restores last read position
- Node.js 22+
- pnpm (
corepack enable) - iOS: Xcode 16+ / Android: Android Studio
git clone https://github.com/mr3od/sakina-quran.git
cd sakina-quran
pnpm install# Web
pnpm web
# iOS
pnpm ios
# Android
pnpm android# Run tests
pnpm test
# Watch mode
pnpm test:watch
# Coverage report
pnpm test:coverageTests use Jest + jest-expo + React Native Testing Library.
Required before first web export:
pnpm run generate:staticsrc/
├── app/ # Expo Router file-based routes
│ ├── (tabs)/ # Tab screens (home, search, bookmarks, settings)
│ ├── pages/ # Quran page reader ([number].tsx)
│ └── api/ # Server-side API routes (search)
├── features/ # Feature modules (4-layer architecture)
│ ├── quran-reader/ # Page reading with swipe/keyboard navigation
│ ├── search/ # Composite search (structural + text) with React Query
│ ├── bookmarks/ # Verse bookmarking with optimistic updates
│ └── settings/ # Theme and language preferences
├── entities/ # Shared data repositories
├── components/ # Shared UI components
├── hooks/ # Shared React hooks
├── shared/ # Constants, i18n, utilities
└── types/ # TypeScript type definitions
See ARCH.md for detailed architecture documentation.
| Layer | Technology |
|---|---|
| Framework | Expo 54 (New Architecture) |
| UI | React Native 0.81 / React 19 + React Compiler |
| Routing | Expo Router 6 (typed routes) |
| Styling | Tailwind CSS 4 via Uniwind |
| Data | TanStack React Query 5 |
| Database | expo-sqlite (native) / sql.js (web API) / static JSON (web client) |
| Lists | @shopify/flash-list |
| i18n | Lingui 5 |
| Animation | Reanimated 4 |
- Quran text: Uthmanic Hafs script from Tanzil.net
- Fonts: UthmanicHafs V22, SurahNames V4, JuzNames V2 by KFGQPC
- Database: SQLite with FTS5 full-text search on simplified Arabic text
- Static export: 604 pre-generated page JSON files for web
docker build -t sakina-quran .
docker run -p 3000:3000 sakina-quran- PR checks: Test → Lint → Expo prebuild → Web export
- Deploy: Push to
mainordevelopment→ Docker build → MicroK8s - Releases: Auto-tagged from
app.jsonversion on merge tomain
| Branch | Environment | URL |
|---|---|---|
main |
Production | quran.mr3od.dev |
development |
Development | quran-dev.mr3od.dev |
- Create a feature branch from
development - Use conventional commits:
feat:,fix:,chore:,docs: - Open PR to
development - PRs to
mainrequire a version bump inapp.json
MIT
- Quran text from Tanzil.net
- Uthmanic Hafs font by KFGQPC
- Built with Expo & React Native