{"id":13552305,"url":"https://github.com/ketanchoyal/Sub-Track","last_synced_at":"2025-04-03T03:31:27.842Z","repository":{"id":48810029,"uuid":"350588474","full_name":"ketanchoyal/Sub-Track","owner":"ketanchoyal","description":"Flutter Application to keep track of Subscriptions","archived":false,"fork":false,"pushed_at":"2022-04-02T16:24:53.000Z","size":45635,"stargazers_count":43,"open_issues_count":2,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-25T11:11:24.495Z","etag":null,"topics":["android","cross-platform","firebase","firestore","flutter","flutter-apps","github-actions","hacktoberfest","hacktoberfest2021","hive","ios-app","mockito","mvvm-architecture","riverpod","stacked-architecture","subscription-manager","test-automation"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ketanchoyal.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-03-23T05:22:21.000Z","updated_at":"2024-07-09T15:09:12.000Z","dependencies_parsed_at":"2022-08-25T14:41:34.089Z","dependency_job_id":null,"html_url":"https://github.com/ketanchoyal/Sub-Track","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ketanchoyal%2FSub-Track","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ketanchoyal%2FSub-Track/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ketanchoyal%2FSub-Track/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ketanchoyal%2FSub-Track/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ketanchoyal","download_url":"https://codeload.github.com/ketanchoyal/Sub-Track/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246933431,"owners_count":20857048,"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","cross-platform","firebase","firestore","flutter","flutter-apps","github-actions","hacktoberfest","hacktoberfest2021","hive","ios-app","mockito","mvvm-architecture","riverpod","stacked-architecture","subscription-manager","test-automation"],"created_at":"2024-08-01T12:02:02.004Z","updated_at":"2025-04-03T03:31:22.796Z","avatar_url":"https://github.com/ketanchoyal.png","language":"Dart","funding_links":[],"categories":["Dart"],"sub_categories":[],"readme":"\u003cimg src=\"assets/launcher_icons/splash_screen.png\" width=\"60px\" height=\"60px\" /\u003e\n\n\n![CI/CD Android](https://github.com/ketanchoyal/Sub-Track/actions/workflows/.github/workflows/main.yml/badge.svg) [![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fketanchoyal%2FSub-Track\u0026count_bg=%23566BDE\u0026title_bg=%23555555\u0026icon=github.svg\u0026icon_color=%23E7E7E7\u0026title=Hit+Count\u0026edge_flat=true)](https://hits.seeyoufarm.com)\n\n# Sub Track: A Subscription Tracker Application built using Flutter\n\n### Sub Track is first open source Subscription Tracker app made using Flutter\n\n### Want to Contribute?\n\nRefer [CONTRIBUTING.md](CONTRIBUTING.md)\n# TODO\n### \u0026emsp; Prority\n- [ ] Add Notifications\n- [ ] Arrange Ongoing Subs according to Date\n- [ ] Add Currency Selection Screen\n- [ ] Add Android Specific UI for select icon view\n- [ ] Enable Emoji selection in select icon view\n\n### \u0026emsp; Just Feature\n- [ ] Add Filter by Category Option\n- [x] Firebase Sync\n- [x] History\n- [ ] Archive Subscription\n- [ ] Pause Subscription\n- [x] Add Shared with\n- [x] Show Remaining days\n\n### Screenshots\n\n\u003cimg src=\"Screenshot/SignIn.png\" width=\"200px\" height=\"411px\" /\u003e\n\u003cimg src=\"Screenshot/SignUp.png\" width=\"200px\" height=\"411px\" /\u003e\n\u003cimg src=\"Screenshot/HomeScreen.png\" width=\"200px\" height=\"411px\" /\u003e\n\u003cimg src=\"Screenshot/Active.png\" width=\"200px\" height=\"411px\" /\u003e\n\u003cimg src=\"Screenshot/AddSub.png\" width=\"200px\" height=\"411px\" /\u003e\n\u003cimg src=\"Screenshot/NewSub.png\" width=\"200px\" height=\"411px\" /\u003e\n\u003cimg src=\"Screenshot/SelectIcon.png\" width=\"200px\" height=\"411px\" /\u003e\n\u003cimg src=\"Screenshot/SelectEmoji.png\" width=\"200px\" height=\"411px\" /\u003e\n\u003cimg src=\"Screenshot/Setting.png\" width=\"200px\" height=\"411px\" /\u003e\n\n### And More...\n\n# Setup\n\n# Project Quick Info\n\n- This Project uses `Hive` for local storage and `Firebase Firestore` for remote storage\n- MVVM Pattern\n- App Architecture (This is the simplest way I came up):\n    \u003cimg src=\"Screenshot/architecture.png\" /\u003e\n# Project Structure\n\nThis is a Flutter mobile app targeting Android and iOS.\n\nThe code for the Flutter app is contained in the folder `lib` and the\ndifferent native apps are in `android` and `ios`. Extra project assets are in\n`assets` and `fonts`.\n\n\n# Prerequisites \u0026 Getting Started\n\n## Client \n\nTo build and run the mobile apps you’ll need to install [Flutter](https://flutter.dev) and its dependencies. To verify your installation run in the project’s root directory:**‌**\n\n```\n$ flutter doctor\n```\n\nThe app is optimised for Android and iOS phones in portrait mode.\n\n**Note:** The project should support most recent Flutter version.\n\n**Note:** Additionally you’ll need to setup the backend and add the GoogleService-Info of your Firebase app to your clients as described below.\n\n## Backend (Firebase)\n\n*Note: The following steps assume you’re using Firebases’ free `Spark Plan`. Therefore we’re performing the configuration manually.*\n\n### 1. Setup sign-in methods\n\nAn initial sign-in method needs to be configured.\n\n- Select your project in [console.firebase.google.com](https://console.firebase.google.com). \n- Navigate to `Authentication` \n- Select `Sign-in methods` and activate `Email / Password`, `Google`, `Apple` and `Anonymous`.\n\n### 2. Configure firebase app\n\nNext, you’ll need to configure your firebase app for Flutter as described in [Add Firebase to an App / Flutter](https://firebase.google.com/docs/flutter/setup)\n\n**iOS**\n\n- Enter iOS-Bundle-ID: `com.yourname.subTrack` or anything else\n- Download `GoogleService-Info.plist`.\n- Copy file to `ios/Runner/Firebase`.\n\n**Android**\n\n## Setting up Firebase\n\nCreate a project on the Firebase console [here](https://console.firebase.google.com/)\n\n1. To add Firebase to your app, click on the android icon or click the gear icon to go to project\nsettings to find the android icon.\n\n2. Register your application by filing up the form with the package name (applicationId) \nand the app nickname if you like.\n\u003e Find Your package name which is generally the applicationId in your app-level build.gradle file\n\n3. Download the `google-service.json` file that is generated for you. Find it and move it inside\nthe folder `android/app/` of the project. The firebase sdk is already added to the project.\n\n4. On the fourth step of registration, run the app to verify the configuration via the Firebase\nconsole.\n\n## Distribution\n\nTo build this application for distribution, \nprovide a file `key.jks` containing the signing keys, \nand the `key.properties` with the following content:\n\n```\nstorePassword=.....\nkeyPassword=.....\nkeyAlias=key\nstoreFile=../key.jks\n```\n\nWhere you set the `storePassword` and the `keyPassword`. You can also change the alias.\n\nYou will need to uncomment the section `signingConfigs` in the `app/build.gradle`.\n\nAnd change the `signingConfig signingConfigs.debug` to `signingConfig signingConfigs.release`.\n\nYou can also provide this files from your CI instead of including this in the project.\n\n**Note:**\n\n`CI/CD` using GitHub Actions is already configured in [`actions/ci_cd_android`](https://github.com/ketanchoyal/Sub-Track/tree/actions/ci_cd_android) branch.\n\n**CI/CD**\n\nIn branch [`actions/ci_cd_android`](https://github.com/ketanchoyal/Sub-Track/tree/actions/ci_cd_android), auto publishing of apk for testers using firebase distribution is configuted.\n\nEverytime a new tag is created in that branch apk is built and is sent to all the testers.\n\nA Similar setup can be configured for iOS but it requires developer account and ips with Ad Hoc Profile\n\n# About\n\nA Native iOS Version using SwiftUI is on the way\n\nI hope this project can be a reference or building block for your next flutter app. 🚀\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fketanchoyal%2FSub-Track","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fketanchoyal%2FSub-Track","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fketanchoyal%2FSub-Track/lists"}