This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
SimplyQibla is a Flutter application for finding the Qibla direction, built with privacy and accuracy in mind. It uses Google Maps to provide accurate prayer direction without requiring location permissions.
# Install dependencies
flutter pub get# Run on connected device/emulator
flutter run
# Run with specific device
flutter run -d [device_id]# Run all tests
flutter test
# Run a specific test file
flutter test test/map_page_test.dart# Analyze code for issues
flutter analyze
# Auto-fix formatting issues
dart format .# Build Android APK
flutter build apk
# Build Android App Bundle
flutter build appbundle
# Build iOS IPA
flutter build ipalib/- Main application codemain.dart- App entry point and initializationpages/- Main UI screensmap_page.dart- Primary map interfacemap_page_state.dart- State management for map pageonboarding_page.dart- Initial user onboarding
widgets/- Reusable UI componentscenter_console.dart- Main control consolecoordinates_form_bar.dart- Coordinate input interfacesq_app_bar.dart- Custom app bar implementation
helpers/- Utility functionsshared_preferences_helper.dart- Local storage managementmaps_renderer_helper.dart- Map rendering utilitiesurl_launcher_helper.dart- External URL handling
l10n/- Localization files (Arabic, English, French, German, Indonesian, Malay, Portuguese)theme/- App theming and stylingconstants/- App-wide constantsglobals/- Global state and keys
-
Google Maps Integration: Requires API key configuration in:
- Android:
android/key.properties - iOS:
ios/Runner/APIKey.plist
- Android:
-
State Management: Uses StatefulWidget with explicit state classes (e.g., MapPageState)
-
Localization: Supports 7 languages using Flutter's localization system
-
Platform-Specific Configuration:
- Android uses AndroidViewSurface for better map performance
- iOS requires specific Info.plist permissions for location services
The project enforces strict linting rules defined in analysis_options.yaml:
- Required: Type specifications (
always_specify_types: true) - Required: Single quotes for strings (
prefer_single_quotes: true) - Required: Return types for all functions (
always_declare_return_types: true) - Forbidden: Print statements (
avoid_print: true) - Required: Ordered imports (
directives_ordering: true)
- Location permissions are optional - the app can work with manual coordinate input
- The app uses Material 3 (Material You) design with dark theme
- All new code must pass
flutter analyzebefore merging - Tests are run automatically on PRs to master and develop branches via GitHub Actions
- Android: GitHub Actions → Play Store (Production)
- iOS: Xcode Cloud → App Store
- Work on
developbranch - Bump version in
pubspec.yaml(e.g.,3.0.4+35) - Update release notes:
- Android:
android/fastlane/metadata/android/{locale}/changelogs/default.txt - iOS:
ios/fastlane/metadata/{locale}/release_notes.txt
- Android:
- Merge
develop→master - CI automatically: builds → deploys → creates GitHub release
| Platform | Lane | Purpose | Trigger |
|---|---|---|---|
| Android | upload_metadata |
Store listing only | Manual |
| Android | deploy_internal |
Internal track (draft) | Manual |
| Android | deploy_production |
Production track | CI |
| iOS | upload_metadata |
Store listing only | Manual |
| iOS | deploy_production |
App Store | Xcode Cloud |
| Platform | Content | Path |
|---|---|---|
| Android | Description | android/fastlane/metadata/android/{locale}/full_description.txt |
| Android | Release Notes | android/fastlane/metadata/android/{locale}/changelogs/default.txt |
| Android | Screenshots | android/fastlane/metadata/android/{locale}/images/ |
| iOS | Description | ios/fastlane/metadata/{locale}/description.txt |
| iOS | Release Notes | ios/fastlane/metadata/{locale}/release_notes.txt |
PLAY_STORE_JSON_KEY- Base64-encoded Play Store service account JSONANDROID_KEYSTORE_BASE64- Base64-encoded upload keystoreANDROID_KEYSTORE_PASSWORD,ANDROID_KEY_ALIAS,ANDROID_KEY_PASSWORDGOOGLE_MAPS_API_KEY_ANDROID
GOOGLE_MAPS_API_KEY_IOS- Set as secret in Xcode Cloud workflow
- Version must be bumped before merging to master (Play Store rejects duplicate version codes)
- Metadata updates (descriptions, screenshots) can be deployed separately via
fastlane upload_metadatawithout version bump - iOS release notes use a single
release_notes.txtper locale (overwrites each release) - Android changelogs use
default.txtfor "What's New" text - APIKey.plist (iOS) and key.properties (Android) are in
.gitignore- CI creates them from secrets - iOS version sync -
ci_post_clone.shusesagvtoolto set iOS CFBundleShortVersionString and CFBundleVersion frompubspec.yaml