Accurate prayer times for Muslims, every device, every method, free forever.
Live: praycalc.com | Docs: praycalc.org
P7 status (2026-05): Stripe TEST mode only. Payment-gated features (Ummat+ premium) use Stripe TEST keys. No live charges. See Changelog for P7 updates.
Before contributing, read .github/wiki/ENGINEERING-CHARTER.md. It is the single source of truth for code standards across every Ummeco repo. The most-read sections:
PrayCalc is a free, GPS-accurate Islamic prayer time calculator for web and mobile. It supports all major calculation methods (ISNA, MWL, Egypt, Umm al-Qura, Tehran, Karachi), Qibla direction, adhan reminders, and offline mode. It also powers prayer times across the Ummat app ecosystem.
- All major calculation methods (ISNA, MWL, Egypt, Umm al-Qura, Tehran, Karachi)
- GPS-based location with city search
- Qibla compass direction
- Adhan audio notifications with multiple reciters
- Monthly/yearly prayer calendars with PDF export
- PWA with full offline support (service worker + IndexedDB caching)
- 8 languages (EN, AR, TR, UR, ID, FR, BN, SO) with RTL
- Countdown to next prayer
- Dark mode (WCAG 2.2 AA, system-preference-aware)
- Accessible (WCAG 2.2 AA — axe audited, Playwright viewport matrix)
- Ummat+ premium features: smart home display, TV widget, home screen widgets
| Layer | Tech |
|---|---|
| Web | Next.js 15, TypeScript, Tailwind CSS |
| Mobile | Flutter (iOS + Android + macOS + Windows + Linux + TV + Watch + Smart Display) |
| Backend platform | nSelf (100% — self-hosted PaaS on Hetzner) |
| API | Hasura GraphQL Engine (all data access via GraphQL, no direct SQL) |
| Auth | Hasura Auth — shared SSO at auth.ummat.dev |
| Docs site | Next.js + MDX |
| i18n | next-intl (8 locales) |
| PWA | Serwist (service worker, offline caching) |
| Testing | Vitest (unit), Playwright (E2E, 3-viewport matrix) |
| Deploy | Vercel (projects: ummat-praycalc, ummat-praycalc-org) |
praycalc/
├── web/ praycalc.com — Next.js web app
├── org/ praycalc.org — documentation site
└── flutter/ iOS + Android + macOS + Windows + Linux + TV + Watch + Smart Display
Start the shared Ummat backend first:
cd ~/Sites/ummeco/ummat/backend && nself startWeb app:
cd web
cp .env.example .env.local # fill in local Hasura + auth URLs
pnpm install
pnpm dev # https://www.praycalc.local.nself.org:8543Docs site:
cd org
pnpm install
pnpm dev # http://localhost:3003Flutter app:
cd flutter
flutter pub get
flutter runAll data access goes through Hasura GraphQL. Never use direct SQL or install pg / drizzle-orm at runtime. See .github/docs/settings-architecture.md for the GraphQL client pattern and env var reference.
Local API: https://api.praycalc.local.nself.org:8543/v1/graphql (port 8543)
Production API: https://api.praycalc.com/v1/graphql
See .github/wiki/Contributing.md for architecture docs, contribution guidelines, and feature status.