# JamShalat — Phase-Based Implementation Tasklist

**Project:** JamShalat Flutter App  
**PRD Reference:** `PRD.md`  
**Design Reference:** `stitch/` folder (18 screens)  
**Last Updated:** March 2026

---

## How to Use This Document

- **Status legend:** `[ ]` Not started · `[~]` In progress · `[x]` Done · `[-]` Skipped/deferred
- **Dependency notation:** Tasks marked with `⚠️ depends on: [task ref]` must not start until that task is complete
- **Assignable units:** Each task is atomic enough to delegate to a single agent/developer
- **Phase gates:** Do not start a phase until all `[x]` required tasks in the previous phase are complete

---

## Phase 1 — Foundation
> **Goal:** Runnable Flutter app with navigation shell, design system, and theme engine wired up.  
> **Gate to Phase 2:** App boots, bottom nav switches tabs, light/dark toggle works.

### 1.1 Project Bootstrap
- [ ] **1.1.1** Create Flutter project: `flutter create jamshalat_diary --org com.jamshalat --platforms android,ios`
- [ ] **1.1.2** Add all dependencies to `pubspec.yaml` (see PRD §8 — Third-Party Dependencies)
- [ ] **1.1.3** Run `flutter pub get` and verify zero conflicts
- [ ] **1.1.4** Configure `analysis_options.yaml` with strict linting rules (`flutter_lints` + `prefer_const_constructors`)
- [ ] **1.1.5** Set up folder structure as defined in PRD §4.1 (create all `lib/` directories and placeholder files)
- [ ] **1.1.6** Add font assets to `pubspec.yaml`: Google Fonts (Plus Jakarta Sans via `google_fonts` package) + Amiri (bundled TTF in `assets/fonts/`)
- [ ] **1.1.7** Add asset directories to `pubspec.yaml`: `assets/fonts/`, `assets/quran/`, `assets/dzikir/`, `assets/images/`
- [ ] **1.1.8** Configure Android `minSdkVersion: 21`, `targetSdkVersion: 34` in `android/app/build.gradle`
- [ ] **1.1.9** Configure iOS deployment target: 13.0 in `ios/Podfile`

### 1.2 Design System
- [ ] **1.2.1** Create `lib/app/theme/app_colors.dart` — all color tokens from PRD §3.1 (light + dark values as static consts)
- [ ] **1.2.2** Create `lib/app/theme/app_text_styles.dart` — full `TextTheme` from PRD §3.2 (Plus Jakarta Sans weights, Amiri definitions)
- [ ] **1.2.3** Create `lib/app/theme/app_theme.dart` — `ThemeData` for light and dark using tokens from 1.2.1 + 1.2.2; Material 3 enabled
- [ ] **1.2.4** Create `lib/core/widgets/ios_toggle.dart` — custom iOS-style toggle widget (51×31dp, animated thumb, `AnimatedContainer` + `GestureDetector`) per PRD §6.9
- [ ] **1.2.5** Create `lib/core/widgets/section_header.dart` — reusable section label widget (uppercase, tracking-wider, sage color)
- [ ] **1.2.6** Create `lib/core/widgets/progress_bar.dart` — reusable linear progress bar (primary fill, configurable height + borderRadius)
- [ ] **1.2.7** Verify `AppColors` against all 18 stitch screens — no hardcoded colors in any widget

### 1.3 Navigation Shell
- [ ] **1.3.1** Add `go_router` and set up `lib/app/router.dart` with `ShellRoute` for bottom nav tabs
- [ ] **1.3.2** Define all routes from PRD §5.2 in `router.dart` (top-level + nested)
- [ ] **1.3.3** Create `lib/core/widgets/bottom_nav_bar.dart` — 5-tab nav bar per PRD §5.1 spec (active/inactive states, Material Symbols filled/outlined)
- [ ] **1.3.4** Create stub screens for all 9 features (empty `Scaffold` + `AppBar` with feature name) so routing is testable
- [ ] **1.3.5** Create `lib/app/app.dart` — `MaterialApp.router` wired to `router.dart` + `themeMode` from Riverpod provider

