Home About Skills Experience Projects Certifications GitHub ↗ Hire me
← Back to Portfolio
Muslim App icon
Personal Project · Islamic Lifestyle · Personal Project · Sep 2024 – Aug 2025

Muslim App

Overview

Muslim App is a cross-platform Flutter app (Android, iOS, plus desktop/web build targets) that bundles the daily-practice essentials for Muslim users into one offline-first place: the full Quran, a Hadith collection, morning/evening and situational Azkar, a digital Sebha counter, a Zakat calculator, and live Quran radio streams. The Quran (114 surah text files) and Hadith corpus ship inside the app bundle, so everything except radio works with no network connection. The entire UI is fully bilingual Arabic/English with light and dark themes, and the user's language and theme choices persist across launches.

4-in-1Quran, Hadith, Azkar & Zakat in one app
AR / ENFully bilingual with light & dark themes
OfflineQuran and Hadith bundled — no connection needed
Core Capabilities

What the app does

📖
Full Quran Reader

All 114 surahs read from bundled asset files and rendered verse-by-verse in RTL with authentic Arabic-numeral verse-end ornaments.

📜
Hadith Collection

A bundled Hadith corpus parsed at runtime from language-specific text files, switching between the Arabic and English source based on the active locale.

🤲
Azkar & Duaa Library

Curated sets of morning, evening, waking, sleeping, after-prayer azkar and duaa, browsable from the home screen as illustrated cards.

📿
Digital Sebha

An animated rotating tasbih counter that cycles through the six standard post-prayer azkar as the count advances.

🧮
Zakat Calculator

A live 2.5% zakat calculation that updates in real time as the user types the amount.

📻
Live Quran Radio

Streams reciter radio stations fetched from the mp3quran.net API, with play/pause and next/previous station controls.

🌍
Arabic / English Localization

Complete bilingual UI with a custom Arabic font and correct RTL text direction throughout.

🌓
Persistent Theme & Language

Light/dark theming and locale selection saved to SharedPreferences so they survive app restarts.

🚀
Remote Update Prompt

Firebase Remote Config compares the latest published version against the installed one and prompts users to update.

📱
Responsive Layout Engine

A custom clamped font-scaling helper keeps typography and spacing readable across phone, tablet, and desktop widths.

Architecture

How it's built

A layered, feature-folder Flutter app using Provider (ChangeNotifier) as the single state management solution — no Bloc/Cubit anywhere in the project. main.dart handles bootstrap only (Firebase init, sizing, Dio client init, package info lookup) and wraps the app in a single ChangeNotifierProvider that exposes a SettingsProvider owning theme mode, locale, and radio player state.

Code is organized as core (Dio helper, constants, launch-url helper), model (plain data models for Quran, Hadith, Sura and Radio), screens (one folder per feature: home, layout, quran, hadith, sebha, radio, settings), and shared (theme, reusable widgets, asset paths, the provider). Navigation is a named-route table on MaterialApp with a bottom-navigation shell as the initial route.

main() bootstraps Firebase, sizing, and the Dio client→A single ChangeNotifierProvider<SettingsProvider> wraps the app→Saved language and theme are rehydrated from SharedPreferences→MaterialApp resolves locale, theme, and the named-route table→Bottom-nav shell renders Home, Hadith, Quran, Sebha, Radio→Content screens read Quran/Hadith/Azkar from bundled assets→RadioScreen reads live data via SettingsProvider + Dio→Settings changes write to SharedPreferences and notify listeners to rebuild the tree
Walkthrough

See it in action

Muslim App Screenshots Banner
Splash
Splash
Quran List
Quran List
Sura Details
Sura Details
Hadith List
Hadith List
Splash Dark
Splash Dark
Quran List Dark
Quran List Dark
Sura Details Dark
Sura Details Dark
Problems Solved

Real engineering challenges

Typography
Text broke layouts on devices with large system font settings

Arabic and English strings rendered at very different sizes across devices, and OS-level font scaling pushed text out of cards entirely. The fix pins the app's text scaling to a fixed value so system font settings can't distort the layout, plus a responsive font-size helper that adapts to screen width but clamps the result to ±20% of the design size, so text never overflows. Every screen was migrated to that helper.

Localization
System locale auto-detection was the wrong default and broke RTL text

An attempt to auto-detect the device locale and follow the system theme was rolled back two days later: it silently overrode the language and theme the user had explicitly chosen and saved. The app went back to being driven entirely by the user's stored preference. The same pass fixed RTL rendering in the Zakat screen, where Arabic text and the numeric input needed explicit right-to-left direction handling to align correctly.

Release Ops
Shipping update prompts without waiting on a store rollout

To stop users sitting on stale builds, the app checks a remotely published version number against the installed one — comparing version segments individually rather than as plain strings, so 1.2.10 correctly compares above 1.2.9. The whole check is wrapped so a failed fetch can never block startup, and the update prompt notifies users to download the update.

Desktop Build
Sandboxed macOS release build couldn't reach the network

The macOS release build ships sandboxed, which blocked outbound network calls that worked fine in debug. The release entitlements needed explicit network-client permissions added for the app to reach the radio API in a signed release build.

Technologies Employed

Built with

FlutterProviderChangeNotifierSharedPreferencesDioaudioplayersFirebase CoreFirebase Remote Configflutter_screenutilflutter_localizations / intlurl_launcherpackage_info_plusShorebird code push
Screenshot preview