{"id":46463773,"url":"https://github.com/kevinguitar/budgetplus","last_synced_at":"2026-04-04T08:01:24.984Z","repository":{"id":247212002,"uuid":"517537183","full_name":"kevinguitar/budgetplus","owner":"kevinguitar","description":"Budget+ is a co-spending tracker, available on Android and iOS. Built by KMP and CMP.","archived":false,"fork":false,"pushed_at":"2026-03-29T07:21:58.000Z","size":8855,"stargazers_count":18,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-29T08:27:41.448Z","etag":null,"topics":["admob","compose-multiplatform","firebase","kotlin-multiplatform","metro","mobile-app"],"latest_commit_sha":null,"homepage":"https://budgetplus.cchi.tw/get-app","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kevinguitar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":null,"dco":null,"cla":null}},"created_at":"2022-07-25T06:01:04.000Z","updated_at":"2026-03-29T07:22:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"54de88fd-30c7-47a0-83b5-b2af9e8416b2","html_url":"https://github.com/kevinguitar/budgetplus","commit_stats":null,"previous_names":["kevinguitar/budgetplus-android","kevinguitar/budgetplus"],"tags_count":51,"template":false,"template_full_name":null,"purl":"pkg:github/kevinguitar/budgetplus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinguitar%2Fbudgetplus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinguitar%2Fbudgetplus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinguitar%2Fbudgetplus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinguitar%2Fbudgetplus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kevinguitar","download_url":"https://codeload.github.com/kevinguitar/budgetplus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinguitar%2Fbudgetplus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31392188,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T04:26:24.776Z","status":"ssl_error","status_checked_at":"2026-04-04T04:23:34.147Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["admob","compose-multiplatform","firebase","kotlin-multiplatform","metro","mobile-app"],"created_at":"2026-03-06T04:02:23.075Z","updated_at":"2026-04-04T08:01:24.948Z","avatar_url":"https://github.com/kevinguitar.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Budget+ Multiplatform App（極簡記帳）\n\n[![Android CI](https://github.com/kevinguitar/budgetplus/actions/workflows/android-ci.yml/badge.svg?event=pull_request)](https://github.com/kevinguitar/budgetplus/actions/workflows/android-ci.yml)\n[![iOS CI](https://github.com/kevinguitar/budgetplus/actions/workflows/ios-ci.yml/badge.svg?event=pull_request)](https://github.com/kevinguitar/budgetplus/actions/workflows/ios-ci.yml)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)\n\nBudget+ is an easy-to-use co-spending tracker to track expenses together with your friends and family.\n\n### Now available on both Android and iOS!\n\n[![Android](https://img.shields.io/badge/Android-Google%20Play-green.svg?logo=android)](https://play.google.com/store/apps/details?id=com.kevlina.budgetplus)\n[![iOS](https://img.shields.io/badge/iOS-App%20Store-black.svg?logo=apple)](https://apps.apple.com/app/id6759791430)\n\n## Feature Overview\n\n![overview_1](https://github.com/user-attachments/assets/66d5835d-f81f-456a-920c-43c6542977ee)\n\n![overview_2](https://github.com/user-attachments/assets/a480d869-a814-41f1-a258-e24e61e38f2e)\n\n### Some cool animated features!! ✨\n|                                                      Pie Chart                                                       |                                                  Color Tone Picker                                                   |                                                 Customize Color Tone                                                 |\n|:--------------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------------------------:| \n| \u003cvideo src=\"https://github.com/kevinguitar/budgetplus-android/assets/18852983/c2222bc4-f78e-42a2-a78b-ebdb78cc7c2e\"\u003e | \u003cvideo src=\"https://github.com/kevinguitar/budgetplus-android/assets/18852983/82f6d3e9-8162-4554-809e-e2f81913e684\"\u003e | \u003cvideo src=\"https://github.com/kevinguitar/budgetplus-android/assets/18852983/bece0f6d-2f49-4562-b24e-4ff51cf5d5a8\"\u003e |\n\n---\n\n## Tech Stack\n\n### Business Logic and Core\n- [Kotlin Multiplatform](https://kotlinlang.org/docs/multiplatform.html) for shared logic across Android and iOS\n- [Compose Multiplatform](https://www.jetbrains.com/lp/compose-multiplatform/) for shared UI + MVVM Architecture\n- [Coroutines](https://kotlinlang.org/docs/coroutines-overview.html) \u0026 [Flow](https://kotlinlang.org/docs/flow.html) for asynchronous operations\n- [Metro](https://zacsweers.github.io/metro/latest/) for dependency injection\n- [Navigation3](https://developer.android.com/guide/navigation/navigation-3) for Composable navigation\n- [DataStore](https://developer.android.com/topic/libraries/architecture/datastore) for persistent data storage\n- [RevenueCat](https://github.com/RevenueCat/purchases-kmp) for in-app purchases and subscriptions\n- [AdMob](https://admob.google.com/home/) with Meta Audience Network mediation for ads\n- [Kotlinx Serialization](https://github.com/Kotlin/kotlinx.serialization) for JSON parsing\n- [Kotlinx Datetime](https://github.com/Kotlin/kotlinx-datetime) for date and time handling\n- [Firebase](https://firebase.google.com/)\n  - [Firestore](https://firebase.google.com/docs/firestore) for real-time database\n  - [Authentication](https://firebase.google.com/docs/auth) for Google and Apple ID sign-in\n  - [Crashlytics](https://firebase.google.com/docs/crashlytics) for crash reporting\n  - [Analytics](https://firebase.google.com/docs/analytics), [Messaging](https://firebase.google.com/docs/cloud-messaging), and [Remote Config](https://firebase.google.com/docs/remote-config)\n\n### Open-Source Libraries for KMP\n- [Coil3](https://github.com/coil-kt/coil) for image loading with KMP support\n- [Colorpicker-compose](https://github.com/skydoves/colorpicker-compose) for color picking\n- [Compottie](https://github.com/alexzhirkevich/compottie) for Lottie animations in Compose Multiplatform\n- [CrashKiOS](https://github.com/touchlab/CrashKiOS) for better crash reporting on iOS\n- [Csv](https://github.com/sergejsha/csv) for exporting data as CSV (KMP)\n- [Detekt](https://github.com/detekt/detekt) for Kotlin static code analysis\n- [Firebase Kotlin SDK](https://github.com/GitLiveApp/firebase-kotlin-sdk) for KMP support\n- [Kermit](https://github.com/touchlab/Kermit) for logging\n- [Keval](https://github.com/notKamui/Keval) for mathematical expression evaluation\n- [MockK](https://github.com/mockk/mockk) for mocking classes in unit tests\n- [Moko-permissions](https://github.com/icerockdev/moko-permissions) for KMP permission handling\n- [Reorderable](https://github.com/Calvin-LL/Reorderable) for reordering items in Compose\n\n### Android Specific\n- [In-App Review](https://developer.android.com/guide/playcore/in-app-review) and [In-App Update](https://developer.android.com/guide/playcore/in-app-updates) integration\n- [Baseline Profile](https://developer.android.com/topic/performance/baselineprofiles/overview) for improving app startup time\n\n---\n\n## Supported Deeplinks\n- Home screen: https://budgetplus.cchi.tw/record\n- Overview: https://budgetplus.cchi.tw/overview\n- Unlock premium: https://budgetplus.cchi.tw/unlockPremium\n- Settings: https://budgetplus.cchi.tw/settings\n- Settings with members dialog: https://budgetplus.cchi.tw/settings?showMembers=true\n- Sharing customized color tones: https://budgetplus.cchi.tw/colors?hex=cff1ff%3bdaf2cb%3b84c18f%3b596980\n\n---\n\n## Performance Optimization (Baseline Profile)\n\nThe project uses [Baseline Profiles](https://developer.android.com/topic/performance/baselineprofiles/overview) to improve startup performance.\n\n### Generating a Profile\nTo run the generator:\n```bash\n./gradlew :benchmark:connectedReleaseAndroidTest -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile\n```\n\nThe output can be found in: `benchmark/build/outputs/connected_android_test_additional_output/release/connected/[device]`.\n\nCopy and rename the file to `baseline-prof.txt` and place it in the `src/main` directory of the app module.\n\n### Running Macrobenchmarks\n```bash\n./gradlew :benchmark:connectedReleaseAndroidTest -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=Macrobenchmark\n```\n\n---\n\n## Backend: Firebase Cloud Functions\n\nDatabase interactions and push notifications are implemented using [Firebase Cloud Functions](https://firebase.google.com/docs/functions). \n\nThe backend repository is also open-sourced: [budgetplus-cloud-functions](https://github.com/kevinguitar/budgetplus-cloud-functions)\n\n---\n\nLicense\n-------\n\n    Copyright (c) 2024 Kevin Chiu\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n    \n    http://www.apache.org/licenses/LICENSE-2.0\n    \n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkevinguitar%2Fbudgetplus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkevinguitar%2Fbudgetplus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkevinguitar%2Fbudgetplus/lists"}