### 1.4 Theme Engine
- [ ] **1.4.1** Create `lib/core/providers/theme_provider.dart` — `StateProvider<ThemeMode>` initialized from Hive settings
- [ ] **1.4.2** Wrap `MaterialApp` in `ProviderScope`; consume `themeProvider` for `themeMode`
- [ ] **1.4.3** Verify light ↔ dark toggle visually applies instantly on all stub screens
- [ ] **1.4.4** Create `lib/main.dart` — initializes Hive, runs `ProviderScope` + `App`

---

## Phase 2 — Core Data Layer
> **Goal:** All services and local storage ready. Features can read/write data.  
> **Gate to Phase 3:** Prayer times calculate correctly for Jakarta coords, Hive boxes open without errors, notifications schedule in emulator.  
> ⚠️ Depends on: Phase 1 complete

### 2.1 Hive Setup
- [ ] **2.1.1** Create all 6 Hive `@HiveType` model classes from PRD §7.1: `AppSettings`, `ChecklistItem`, `DailyWorshipLog`, `DzikirCounter`, `QuranBookmark`, `CachedPrayerTimes`
- [ ] **2.1.2** Run `build_runner` to generate Hive `TypeAdapter` files (`*.g.dart`)
- [ ] **2.1.3** Create `lib/data/local/hive_boxes.dart` — box name constants + `initHive()` function that opens all boxes
- [ ] **2.1.4** Call `initHive()` in `main.dart` before `runApp()`
- [ ] **2.1.5** Seed default `AppSettings` on first launch (if settings box is empty)
- [ ] **2.1.6** Seed default 10 `ChecklistItem` entries on first launch (per PRD §6.3 default items table)

### 2.2 Prayer Time Service
- [ ] **2.2.1** Create `lib/data/services/prayer_service.dart` using `adhan` package
  - Method: `PrayerTimes getPrayerTimes(double lat, double lng, DateTime date)`
  - Calculation method: Muslim World League (default), configurable in settings
  - Returns: Fajr, Sunrise, Dhuhr, Asr, Maghrib, Isha as `DateTime`
- [ ] **2.2.2** Implement cache logic: before calculating, check `CachedPrayerTimes` Hive box for existing `lat_lng_date` key; write result to box after calculation
- [ ] **2.2.3** Create `lib/features/dashboard/data/prayer_times_provider.dart` — `AsyncNotifierProvider` that fetches location then returns today's `PrayerTimes`
- [ ] **2.2.4** Unit test: `getPrayerTimes(lat: -6.2088, lng: 106.8456, date: 2026-03-06)` → verify Maghrib ≈ 18:05 WIB

### 2.3 Location Service
- [ ] **2.3.1** Create `lib/data/services/location_service.dart`
  - Method: `Future<Position?> getCurrentLocation()` — requests permission, gets GPS fix
  - Method: `Position? getLastKnownLocation()` — reads from `AppSettings` Hive box
  - Method: `Future<String> getCityName(double lat, double lng)` — reverse geocode via `geocoding` package
- [ ] **2.3.2** Implement fallback chain: GPS → last saved → manual city picker
- [ ] **2.3.3** Save successful GPS fix to `AppSettings` (lat, lng, cityName) after each successful fetch
- [ ] **2.3.4** Add `ACCESS_FINE_LOCATION` permission to Android `AndroidManifest.xml`
- [ ] **2.3.5** Add `NSLocationWhenInUseUsageDescription` to iOS `Info.plist`

### 2.4 Notification Service
- [ ] **2.4.1** Create `lib/data/services/notification_service.dart` using `flutter_local_notifications`
  - Method: `Future<void> init()` — initializes channels (Android: high-priority Adhan channel)
  - Method: `Future<void> scheduleAdhan(Prayer prayer, DateTime time)` — schedules exact alarm
  - Method: `Future<void> scheduleIqamah(Prayer prayer, DateTime adhanTime, int offsetMinutes)` — schedules iqamah reminder
  - Method: `Future<void> cancelAll()` — cancels all pending notifications
  - Method: `Future<void> rescheduleAll(PrayerTimes times, AppSettings settings)` — cancels + re-schedules based on current settings
