Accurate prayer times for Muslims, every device, every method, free forever.
Live: praycalc.com | Docs: praycalc.org
Billing status (2026-07): Stripe is not yet provisioned for this account. /upgrade shows a "launching soon" state instead of checkout — no live charges. Accounts, sign-in, and the free calculator work today on every surface. See Changelog.
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 account sign-in on web, mobile, and desktop — one login across the ecosystem
- Ummat+ ($9.99/yr): unlocks the TV app and Smart Home integrations (Google Home, Alexa)
- Desktop menu bar / tray app for macOS, Windows, Linux with live countdown
| Layer | Tech |
|---|---|
| Web | Astro, TypeScript, Tailwind CSS |
| Mobile (Active) | React Native + Expo SDK 53 (iOS + Android) + react-native-tvos (TV platforms) |
| Mobile (Archive) | Flutter 1.2.3 — archived branch (D-P2-PRAYCALC-RN) |
| Desktop | Tauri 2 + Vite + React 19 (macOS, Windows, Linux) |
| 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 | Astro + 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 — Astro web app
├── org/ praycalc.org — documentation site
├── desktop/ menu bar / tray app — Tauri 2 + Vite + React 19 (macOS, Windows, Linux)
└── 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:3003Desktop app:
cd desktop
pnpm install
pnpm tauri devFlutter app:
cd flutter
flutter pub get
flutter runLatest release: desktop-v1.1.1
| Platform | Installers |
|---|---|
| macOS (arm64) | .dmg, .app.tar.gz |
| Windows (x64) | .msi, .exe |
| Linux (x64) | .deb, .AppImage, .rpm |
All 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.