All Projects

Islami Jindegi

Independent Islamic knowledge platform — sole technical maintainer. ASP.NET Core .NET 10 backend + Flutter app with offline-first content sync, prayer alarm engine, Quran/audio streaming, and Riverpod reactive state.

FlutterRiverpodASP.NET CoreC#PostgreSQLEF CoreAWS S3FirebaseDriftjust_audio
S Situation

Islami Jindegi needed a comprehensive Islamic knowledge platform for Bengali-speaking Muslims — covering Quran access with multiple mushafs and tafsir, audio sermons (bayans), daily teachings (malfuzats), Islamic Q&A (masails), duas, prayer times, Qibla finder, and mosque locator — all accessible online and offline.

T Task

I built both the ASP.NET Core backend and the Flutter mobile app end-to-end: content delivery infrastructure on the server side, and the full offline-first user experience on the client side.

A Actions
  • Built an ASP.NET Core (.NET 10) minimal API with 8 endpoint groups (authors, books, bayans, chapters, categories, malfuzats, masails, duas) — each with search, category/author filtering, published status, and PagedResult<T> pagination.
  • Designed the PostgreSQL schema with EF Core: self-referencing hierarchical Category (parent/children), many-to-many junctions (book_authors, book_categories, bayan_categories, etc.), and a Book → Chapter → SubChapter tree with position-based ordering.
  • Integrated Tigris S3-compatible object storage via AWS SDK — images (JPEG/PNG/WebP, max 10MB) and PDFs (max 100MB) uploaded to static.islamijindegi.com with public-read ACL and randomised GUID keys.
  • Containerised with a multi-stage Docker build (SDK → ASP.NET runtime) and deployed on Fly.io (Mumbai region) with auto-scaling 0→1 machines — zero idle cost, HTTPS-enforced, EF Core migrations run automatically on startup.
  • Built the Flutter app with Riverpod 2 as the reactive backbone — FutureProvider for async API calls with autoDispose, AsyncNotifier for download tracking, StateProvider for playback state — and go_router with 30+ named typed routes including wakelock auto-management per route.
  • Implemented a multi-layer offline strategy: a pre-bundled read-only Quran SQLite DB loaded via Drift ORM, plus an 8-feature offline DB prefetch system (books, duas, malfuzats, articles, madrasahs, masails, bayans, misc) that downloads and atomically swaps per-feature databases in the background with version tracking in SharedPreferences — seamlessly switching between online Dio API and offline SQLite service per feature.
  • Built a prayer alarm engine using the Adhan algorithm for location-based prayer time calculation — GPS + reverse geocoding + DST-aware timezone handling, 4 configurable azan sounds, pre/post waqt offset modes, weekday-specific scheduling, and deterministic alarm IDs (101–105 before, 201–205 after) that survive app kill via the device alarm system.
  • Implemented Quran recitation and bayan audio streaming with just_audio: resolves local cached file first before streaming, ownership tracking to prevent disposal race conditions, and verse-level indexed scroll via scrollable_positioned_list with 8 bundled Arabic/Quranic typefaces.
  • Shipped an Android home screen widget updated every 15 minutes via a Workmanager background isolate writing prayer times to SharedPreferences — fully decoupled from the main app process.
  • Integrated Firebase FCM with on-tap notification routing (pushes to named go_router screen or launches URL), Crashlytics for crash reporting, and Analytics for event tracking — both enabled only in release builds.
R Results
  • Live at islamijindegi.com with app published on Google Play — serves Bengali-speaking users across web and mobile.
  • App functions fully offline after initial sync — users read books, listen to bayans, and access duas without any internet connection.
  • Prayer alarms fire reliably even when the app is killed, backed by the device native alarm system.
  • Zero idle infrastructure cost on Fly.io auto-scaling — backend spins up on first request and stops when inactive.