Tally
Tally is a native macOS and iOS app for finding recurring charges in bank statements. The source is public now, while the app itself is still being refined. I import a statement file, it flags likely subscriptions on-device, scores which are worth a look, and writes renewal reminders to Calendar.
- 100+
- Swift files
- macOS + iOS
- native targets
- On-device
- detection path
- Public source
- active app build
A native app for reviewing subscriptions from a statement file. It detects likely recurring charges on-device, scores the ones worth reviewing, and creates renewal reminders in Calendar.
Find recurring charges. Put renewals on the calendar.
A native app for reviewing subscriptions from a statement file. It detects likely recurring charges on-device, scores the ones worth reviewing, and creates renewal reminders in Calendar.


Import
CSV, XLSX, or legacy XLS comes in as a local statement file. Column detection and mapping turn it into normalized transactions.
Local file inDetect
The app groups repeat merchants, checks cadence and amount patterns, and uses on-device model calls for the ambiguous cases.
Local scoringAudit
Each likely subscription gets a review score and a plain-English reason so I can decide what to keep, cancel, or watch.
Review listCalendar
Confirmed renewals become Calendar events with local alerts.
Reminder surfaceFour pieces matter: statement import, recurring-charge detection, review scoring, and Calendar reminders.
Statement import.
The current build accepts CSV, XLSX, and legacy XLS statement files. It detects columns, normalizes transactions, and cleans up payment-processor names so charges point back to the actual merchant.
CoreXLSX + vendored libxlsRecurring-charge detection.
The detector looks for monthly, biweekly, quarterly, semiannual, and annual patterns. It weighs timing, amount consistency, keywords, and known merchant profiles before calling something a subscription.
Cadence + merchant signalsOn-device intelligence.
Apple Foundation Models handles uncertain merchant cleanup, category hints, and review explanations on-device. The app still has deterministic fallbacks when model output is not available.
On-device SystemLanguageModelReview scoring.
The audit view scores each likely subscription 0–100 across overlap, price movement, confidence, cost, review status, and tenure.
0–100 across six factorsApple-native storage.
SwiftData is the local source of truth, with CloudKit sync across my Apple devices and a local fallback when iCloud is not available.
SwiftData source of truthThe app does not trust one signal. A charge has to look recurring by timing, amount, merchant, and category before it counts.
- Clean the merchant name first, including common payment-processor prefixes like SQ *, SP *, PADDLE.NET, GUMROAD, and FASTSPRING.
- Group charges by cadence across monthly, biweekly, quarterly, semiannual, and annual patterns.
- Score each group by timing, amount consistency, subscription keywords, and known merchant profiles.
- Use the on-device model only for uncertain merchants and categories, not for every row.
- Turn the result into a review score and a Calendar reminder.
The build is active. The idea is simple.
Local-first keeps the trust boundary clear.
Statement review stays on the device. With private finance data, that is what makes it an app I will actually use.
Rules first keeps detection explainable.
If a deterministic rule can call a charge recurring, the model never sees it. I only reach for Foundation Models on the merchants the rules can't resolve.
Calendar is the right reminder surface.
A tracker only helps if the reminder beats the charge. Calendar already pings me; a separate inbox would not.
The public repo and the active native app.
Public repository for the native subscription tracker, including the SwiftUI app, statement import, local detection pipeline, tests, and public-release docs.
public source · active appSwiftUI app with a shared SwiftData model layer and CloudKit sync across Apple devices. The active local repo has 100+ Swift files including tests.
active app buildLocal recurring-charge detection across cadence, amount consistency, keywords, and merchant profiles. Apple Foundation Models handles uncertain cleanup and explanations on-device.
localLikely subscriptions get a 0–100 review score and a short rationale so the app returns a decision list instead of a larger spreadsheet.
user-facing artifactConfirmed renewals land in Calendar through EventKit with local notifications before the next charge.
user-facing artifact