- [ ] **2.4.2** Add `SCHEDULE_EXACT_ALARM` + `POST_NOTIFICATIONS` permissions to Android manifest
- [ ] **2.4.3** Add iOS background modes for notifications in `Info.plist`
- [ ] **2.4.4** Call `rescheduleAll()` on app start and whenever settings or location changes
- [ ] **2.4.5** Manual test: enable Fajr notification in settings → verify notification fires at correct time in emulator

### 2.5 Quran Data Service
- [ ] **2.5.1** Source or create `assets/quran/quran_id.json` — 114 Surahs, each entry: `{ id, nameArabic, nameLatin, verseCount, juzStart, verses: [{id, arabic, transliteration, translation_id}] }`
- [ ] **2.5.2** Create `lib/data/services/quran_service.dart`
  - Method: `Future<List<Surah>> getAllSurahs()` — loads + parses JSON asset (cached in memory after first load)
  - Method: `Future<Surah> getSurah(int id)` — returns single surah with all verses
- [ ] **2.5.3** Verify JSON loads correctly; log verse count for Surah 2 (Al-Baqarah) = 286 verses

### 2.6 Dzikir Data Service
- [ ] **2.6.1** Create `assets/dzikir/dzikir_pagi.json` and `assets/dzikir/dzikir_petang.json` — each entry: `{ id, arabic, transliteration, translation, target_count, source }`
- [ ] **2.6.2** Create `lib/data/services/dzikir_service.dart`
  - Method: `Future<List<DzikirItem>> getDzikir(DzikirType type)` — loads from JSON asset
  - Method: `Map<String, int> getCountersForDate(String date)` — reads from Hive `dzikir_counters` box
  - Method: `void increment(String dzikirId, String date)` — writes to Hive

---

## Phase 3 — Dashboard & Prayer Calendar
> **Goal:** The two primary daily-use screens are fully functional.  
> **Gate to Phase 4:** Dashboard shows live countdown, correct prayer times, checklist summary. Imsakiyah shows full monthly table.  
> ⚠️ Depends on: Phase 2 complete

### 3.1 Dashboard Screen
- [ ] **3.1.1** Build `DashboardScreen` sticky header: avatar + greeting + notification bell (taps → Settings)
- [ ] **3.1.2** Build Next Prayer Hero Card: bg-primary card, prayer name+time (displayLarge), live countdown timer widget
  - Countdown: `StreamBuilder` on `Stream.periodic(Duration(seconds: 1))` computing time to next prayer
- [ ] **3.1.3** Build Adhan/Iqamah badge: notification bell icon absolutely positioned on active prayer card (shown when Adhan has been called, hidden otherwise)
- [ ] **3.1.4** Build "View Qibla" button on hero card → navigates to `/tools/qibla`
- [ ] **3.1.5** Build Prayer Times horizontal scroll: `ListView.builder` horizontal, 5 prayer cards (Fajr–Isha), active card highlighted
- [ ] **3.1.6** Build Today's Checklist Summary Card: circular SVG progress + 2 preview items + "View Full Checklist" CTA
- [ ] **3.1.7** Build Weekly Progress bar chart: 7 bars (Mon–Sun), data from `worship_logs` Hive box
- [ ] **3.1.8** Wire `prayer_times_provider` to all prayer time displays
- [ ] **3.1.9** Wire checklist summary to today's `DailyWorshipLog` from Hive
- [ ] **3.1.10** Verify screen matches `stitch/dashboard_active_nav/screen.png` visually

