The Problem

Tracking personal expenses is tedious, and most finance apps push subscriptions or ads. Dime solves that with a free, open-source iOS expense tracker that feels native to the platform, using iCloud sync, widgets, and biometric protection to lower the friction of logging and reviewing spending.

What This Does

Dime is a SwiftUI app for iOS. The core logic lives in app/dime/, with data persistence handled by Core Data (app/MainModel.xcdatamodeld/) and iCloud sync via CloudKit. The app supports budgets, recurring expenses, categories, reminders, and dark mode.

The repo also includes a widget extension (app/ExpenditureWidget/) with nine widgets, plus a Siri intent extension (app/BudgetIntent/ and app/BudgetIntentUI/) for voice-driven expense entry. Localization covers English, French, and Russian (app/Localizations/).

How It Is Wired

The repository is a fork of rafsoh/dimeApp (1,862 stars). It contains 94 Swift files and 156 JSON files (mostly asset catalogs). The static analysis found no internal module graph—all code is in a single app target, so there are no import edges or circular dependencies to trace.

The app entry point is app/dime/AppDelegate.swift, which boots the SwiftUI lifecycle. Data flows through app/dime/Data/DataController.swift (1,271 lines), the Core Data stack owner. That file is the hub: views like BudgetView.swift and CategoryView.swift route all persistence through it. Widgets in app/ExpenditureWidget/ read the same store directly, so any change to the data model or store logic ripples across the app and all widgets.

External effects are limited to CloudKit sync (via CloudKitSyncMonitor) and network calls through Alamofire. The dependency list is in app/dime.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved.

How To Use It

Build with Xcode. The README instructs:

git clone https://github.com/moses-y/dimeApp

Open app/dime.xcodeproj in Xcode, let Swift Package Manager resolve dependencies, then run. No environment variables or API keys are required. The app targets iOS with a standard simulator or device build.

Real-World Use

A user logs an expense via the home screen quick action. The action calls into the data controller, which writes a Transaction entity to Core Data and triggers a CloudKit sync. The RecentTransactionsWidget refreshes from the same store, so the home screen updates without reopening the app. Budgets in BudgetView.swift calculate remaining amounts against the transaction's category, and a push reminder nudges the user to log the next expense.

Code Health & Issues

Static analysis found 47 issues: 31 high, 16 medium, 0 low. The main problems:

  • High – Deep nesting (34 instances) – e.g., app/ExpenditureWidget/BudgetWidget.swift has control flow nested 12 levels deep. Fix: early returns and guard clauses.
  • High – Duplicated code blocks (429 repeated 6-line blocks across 36 files) – e.g., app/dime/Data/DataController.swift and the widget files. Fix: extract shared helpers.
  • High – Oversized files (11 files)DataController.swift at 1,271 lines is the worst. Fix: split by responsibility.
  • Medium – High branching densityapp/dime/Data/Helper.swift has 52 branch points over 114 lines. Fix: decompose or use dispatch tables.

The code health audit flags two high-severity gaps: no test suite (94 source files, zero test files) and no CI workflow. Every change merges without a build or test gate. The repo has a license (GPL-3.0) and no committed secrets, but no lockfile and no Dockerfile.

The Bottom Line

Dime is a polished, feature-complete expense tracker with a solid feature set and good localization. The codebase is maintainable in size but shows real maintainability debt: deep nesting, duplication, and oversized files make changes risky, and the absence of tests or CI means regressions ship silently. It's a good reference for SwiftUI and Core Data patterns, but treat it as a codebase to refactor, not one to extend without adding a test harness first.