Al Marfa Duroos — a free offline-first audio app for the complete Sharah Kitab al-Tawheed lecture series by Shaikh Abdullah Nasir Rahmani Hafizahullah. Stream or download all 50 lectures, follow the structured study programme class by class, and listen with full lock-screen and notification controls.
kitabattawheed.com · Play Store · YouTube — Al Marfa Duroos · Al Marfa Technologies
- 50 lectures · 27+ hours — the complete Sharah Kitab al-Tawheed series
- Offline playback — download any lecture for listening without a connection
- Study Mode — 15 structured classes to work through the series systematically
- Background audio — lock-screen controls and notification transport on Android and iOS
- Multilingual — English, Urdu, and Roman Urdu interface
- Daily Benefit — a rotating Quranic reminder on the home screen
- Bookmarks — save any lecture to revisit later
- Variable speed — 0.75× to 2.0× playback
UI screens never talk to services directly — all shared state flows through
provider/ChangeNotifier providers, which wrap the services that do
networking, persistence, and playback. lib/app.dart wires the full provider
tree with explicit dependency ordering.
lib/
app.dart, app_config.dart, main.dart # App shell, remote config, entry point
screens/ # Routed pages (home, player, library, settings …)
widgets/ # Reusable UI pieces (lecture tiles, offline sheet …)
providers/ # ChangeNotifier state: catalog, downloads, progress,
# connectivity, language, theme, feature flags …
services/ # Networking, persistence, downloads, notifications
audio/ # just_audio / audio_service integration
models/ # Data classes (lecture/catalog, announcements …)
theme/ # AppColors, ThemeData, Typography
l10n/ # Localization resources (ARB files)
Remote config — all brand strings, feature flags, and content URLs are driven
from a CDN JSON file (app-config.json). Branding and feature changes require no
app release.
Offline-first — ConnectivityProvider and DownloadsProvider drive download
state. RemoteContentService serves the catalog with a stale-while-revalidate
strategy so the app always opens instantly.
Singletons — PreferencesService, CatalogService, and
DownloadNotificationService are singletons (.instance) rather than
constructor-injected. They must be initialised synchronously before the
MultiProvider tree is built — this is a deliberate exception, not an oversight.
flutter pub get
flutter run -d <device-id>Android release signing requires android/key.properties (gitignored).
See docs/setup.md for the full environment setup including
signing and platform-specific notes.
flutter test # unit + widget tests
flutter test integration_test/app_test.dart -d <id> # end-to-end on device| Setup | Environment, dependencies, signing |
| CI/CD | Pipelines, pre-push hook, release workflow |
| Deployment | Build & machine setup guide |
| Release Runbook | Step-by-step production release process |
| Git workflow | Branching, commits, PRs |
| Testing | Running and writing tests |
| i18n architecture | Multilingual content strategy |
| Remote content strategy | Catalog/announcement caching |
| Troubleshooting | Common errors and fixes |
Built by Al Marfa Technologies · kitabattawheed.com