### 3.2 Prayer Calendar (Imsakiyah) Screen
- [ ] **3.2.1** Build Imsakiyah screen header: back + "Prayer Calendar" + `more_vert`
- [ ] **3.2.2** Build Hijri month selector: horizontal scroll chip row; compute current + surrounding Hijri months
- [ ] **3.2.3** Build location card: shows current city name + `expand_more` tapping opens city search bottom sheet
- [ ] **3.2.4** Build city search bottom sheet: `TextField` + `ListView` of bundled Indonesian cities (local JSON asset)
- [ ] **3.2.5** Build prayer times table: `GridView` 7-column, header row, data rows for all days of selected Hijri month
- [ ] **3.2.6** Highlight today's row with `primary/5` background
- [ ] **3.2.7** Wire month selector + location to `PrayerService` — recalculate on change
- [ ] **3.2.8** Auto-scroll to today's row on screen open
- [ ] **3.2.9** Verify screen matches `stitch/imsakiyah_active_nav/screen.png` visually

---

## Phase 4 — Worship Tracking
> **Goal:** Checklist, Dzikir, and Reports fully functional with persistent data.  
> **Gate to Phase 5:** Checklist persists across restarts, Dzikir counter works, Reports chart renders from real log data.  
> ⚠️ Depends on: Phase 2 complete (data layer), Phase 3 (worship_logs written by Dashboard)

### 4.1 Daily Checklist Screen
- [ ] **4.1.1** Build Checklist header: "Daily Worship" + date string + calendar icon (date picker for viewing past days)
- [ ] **4.1.2** Build Progress Card: dark bg, `auto_awesome` decoration, percentage text, progress bar, motivational quote
- [ ] **4.1.3** Build task list: `ListView` of `ChecklistItem` widgets with custom checkbox
- [ ] **4.1.4** Implement custom checkbox widget: 24dp, primary border, animated check SVG on tap
- [ ] **4.1.5** Wire tap → update `DailyWorshipLog` in Hive → Riverpod provider invalidate → progress card updates reactively
- [ ] **4.1.6** Implement daily reset: on date change, create new empty `DailyWorshipLog` for new date
- [ ] **4.1.7** Write completion data to `worship_logs` box (for Reports feature to consume)
- [ ] **4.1.8** Verify screen matches `stitch/checklist_active_nav/screen.png` and `stitch/checklist_dark_mode/screen.png`

### 4.2 Dzikir Screen
- [ ] **4.2.1** Build Dzikir header: back + "Dzikir Pagi & Petang" + info button (bottom sheet explanation)
- [ ] **4.2.2** Build Pagi/Petang tab bar with animated underline indicator
- [ ] **4.2.3** Build hero banner: gradient bg + title + subtitle
- [ ] **4.2.4** Build Dzikir card: Arabic text (Amiri, RTL, 24sp), transliteration (italic), translation, counter row
- [ ] **4.2.5** Implement tap counter: `+` button → increments count in Hive → rebuilds counter row reactively
- [ ] **4.2.6** Implement completion state: when `count >= target`, button becomes `check_circle`, card shows subtle primary glow
- [ ] **4.2.7** Implement smart tab pre-selection: Pagi between Fajr–Dhuhr, Petang between Maghrib–Isha
- [ ] **4.2.8** Verify Arabic text renders correctly RTL, no overflow, no visual glitches
- [ ] **4.2.9** Verify screen matches `stitch/dzikir_active_nav/screen.png` and `stitch/dzikir_dark_mode/screen.png`

### 4.3 Reports (Laporan) Screen
- [ ] **4.3.1** Build Reports header: back + "Worship Quality Report" + share button
- [ ] **4.3.2** Build Weekly/Monthly/Yearly tab bar
- [ ] **4.3.3** Build main chart card: analytics badge + completion % + trend chip
- [ ] **4.3.4** Build bar chart widget: custom `CustomPainter` or `Column`+`Expanded` bars, proportional heights from log data
- [ ] **4.3.5** Implement tap-on-bar tooltip: `OverlayEntry` or `Tooltip` showing date + exact % on tap
- [ ] **4.3.6** Build summary stats row: Best streak, Average %, Total completed
- [ ] **4.3.7** Implement streak calculation: consecutive days with completion > 0% from `worship_logs`
- [ ] **4.3.8** Implement share button: generate shareable text summary (no image generation in v1.0)
- [ ] **4.3.9** Build empty state: illustration + "Start tracking to see your progress" when no logs exist
- [ ] **4.3.10** Verify screen matches `stitch/laporan_active_nav/screen.png` and `stitch/laporan_dark_mode/screen.png`

