Skip to content

Latest commit

 

History

History
90 lines (63 loc) · 4.08 KB

README.md

File metadata and controls

90 lines (63 loc) · 4.08 KB

Pace

Know what you can spend today.

License Version Android CI iOS CI

English · 中文

Pace is a daily-budget expense tracker with a native Android client and a native iOS client. One number tells you what today still allows. The ledger is stored only on your device; AI is an optional assistant and is off by default.

Product landing page: https://carlopenlab.github.io/pace/

  • Daily budget, honestly computed. Today's remaining = budget − the net spend you chose to count today. No rollover unless you opt in; editing a budget never rewrites history; the budget engine needs no network and no AI.
  • Logging that takes seconds. A floating Add button, optional one-sentence AI drafts that you always confirm before anything is written, refunds linked to the bill they reverse, transfers and card repayments kept out of spend.
  • Local-first and private. No account, no cloud ledger, no analytics. Full-fidelity, versioned JSON export at any time. See docs/AI_PRIVACY.md.
  • One shared core. Both clients share the budget engine, money rules, date attribution, import/export, and duplicate detection from a single Kotlin Multiplatform module, so the two platforms never disagree. Its fixed acceptance suite (60 tests) lives in shared/src/commonTest and docs/EDGE_CASES.md.

Product and technical planning: PLAN.md. Cross-platform contracts: docs/.

Pace is in active development (v0.1.3). There is no store listing yet — installable builds come straight from CI.

Repository structure

├── shared/          # Kotlin Multiplatform shared core (budget / money / stats / import-export / dedupe)
├── androidApp/      # Kotlin + Jetpack Compose native Android client
├── iosApp/          # Swift + SwiftUI native iOS client (XcodeGen project)
├── docs/            # Cross-platform contracts: budget rules / data model / export format / AI privacy / edge cases
├── src/ etc.        # Existing web/PWA prototype (React + Vite), reference only during migration
└── PLAN.md          # Product & technical plan

Install builds (CI)

Every push builds installable artifacts on the repo's Actions page (open a run, download from Artifacts):

Workflow Artifact Install with
android pace-android-debug-apk (debug APK) Download and install directly on an Android device
ios pace-ios-unsigned-ipa (unsigned IPA) Self-sign with AltStore / Sideloadly, then install
ios pace-ios-simulator-app Unzip and drag into the iOS Simulator
web — Web prototype type-check / test / build

Native development

Android (JDK 17 + Android SDK 34):

./gradlew :androidApp:assembleDebug

iOS (macOS + Xcode 15+, see iosApp/README.md):

./gradlew :shared:assembleXCFramework
cd iosApp && xcodegen generate && open iosApp.xcodeproj

Shared core tests (JVM is enough):

./gradlew :shared:testDebugUnitTest

Web prototype (reference implementation)

An offline-first import / categorization / stats prototype whose business rules have been extracted into shared:

npm install
npm run dev      # develop
npm test         # test
npm run build    # build

Documentation

License

MIT