Track Your Journey Back to Allah.
Source-available for personal and educational use. See CONTRIBUTING.md (includes Conventional Commits / pnpm commit) · docs/OPEN_SOURCE.md.
This is a pnpm + Turborepo monorepo:
| App / package | Path | Purpose |
|---|---|---|
| Product app | apps/app |
Expo SDK 57 — iOS, Android, Web, Apple TV / Android TV (single codebase) |
| Marketing site | apps/marketing-web |
Next.js 16 landing site (port 3000) |
| API server | apps/api |
NestJS 11 — auth + cloud sync (port 3001) |
| Admin console | apps/admin |
Next.js ops console (port 3002) — users, reports, broadcasts |
@munib-tracker/shared |
packages/shared |
Domain types, constants, validators, content, achievements |
@munib-tracker/db |
packages/db |
Drizzle schema mirror for admin (DDL owned by API TypeORM migrations) |
@munib-tracker/live-activity-delivery |
packages/live-activity-delivery |
ActivityKit APNs client + atomic job claim/deliver |
@munib-tracker/surface-push-delivery |
packages/surface-push-delivery |
Expo + Web Push senders + surface job claim/deliver |
@munib-tracker/store-screenshots |
packages/store-screenshots |
Shared App Store / Play screenshot specs |
@munib-tracker/theme |
packages/theme |
Design tokens, accent palette, resolveTheme() |
@munib-tracker/api-contract |
packages/api-contract |
OpenAPI spec exported from the API |
@munib-tracker/api-client |
packages/api-client |
Orval-generated fetch + TanStack Query SDK |
@munib-tracker/typescript-config |
packages/typescript-config |
Shared TS configs |
@munib-tracker/vitest-config |
packages/vitest-config |
Vitest presets |
Note: apps/marketing-web (port 3000), apps/api (port 3001), apps/admin (port 3002), and apps/app web (Expo, ~8081) are different apps. Screenshot framing lives in tools/screenshot-studio/ (not a workspace package; port 3010).
- Node.js ≥ 20.9 (CI uses Node 22)
- pnpm 9.15 (
corepack enable) - For native dev: Xcode (iOS) and/or Android Studio (Android)
pnpm install # always from repo root
pnpm dev # all dev servers (turbo)
pnpm dev:app # Expo product app
pnpm dev:marketing-web # Next.js marketing site (:3000)Universal Expo app for salah, zikr, qaza, and Islamic content — offline-first and cross-platform.
| Command | Description |
|---|---|
pnpm --filter app dev |
Expo dev server — pick platform in CLI |
pnpm --filter app ios |
Build + launch iOS simulator (dev build) |
pnpm --filter app android |
Build + launch Android emulator (dev build) |
pnpm --filter app web |
Product app in browser (~8081) |
pnpm --filter app build:data |
Regenerate bundled content (adhkar, duas, names, Qur'an, hadith highlights) |
Platform:
- Expo SDK 57 with React Compiler, typed routes,
expo-dev-client - Offline-first persistence on AsyncStorage (
src/db/repositories + a zero-depuseSyncExternalStorestore), no SQLite - Centralized
ThemeProvider— light/dark/system + preset & custom-hex accents (persisted) - Full i18n (23 locales: English + 22 translations; RTL for Arabic, Urdu, Persian, Pashto, Kurdish); motion + a11y (WCAG AA contrast, ≥44pt targets) design system
Worship & tracking:
- Prayer tracker (5 fard + Witr + sunnah) with statuses, notes, streaks
- Qaza suite — counters, lifetime calculator, daily planner, and fasting tracking
- Zikr / Adhkar library + favorites, tasbeeh counter (library-driven, free, and custom)
- Activity calendar (Gregorian + Hijri), day detail, statistics, achievements ("Noor" devotion levels)
Content library (offline, sourced from open datasets):
- Qur'an reader (translations, transliteration, audio, bookmarks, search)
- Hadith collections, full Hisnul Muslim duas, duroods, and the 99 Names
- Universal fuzzy search (Fuse.js) across every content source
Times, location & platform:
- On-device prayer times (
adhan) + live location, Hijri date, sky/moon hero, weather effects - Qibla compass, opt-in local notifications/reminders, guest-first auth with optional cloud sync
Next.js 16 marketing landing page with Tailwind CSS v4.3.
| Command | Description |
|---|---|
pnpm --filter marketing-web dev |
Dev server on port 3000 |
pnpm --filter marketing-web build |
Production build |
Features:
cacheComponents: true, Metadata API,sitemap.ts,robots.ts- Server Components by default; Tailwind v4
@sourcescans monorepo packages
NestJS 11 backend for authentication and cloud sync (port 3001, base path /api/v1).
| Command | Description |
|---|---|
pnpm --filter api dev |
Dev server on port 3001 (Swagger UI at /docs) |
pnpm --filter api test |
Unit tests · test:e2e for end-to-end |
pnpm generate:api |
Export OpenAPI → regenerate the typed @munib-tracker/api-client |
Features:
- TypeORM persistence — PostgreSQL in prod, in-memory SQLite for tests; migrations under
src/database/migrations/ - Guest sessions + OAuth (Google/Apple/Facebook), signed JWT access tokens with refresh-token rotation
- Cloud sync (
/sync/pull,/sync/push) — last-write-wins, guest-blocked
Import workspace packages by name:
import { APP_NAME, TRACKER_CATEGORIES } from "@munib-tracker/shared/constants";
import { resolveTheme } from "@munib-tracker/theme/resolve";| Tool | Usage |
|---|---|
| Biome | Lint + format (pnpm lint, pnpm format-and-lint:fix) |
| Turborepo | Task orchestration (pnpm turbo run build lint check-types test) |
| Husky | pre-commit: Biome autofix staged files; commit-msg: commitlint (Conventional Commits); pre-push: pnpm check:ci |
| Commitizen | Interactive conventional commits via pnpm commit |
| Vitest | marketing-web, api, and package tests |
| Jest | apps/app unit + feature tests |
pnpm test # all tests via turbo
pnpm --filter marketing-web test # Vitest
pnpm --filter api test # Vitest (unit) · test:e2e for e2e
pnpm --filter app test # Jest + Testing Library RNUnit + feature tests only — no Playwright or Maestro E2E in CI. Maestro drives store screenshot capture (pnpm screenshots:*; see docs/STORE_ASSETS.md).
- Root:
AGENTS.md— monorepo conventions - Product:
apps/app/AGENTS.md— Expo app + Fuse.js search rules - Marketing:
apps/marketing-web/AGENTS.md - Admin:
apps/admin/AGENTS.md - API:
apps/api/AGENTS.md— NestJS backend - Planning:
docs/—BACKLOG.md,FEATURES.md, and topic guides (docs/README.md)
Official skills installed: vercel/turborepo, expo/skills, vercel/next.js, plus .agents/skills/{nestjs,fuse-js}.
- CONTRIBUTING.md — setup, PR checklist, content rules
- CODE_OF_CONDUCT.md · SECURITY.md · SUPPORT.md
- Maintainer checklist: docs/OPEN_SOURCE.md
No sponsorship, funding, or donations are accepted at this time. Do not send money to anyone claiming to collect funds on behalf of Munib Tracker. There is no GitHub Sponsors button or official payment link.
![]() Mubbasher Ahmed Qureshi 💻 🎨 📖 🚧 |
This project follows the all-contributors specification. Contributions of any kind welcome — see CONTRIBUTING.md.
Please consider sharing a post about Munib Tracker and the value it provides. It really does help!
This project is licensed under the PolyForm Noncommercial License 1.0.0.
You may: use, study, modify, and redistribute the software for personal, educational, religious, charitable, and other non-commercial purposes.
You may not: sell this software, sell customized versions of it, or use it for a commercial purpose without a separate license from the copyright holder.
Attribution required: keep LICENSE and NOTICE, and credit Munib Tracker with a link to https://munibtracker.app.
Required Notice: Copyright (c) 2026 Mubbasher Ahmed Qureshi — Munib Tracker (https://munibtracker.app)
Third-party Islamic datasets and libraries remain under their own licenses — see docs/FREE_OPEN_SOURCE_DATA.md and Credits.