---

## Phase 5 — Islamic Tools
> **Goal:** Qibla, Quran Reader, and Murattal player fully functional.  
> **Gate to Phase 6:** Qibla compass rotates with device, Quran displays all 114 Surahs, audio plays in background.  
> ⚠️ Depends on: Phase 2 complete (data layer)

### 5.1 Qibla Finder Screen
- [ ] **5.1.1** Build Qibla header: back + "Qibla Finder" + `my_location` button
- [ ] **5.1.2** Build location + degree display: city name + `"{n}°} from North"` label
- [ ] **5.1.3** Build compass widget: circular ring with N/S/E/W labels, `AnimatedRotation` driven by `flutter_compass` stream
- [ ] **5.1.4** Build Qibla arrow: overlaid pointer that stays fixed to calculated Qibla bearing while compass ring rotates
- [ ] **5.1.5** Build mosque silhouette overlay: `ShaderMask` with gradient mask (fade-to-transparent at top)
- [ ] **5.1.6** Build accuracy indicator: "High accuracy" / "Low accuracy" label based on sensor data
- [ ] **5.1.7** Build permission-denied state: explanation card + "Open Settings" button
- [ ] **5.1.8** Verify compass direction is correct for Jakarta coordinates (Qibla ≈ 295° from North)

### 5.2 Quran List Screen
- [ ] **5.2.1** Build Quran list screen header: search bar at top
- [ ] **5.2.2** Build Surah list: `ListView.builder` of 114 items
  - Each item: number badge (primary/10 bg) + Arabic name (Amiri) + Latin name + verse count + Juz
- [ ] **5.2.3** Implement search filter: filters by Latin name or Surah number in real time

### 5.3 Quran Reading Screen
- [ ] **5.3.1** Build reading screen sticky header: back + Surah name (Arabic, Amiri) + Juz info + `more_vert`
- [ ] **5.3.2** Build Bismillah banner (shown for all Surahs except Surah 9 — At-Tawbah)
- [ ] **5.3.3** Build verse card: verse number badge + Arabic text (Amiri, 28sp, RTL) + transliteration + translation
- [ ] **5.3.4** Build verse action row: `bookmark`, `share`, `play` icons per verse
- [ ] **5.3.5** Implement bookmarking: tap bookmark icon → save `QuranBookmark` to Hive → icon toggles to filled
- [ ] **5.3.6** Implement reading position persistence: save last scroll position (verse index) to Hive per Surah
- [ ] **5.3.7** Wire `play` icon on verse → navigate to `/tools/quran/:surahId/murattal` starting at that verse
- [ ] **5.3.8** Verify Arabic text is RTL, no clipping, line-height comfortable (2.2 per PRD)
- [ ] **5.3.9** Verify screen matches `stitch/quran_reading_active_nav/screen.png` and `stitch/quran_dark_mode/screen.png`

### 5.4 Quran Murattal Screen
- [ ] **5.4.1** Initialize `just_audio` player + `audio_service` for background playback
- [ ] **5.4.2** Build Murattal screen: inherits Quran Reading layout + adds audio player panel at bottom
- [ ] **5.4.3** Build audio player panel: reciter name + progress slider + transport controls (`skip_previous`, `replay_10`, play/pause, `forward_10`, `skip_next`)
- [ ] **5.4.4** Build playback speed selector: 0.75x / 1x / 1.25x / 1.5x chips
- [ ] **5.4.5** Implement verse highlight sync: highlight current verse based on audio position (timed segments per Surah)
- [ ] **5.4.6** Implement auto-scroll: `ScrollController` scrolls to current verse during playback
- [ ] **5.4.7** Configure background audio: `audio_service` handler, system media controls in notification tray
- [ ] **5.4.8** Bundle short Surahs (Juz Amma: Surah 78–114) as local MP3 assets
- [ ] **5.4.9** Implement streaming fallback for longer Surahs (mp3quran.net API)
- [ ] **5.4.10** Build offline fallback state for streamed Surahs: "Connect to internet to play this Surah"
- [ ] **5.4.11** Verify screen matches `stitch/quran_murattal_active_nav/screen.png`

