{"id":51248762,"url":"https://github.com/vanhoai/flosunpomodoro","last_synced_at":"2026-06-29T06:02:23.828Z","repository":{"id":358256668,"uuid":"1181000022","full_name":"Vanhoai/FlosunPomodoro","owner":"Vanhoai","description":"A combined 12 Week Year and Pomodoro Technique app to help you control your time and achieve your goals effectively. With customizable timers, goal tracking, and smart notifications, FlosunPomodoro is your ultimate productivity companion.","archived":false,"fork":false,"pushed_at":"2026-05-16T12:45:07.000Z","size":17635,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-16T14:43:51.309Z","etag":null,"topics":["android","coroutines","firebase","flow","jetpack-compose","room"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Vanhoai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-13T16:33:37.000Z","updated_at":"2026-05-16T12:45:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Vanhoai/FlosunPomodoro","commit_stats":null,"previous_names":["vanhoai/flosunpomodoro"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Vanhoai/FlosunPomodoro","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vanhoai%2FFlosunPomodoro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vanhoai%2FFlosunPomodoro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vanhoai%2FFlosunPomodoro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vanhoai%2FFlosunPomodoro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Vanhoai","download_url":"https://codeload.github.com/Vanhoai/FlosunPomodoro/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vanhoai%2FFlosunPomodoro/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34915002,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","coroutines","firebase","flow","jetpack-compose","room"],"created_at":"2026-06-29T06:02:20.450Z","updated_at":"2026-06-29T06:02:23.822Z","avatar_url":"https://github.com/Vanhoai.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FlosunPomodoro\n\nA combined 12 Week Year and Pomodoro Technique app to help you control your time and achieve your goals effectively. With customizable timers, goal tracking, and smart notifications, FlosunPomodoro is your ultimate productivity companion.\n\n\u003cimg src=\"./thumbnail.png\" alt=\"thumbnail\" width=\"800\"/\u003e\n\n## Features\n\n- 🍅 **Pomodoro Timer**: Classic Pomodoro timer with customizable work and break intervals\n- 🎯 **Goal Tracking**: Create, update, and manage your productivity goals with progress tracking\n- 🔔 **Smart Notifications**: Customizable notification preferences for timer events\n- 🌙 **Appearance Customization**: Dark/light theme support with Material 3 design\n- 🗣️ **Multi-Language Support**: Built-in language preferences\n- 🔐 **Secure Authentication**: \n  - Email/password login and registration\n  - Biometric authentication (fingerprint/face recognition)\n  - Google Sign-In integration\n- ☁️ **Cloud Synchronization**: Real-time sync via Supabase backend\n- 📊 **Progress Dashboard**: View your productivity metrics and goal progress\n- 🗺️ **Location Features**: Integrated maps support (Google Maps \u0026 MapLibre)\n- 🎵 **Media Support**: Built-in audio playback for timer sounds and notifications\n\n## Tech Stack\n\n### Core Framework\n- **Language**: Kotlin 2.3.21\n- **Compose**: Jetpack Compose (Material 3)\n- **Build System**: Gradle 9.1.1 (Kotlin DSL)\n\n### Architecture \u0026 Dependency Injection\n- **Architecture**: MVVM (Model-View-ViewModel)\n- **DI**: Hilt with KSP (Kotlin Symbol Processing)\n- **Navigation**: Navigation 3 with custom NavBackStack\n\n### Database \u0026 Storage\n- **Local DB**: Room 2.8.4 (SQLite)\n- **Cloud Backend**: Supabase (Postgrest, Auth, Realtime)\n- **Preferences**: DataStore with encrypted storage (AES)\n\n### Authentication \u0026 Security\n- **Biometric**: AndroidX Biometric 1.4.0\n- **Google Credentials**: Google Identity Services\n- **Backend Auth**: Supabase Auth\n\n### UI \u0026 Networking\n- **Networking**: Ktor 3.4.3 client\n- **Image Loading**: Coil 3.4.0\n- **Serialization**: Kotlinx Serialization 1.11.0\n- **Media**: Media3 (ExoPlayer)\n- **Maps**: Google Maps Compose + MapLibre Compose\n\n### Testing\n- **Unit Tests**: JUnit 4.13.2\n- **Instrumented Tests**: Espresso 3.7.0\n- **Lifecycle Testing**: Lifecycle Runtime 2.10.0\n\n## Project Structure\n\n```\nFlosunPomodoro/\n├── app/                          # Main application module\n│   ├── src/main/java/com/flosun/pomodoro/\n│   │   ├── presentation/         # UI screens (MVVM)\n│   │   │   ├── auth/            # Login \u0026 registration\n│   │   │   ├── goals/           # Goal management\n│   │   │   ├── timer/           # Pomodoro timer\n│   │   │   ├── dashboard/       # Main dashboard\n│   │   │   ├── settings/        # Settings \u0026 preferences\n│   │   │   ├── notification/    # Notification settings\n│   │   │   └── swipe/           # Swipe-based navigation\n│   │   ├── domain/              # Business logic \u0026 interfaces\n│   │   ├── data/                # Data layer (DB, API, repositories)\n│   │   └── di/                  # Hilt dependency injection\n│   ├── build.gradle.kts         # App build configuration\n│   └── schemas/                 # Room database schemas\n├── core/                         # Shared Compose UI components\n│   ├── src/main/java/com/flosunn/core/\n│   └── build.gradle.kts\n├── libraries/                    # Prebuilt binary dependencies\n├── gradle/\n│   └── libs.versions.toml       # Centralized dependency versions\n├── fastlane/                    # CI/CD automation\n│   ├── Fastfile               # Build lanes\n│   ├── Gemfile\n│   └── workflows/\n├── build.gradle.kts             # Root build configuration\n├── settings.gradle.kts          # Project configuration\n└── local.properties             # Local configuration (not committed)\n```\n\n## Prerequisites\n\n- **JDK**: 17 or higher\n- **Android SDK**: API 36 (compileSdk)\n- **Min SDK**: API 24\n- **Gradle**: 9.1.1+\n\n## Setup \u0026 Configuration\n\n### 1. Clone the Repository\n```bash\ngit clone https://github.com/Vanhoai/FlosunPomodoro\ncd FlosunPomodoro\n```\n\n### 2. Create Local Configuration Files\n\n#### `local.properties` (Required)\nCreate this file at the project root with:\n```properties\nversionCode=1\nversionName=1.0.0\n\n# Supabase Configuration\nsupabaseUrl=your_supabase_url_here\nsupabasePublishableKey=your_supabase_key_here\n\n# Google OAuth Configuration\ngoogleClientId=your_google_client_id_here\ngoogleClientSecret=your_google_client_secret_here\n```\n\n#### `keystore.properties` (Already committed with dev credentials)\nContains debug/release signing configuration:\n```properties\ndebug_keystore_file=debug.keystore\ndebug_keystore_password=android\ndebug_key_alias=androiddebugkey\ndebug_key_password=android\n```\n\n### 3. Install Dependencies\n```bash\n# Sync Gradle (automatic on first build)\n./gradlew sync\n```\n\n## Building \u0026 Running\n\n### Build Variants\n\n```bash\n# Full build (app + core modules)\n./gradlew assembleDebug\n\n# App-only build (skip core if already built)\n./gradlew :app:assembleDebug\n\n# Release build\n./gradlew assembleRelease\n\n# Install on device/emulator\n./gradlew installDebug\n```\n\n### Run the App\n```bash\n# Using Android Studio\n# 1. Open project in Android Studio\n# 2. Click \"Run\" or press Shift+F10\n\n# Using Gradle\n./gradlew :app:installDebug\n```\n\n## Testing\n\n### Run All Tests\n```bash\n# Unit tests\n./gradlew test\n\n# App unit tests only\n./gradlew :app:test\n\n# Core unit tests only\n./gradlew :core:test\n\n# Instrumentation tests (requires emulator/device)\n./gradlew connectedAndroidTest\n```\n\n## CI/CD Pipeline\n\nThe project uses **Fastlane** for automation:\n\n```bash\n# Install dependencies (first time only)\ncd fastlane\nbundle install\ncd ..\n\n# Run test lane\nbundle exec fastlane android test\n\n# Build and upload beta to Crashlytics\nbundle exec fastlane android beta\n\n# Deploy to Play Store\nbundle exec fastlane android deploy\n\n# Distribute via Firebase App Distribution\nbundle exec fastlane android distribute\n```\n\nSee `fastlane/Fastfile` for full lane definitions.\n\n## Key Development Notes\n\n### Architecture\n- **MVVM Pattern**: Screens use ViewModel for state management\n- **Navigation 3**: Custom navigation with `NavBackStack` and sealed class routes\n- **Compose Material 3**: Modern Material Design components\n- **Hilt DI**: Automatic dependency injection with KSP compilation\n\n### Database\n- **Room**: Type-safe database abstraction with coroutine support\n- **Schemas**: Exported to `app/schemas/` for version management\n  - Note: Two namespace directories exist (one has a typo with double `n`)\n\n### Modules\n- **`:app`**: Main MVVM screens, Room DB, DI, services, Compose UI\n- **`:core`**: Reusable Compose components (date/time pickers, custom UI elements)\n- **`:libraries`**: Prebuilt binary dependencies (shared.aar)\n\n### Namespace Note\n- `:app` namespace: `com.flosun.pomodoro`\n- `:core` namespace: `com.flosunn.core` (intentional double `n`)\n\n### Build Features\n- **ProGuard**: Currently disabled (`isMinifyEnabled = false`)\n- **ABIs**: Optimized for `arm64-v8a` only\n- **KSP**: Replaces kapt for annotation processing (faster compilation)\n- **Compose Compiler**: Built-in, no manual dependency needed\n\n## Dependency Highlights\n\n| Category | Libraries |\n|----------|-----------|\n| **DI** | Hilt 2.59.2 + KSP |\n| **DB** | Room 2.8.4 + KSP |\n| **Backend** | Supabase 3.6.0 (Auth, Postgrest, Realtime) |\n| **Networking** | Ktor 3.4.3 |\n| **Auth** | Google Credentials 1.6.0, Biometric 1.4.0 |\n| **UI** | Material 3, Compose BOM 2026.04.01 |\n| **Image** | Coil 3.4.0 |\n| **Media** | Media3 1.10.0 |\n| **Maps** | Google Maps Compose + MapLibre Compose |\n| **Storage** | DataStore 1.2.1, Encrypted Storage (AES) |\n\n## Troubleshooting\n\n### Common Issues\n\n1. **Gradle Sync Fails**\n   - Ensure `local.properties` is configured correctly\n   - Run `./gradlew clean` then rebuild\n\n2. **Build Fails - Missing Properties**\n   - Verify `local.properties` contains `versionCode` and `versionName`\n   - Check Supabase and OAuth credentials\n\n3. **Compose Compilation Errors**\n   - Clear build cache: `./gradlew clean`\n   - Invalidate Android Studio cache: File → Invalidate Caches\n\n4. **Tests Fail**\n   - Ensure emulator/device is connected for instrumented tests\n   - Check test device API level is ≥ 24\n\n### Debug Logging\nThe app uses **Timber** for structured logging:\n```kotlin\nTimber.d(\"Debug message\")\nTimber.e(\"Error: %s\", exception)\n```\n\n## Development Workflow\n\n### Code Style\n- **Language**: Official Kotlin style guide\n- **Compose**: Best practices from Google Codelab\n- **Comments**: Only when logic needs clarification\n- **Naming**: Descriptive kebab-case for resources, PascalCase for classes\n\n### Git Workflow\n```bash\n# Create feature branch\ngit checkout -b feature/your-feature\n\n# Make changes and test\n./gradlew test\n\n# Commit with message\ngit commit -m \"Add feature description\"\n\n# Push and create PR\ngit push origin feature/your-feature\n```\n\n### Adding Dependencies\nEdit `gradle/libs.versions.toml` (single source of truth):\n```toml\n[versions]\nmyLibVersion = \"1.0.0\"\n\n[libraries]\nmyLib = { group = \"com.example\", name = \"mylib\", version.ref = \"myLibVersion\" }\n```\n\nThen use in `build.gradle.kts`:\n```kotlin\ndependencies {\n    implementation(libs.myLib)\n}\n```\n\n## Performance Considerations\n\n- **Minimum SDK 24**: Balances compatibility with modern APIs\n- **arm64-v8a Only**: Reduces APK size, targets modern devices\n- **ProGuard Disabled**: Trade-off for faster development/testing\n- **Coil Image Loading**: Efficient async image loading with caching\n- **Room Coroutines**: Non-blocking database operations\n\n## Support \u0026 Contributing\n\nFor issues, feature requests, or contributions:\n1. Open an issue with detailed description\n2. Fork and create a feature branch\n3. Submit a pull request with tests\n\n## Resources\n\n- [Pomodoro Technique](https://en.wikipedia.org/wiki/Pomodoro_Technique)\n- [Jetpack Compose Documentation](https://developer.android.com/jetpack/compose)\n- [Kotlin Coroutines](https://kotlinlang.org/docs/coroutines-overview.html)\n- [Room Database](https://developer.android.com/training/data-storage/room)\n- [Hilt Documentation](https://dagger.dev/hilt/)\n- [Supabase Documentation](https://supabase.com/docs)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvanhoai%2Fflosunpomodoro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvanhoai%2Fflosunpomodoro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvanhoai%2Fflosunpomodoro/lists"}