{"id":25428654,"url":"https://github.com/shubhanshu24510/runique","last_synced_at":"2025-05-14T07:31:26.497Z","repository":{"id":265730378,"uuid":"804733594","full_name":"shubhanshu24510/Runique","owner":"shubhanshu24510","description":"Runique is a multi-module, offline-first running tracker app that monitors your health, tracks your runs with real-time location, and supports both Android mobile and Wear OS platforms.","archived":false,"fork":false,"pushed_at":"2025-05-13T09:21:21.000Z","size":815,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-13T10:32:37.597Z","etag":null,"topics":["android-jetpack","authentication","google-maps","health-services","koin-android","kotlin","ktor","mongodb-database","offline-first","running-tracker","wear-os"],"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/shubhanshu24510.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"[\"shubhanshu24510\"]":null,"patreon":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"thanks_dev":null,"custom":null}},"created_at":"2024-05-23T06:55:43.000Z","updated_at":"2025-05-13T09:21:24.000Z","dependencies_parsed_at":"2025-05-13T10:35:41.557Z","dependency_job_id":null,"html_url":"https://github.com/shubhanshu24510/Runique","commit_stats":null,"previous_names":["shubhanshu24510/runique"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shubhanshu24510%2FRunique","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shubhanshu24510%2FRunique/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shubhanshu24510%2FRunique/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shubhanshu24510%2FRunique/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shubhanshu24510","download_url":"https://codeload.github.com/shubhanshu24510/Runique/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254094760,"owners_count":22013637,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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-jetpack","authentication","google-maps","health-services","koin-android","kotlin","ktor","mongodb-database","offline-first","running-tracker","wear-os"],"created_at":"2025-02-17T01:39:39.868Z","updated_at":"2025-05-14T07:31:26.487Z","avatar_url":"https://github.com/shubhanshu24510.png","language":"Kotlin","funding_links":["https://buymeacoffee.com/shubhanshu24510"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e🏃‍♂️ Runique - Running Tracker App\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eRunique\u003c/b\u003e is a multi-module, offline-first running tracker app that monitors your health, tracks your runs with real-time location, and supports both Android mobile and Wear OS platforms.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://pl-coding.com/wp-content/uploads/2024/04/run-feature.png\" alt=\"Run Feature\" width=\"800\"/\u003e\n\u003c/p\u003e\n\n\u003ctable align=\"center\"\u003e\n\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"https://pl-coding.com/wp-content/uploads/2024/04/auth-feature.png\" alt=\"Auth Feature\" width=\"400\"/\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"https://pl-coding.com/wp-content/uploads/2024/04/phone-watch-mockup.png\" alt=\"Phone Watch Mockup\" width=\"300\"/\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## 🔍 Preview\n\nhttps://github.com/shubhanshu24510/Runiquee/assets/100926922/b0268e64-c22d-4db4-ae6c-1cfc077e7798\n\n---\n\n## ✨ Features\n\n- 🔁 **Real-time Run Tracking**: Track your runs using Google Maps and draw running paths using google map drawlines.\n- 📊 **Health Metrics**: View data such as Distance, Heart Rate, Pace, Speed, Elevation, and more.\n- 📷 **Map Snapshots**: Capture and display run paths with data on the overview screen.\n- 📶 **Offline-First**: All data is stored locally using Room DB and syncs with the server when online.\n- ⌚ **Wear OS Support**: Real-time tracking and display optimized for Wear OS smartwatches.\n\n---\n\n## 🧩 Key Highlights\n\n- Multi-module, clean MVI architecture\n- OAuth authentication with token refresh\n- Offline-first with Room Database\n- Dynamic Feature Modules for modular builds\n- Remote APIs, local databases \u0026 caching strategies\n- Health \u0026 Fitness tracking using Google Health SDK\n- Location tracking with the Google Maps SDK\n- Full support for Wear OS devices\n- Gradle Version Catalogs \u0026 Convention Plugins\n- Implement watch to phone communication and what it takes to correctly sync exercise data\n\n## 🛠️ Tech Stack\n\n### Language \u0026 Concurrency\n- **Kotlin**\n- **Kotlin Coroutines + Flow**\n\n### Jetpack Libraries\n- Jetpack Compose (UI)\n- Material3 Design System\n- ViewModel\n- Room Database\n- Navigation (with Hilt support)\n- Lifecycle-aware components\n- DataStore (preferences)\n- SplashScreen API\n\n### Dependency Injection\n- Hilt\n- Koin (selective modules)\n\n### Networking\n- Ktor\n- Kotlinx Serialization\n\n### Database\n- Room\n- MongoDB (NoSQL)\n\n### Image Loading \u0026 Logging\n- Coil\n- Timber\n\n---\n\n## 🧱 Architecture\n\nRunique follows **MVI (Model-View-Intent)** with a **Repository Pattern**, and aligns with [Google's recommended app architecture](https://developer.android.com/topic/architecture).\n\n### Layers:\n\n#### UI Layer\n- Compose UI\n- ViewModels for state \u0026 event management\n- Observes state via Kotlin Flows\n\n#### Data Layer\n- Repositories manage local/remote data sources\n- Room DB \u0026 Network API abstraction\n- Offline-first strategy\n\n📐 Architecture Diagram  \n![architecture](https://github.com/user-attachments/assets/09ca369a-968a-435e-bb89-f1856120bac5)\n\n📦 Modular Diagram  \n![modular architecture](https://github.com/user-attachments/assets/29f555f6-2339-40dc-899c-79835b0c7fb7)\n\n📲 UI Layer  \n![ui layer](https://github.com/user-attachments/assets/80d123e6-e72b-4ca8-998b-a9edec78ae19)\n\n📡 Data Layer  \n![data layer](https://github.com/user-attachments/assets/0bdebc42-69a1-41a2-ad8f-d57d3cbf9124)\n\n---\n\n## 🧱 Modularization Strategy\n\n- 🔁 **Reusability**: Share logic across features\n- 🏗 **Parallel Builds**: Improve build times\n- 🚧 **Isolation**: Reduce tight coupling between modules\n- 👥 **Team Focus**: Developers can work independently on dedicated modules\n\n👉 Learn more: [Android App Modularization Guide](https://developer.android.com/topic/modularization)\n\n---\n\n## 🧰 Additional Tools \u0026 Libraries\n\n- [Kotlinx Serialization](https://github.com/Kotlin/kotlinx.serialization)\n- [KSP (Kotlin Symbol Processing)](https://github.com/google/ksp)\n- Compose Compiler Plugin\n- Google Health Services\n- Google Maps SDK\n- Dynamic Feature Delivery\n---\n\n---\n## How do you run the project?\n\nIn order to run the project on your phone, you'll need to first clone it and then add two API keys for:\n1. ... the Runique API (access granted after course purchase)\n2. ... Google Maps (needs to be got from Google Cloud Console - instructions in the course)\n\nThen simply include them in `local.properties`:\n```\nAPI_KEY=\u003cRUNIQUE_API_KEY\u003e\nMAPS_API_KEY=\u003cGOOGLE_MAPS_API_KEY\u003e\n```\nAfterwards, build the project and you're ready to use it.\n\n---\n\n## 🤝 Support\n\nIf you like this project, please consider ⭐ starring the repo and following me for more cool Android projects!\n\n☕ You can also support my work by buying me a coffee:\n\n\u003cp align=\"left\"\u003e\n  \u003ca href=\"https://buymeacoffee.com/shubhanshu24510\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png\" alt=\"Buy Me A Coffee\" height=\"60\" width=\"217\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\n## 📄 License\n\n```text\nDesigned and developed by Shubhanshu Singh (2025)\n\nLicensed under the Apache License, Version 2.0\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshubhanshu24510%2Frunique","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshubhanshu24510%2Frunique","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshubhanshu24510%2Frunique/lists"}