---

## Phase 6 — Settings & System Polish
> **Goal:** Settings screen complete, all toggles wired, notifications working end-to-end, dark mode seamless.  
> **Gate to Phase 7:** All settings persist, dark mode switches instantly, Adhan notification fires correctly, no hardcoded colors remain.  
> ⚠️ Depends on: Phase 4 + Phase 5 complete

### 6.1 Settings Screen
- [ ] **6.1.1** Build Settings header: back + "Settings" title
- [ ] **6.1.2** Build Profile section: avatar + name + email + edit button (inline editing)
- [ ] **6.1.3** Build Notifications group: per-prayer Adhan toggles (5 prayers) using `IosToggle` widget
- [ ] **6.1.4** Build Iqamah offset row: per-prayer minute offset picker (stepper, default 10 min)
- [ ] **6.1.5** Build Daily Checklist Reminder row: time picker, default 9:00 AM
- [ ] **6.1.6** Build Display group: Dark Mode 3-way control (Light/Dark/Auto), Font Size selector, Language selector
- [ ] **6.1.7** Build About group: App Version, Privacy Policy (in-app WebView), Rate App link, Feedback
- [ ] **6.1.8** Wire all toggles → write to `AppSettings` Hive box → trigger side effects (notification reschedule, theme change)
- [ ] **6.1.9** Verify screen matches `stitch/settings_with_dark_mode_option/screen.png` and `stitch/settings_dark_mode/screen.png`

### 6.2 Dark Mode Polish
- [ ] **6.2.1** Audit ALL screens in dark mode against `stitch/*_dark_mode/screen.png` — fix any color token mismatches
- [ ] **6.2.2** Verify no hardcoded `Colors.white`, `Colors.black`, or raw hex strings remain in widget code (grep codebase)
- [ ] **6.2.3** Verify `AnimatedTheme` transition is smooth (no flash/jank on toggle)
- [ ] **6.2.4** Test system auto mode: app follows device dark mode setting correctly

### 6.3 Notification End-to-End
- [ ] **6.3.1** Verify Adhan notifications fire at correct prayer times on Android emulator (API 34)
- [ ] **6.3.2** Verify Adhan notifications fire correctly on iOS simulator (iOS 16+)
- [ ] **6.3.3** Verify notifications are cancelled when prayer toggle is turned off in Settings
- [ ] **6.3.4** Verify Iqamah notification fires `n` minutes after Adhan (configurable offset)
- [ ] **6.3.5** Verify notifications reschedule correctly after location changes (new prayer times → cancel old → schedule new)
- [ ] **6.3.6** Verify tapping notification → opens app on Dashboard screen

### 6.4 Accessibility Pass
- [ ] **6.4.1** Audit all `IconButton`s and small tap targets: minimum 48×48dp (add `SizedBox` wrappers where needed)
- [ ] **6.4.2** Add `Semantics(label: ...)` to all icon-only buttons across all screens
- [ ] **6.4.3** Verify all Arabic text has explicit `textDirection: TextDirection.rtl`
- [ ] **6.4.4** Verify contrast ratios for all text on primary bg (`#70df20` background with dark text = check)
- [ ] **6.4.5** Test with TalkBack (Android) and VoiceOver (iOS) — all interactive elements must be reachable

### 6.5 Localization
- [ ] **6.5.1** Set up `flutter_localizations` + `intl` in `pubspec.yaml`
- [ ] **6.5.2** Create `lib/l10n/app_id.arb` (Indonesian) and `lib/l10n/app_en.arb` (English) with all UI strings
- [ ] **6.5.3** Replace all hardcoded Indonesian strings in widgets with `AppLocalizations.of(context).*`
- [ ] **6.5.4** Verify language switch in Settings changes all UI strings (no restart required)

---

## Phase 7 — QA & Release Prep
> **Goal:** App is production-ready. All screens verified, performance validated, store assets ready.  
> **Gate to ship:** Zero critical bugs, performance targets met, store listing complete.  
> ⚠️ Depends on: Phase 6 complete

### 7.1 Integration Testing
- [ ] **7.1.1** Write integration test: full checklist flow (open app → check 5 items → verify progress = 50% → restart → verify persisted)
- [ ] **7.1.2** Write integration test: prayer time accuracy for 5 major Indonesian cities (Jakarta, Surabaya, Medan, Makassar, Denpasar)
- [ ] **7.1.3** Write integration test: dark mode toggle persists across app restart
- [ ] **7.1.4** Write integration test: Dzikir counter increments and resets on next day
- [ ] **7.1.5** Manual test: Quran reads all 114 Surahs without crash (test Surah 2 — largest Surah)
- [ ] **7.1.6** Manual test: Murattal audio plays + background playback continues when screen locked

### 7.2 Performance Audit
- [ ] **7.2.1** Profile cold start time on mid-range Android device — must be < 2 seconds
- [ ] **7.2.2** Profile bottom nav tab switches — must be < 150ms
- [ ] **7.2.3** Profile Quran Surah 2 scroll (286 verses) — must maintain 60fps
- [ ] **7.2.4** Run `flutter analyze` — zero warnings, zero errors
- [ ] **7.2.5** Run `flutter test` — all unit tests pass

### 7.3 App Assets & Store Prep
- [ ] **7.3.1** Create app icon (1024×1024px): mosque/compass motif with `#70df20` primary color
- [ ] **7.3.2** Apply app icon via `flutter_launcher_icons` package (all densities, adaptive icon for Android)
- [ ] **7.3.3** Create splash screen via `flutter_native_splash` package (white/dark bg, centered logo)
- [ ] **7.3.4** Set app name: "JamShalat" in `AndroidManifest.xml` and `Info.plist`
- [ ] **7.3.5** Set bundle ID: `com.jamshalat.app` on both platforms
- [ ] **7.3.6** Configure release signing (Android keystore, iOS certificates) — document in private README
- [ ] **7.3.7** Build release APK: `flutter build apk --release` — verify no build errors
- [ ] **7.3.8** Build iOS release: `flutter build ipa --release` — verify no build errors
- [ ] **7.3.9** Write Play Store listing: app description (Indonesian + English), screenshots (1 per key screen), tags
- [ ] **7.3.10** Write App Store listing: same content, App Store Connect metadata

---

## Progress Tracker

| Phase | Total Tasks | Done | Remaining | Status |
|---|---|---|---|---|
| Phase 1 — Foundation | 22 | 0 | 22 | Not started |
| Phase 2 — Data Layer | 21 | 0 | 21 | Not started |
| Phase 3 — Dashboard & Calendar | 18 | 0 | 18 | Not started |
| Phase 4 — Worship Tracking | 28 | 0 | 28 | Not started |
| Phase 5 — Islamic Tools | 27 | 0 | 27 | Not started |
| Phase 6 — Settings & Polish | 22 | 0 | 22 | Not started |
| Phase 7 — QA & Release | 20 | 0 | 20 | Not started |
| **TOTAL** | **158** | **0** | **158** | 🔴 Not started |

---

## Quick Reference — Key Files

| File | Purpose |
|---|---|
| `PRD.md` | Full product requirements — source of truth |
| `stitch/*/screen.png` | Visual reference for each screen |
| `stitch/*/code.html` | HTML implementation reference for each screen |
| `TASKLIST.md` | This document — execution plan |

---

*TASKLIST v1.0 — JamShalat — March 2026*
