Skip to content

About

Reads your phone's SMS inbox, picks out bank/payment transaction messages, and lets you sort them into spending categories — with an optional AI assist to do the sorting for you. All data is stored in a local SQLite database on the device, so it survives app restarts and reboots — it's only gone if you uninstall the app or clear its data.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

iExpense Tracker

Version: 0.3.0

Reads your phone's SMS inbox, picks out bank/payment transaction messages, and lets you sort them into spending categories — with an optional AI assist to do the sorting for you. All data is stored in a local SQLite database on the device, so it survives app restarts and reboots — it's only gone if you uninstall the app or clear its data.

Android and iOS. Android auto-scans the SMS inbox directly. iOS has no API for that, so instead you share individual bank SMS from the Messages app into iExpense Tracker via the iOS share sheet — same parser, same categories, one message at a time.

Features

  • Automatic SMS parsing — scans the inbox for bank/UPI/wallet alerts (amount + debited/credited/spent/paid wording), skipping OTPs, promos, and anything that isn't a real transaction. Only DLT -S (service) senders are considered; -T/-P/-G senders are ignored.
  • Manual categorization — walk through pending transactions one by one from the Categorize tab (Uncategorized / Categorized / Ignored), pick a category, or fix the parsed amount inline.
  • AI Categorize (optional) — when a free Gemini API key is set in .env, one tap auto-suggests categories for a batch of pending transactions (by day range or a specific month), reusing whatever category you've picked before for the same sender. Off entirely if no key is configured — manual categorization always works.
  • Custom categories — create, rename, recolor, and re-icon categories; each one shows every transaction filed under it.
  • Budgets — set per-category monthly limits and track spend against them.
  • Reports — animated, tap-to-highlight category breakdown pie chart, monthly totals, and PDF export with dual pie/bar charts, saved straight to the device's Downloads folder with a completion notification.
  • Quick date filters — last 7/15/30 days or a specific month, used across categorization and reporting.

How it works

Android

  1. On first launch, the app asks for SMS permission.
  2. It scans your inbox and picks out messages that look like transaction alerts (containing an amount plus "debited"/"credited"/"spent" etc.).
  3. New transactions are saved locally as uncategorized.
  4. Pull to refresh (or tap the sync icon) any time to pick up new texts.

iOS

  1. Open Messages, long-press a bank/UPI transaction SMS, tap Share, and pick iExpense Tracker from the share sheet.
  2. The app parses that one message the same way Android's inbox scan does, and saves it as uncategorized — whether the app was open or closed at the time.
  3. Repeat per message. There's no inbox-wide scan on iOS since Apple doesn't expose one to third-party apps.

Both platforms

  • The home screen shows a pie chart + totals for everything you've already categorized, and a banner if anything's still pending.
  • Tap the banner to go through pending transactions one by one and assign a category (pick from presets or type your own) — or use AI Categorize to have Gemini suggest categories for a batch at once (see below).

AI Categorize setup (optional, free)

  1. Get a free Gemini API key from https://aistudio.google.com/apikey (no card required).
  2. Put it in a .env file at the project root:
    API_KEY=your_gemini_api_key_here
    
    (see .env.example). .env is gitignored — never commit your key.
  3. The "AI Categorize" button only appears on the Uncategorized tab when a key is present. Without it, the app works exactly as before — manual categorization only.

Setup

flutter pub get
flutter run   # with a device/emulator connected

You'll need Flutter installed. Android testing is easiest on a real phone (emulators normally have no real SMS to scan). iOS share-sheet testing works fine on the simulator since it only needs pasted/shared text, not a live inbox.

iOS-only build step

The share extension is built with receive_sharing_intent, which needs one manual Xcode step this repo can't script:

cd ios && pod install

Then open ios/Runner.xcworkspace in Xcode and follow the package's iOS setup guide to add the Share Extension target, App Group, and NSExtensionActivationRule (accept public.plain-text) — one-time setup, not needed again after.

Tuning the SMS detection

Bank SMS formats vary a lot by country/bank. If your transaction texts aren't being picked up (Android inbox scan or iOS share), adjust the regex patterns in lib/services/sms_parser.dart — that's the only place that decides whether a text message counts as a transaction, shared by both platforms.

Project structure

lib/
  main.dart                 - app entry point
  models/expense_transaction.dart
  services/
    db_helper.dart          - local SQLite storage (the persistence layer)
    sms_parser.dart         - decides if a text is a transaction + extracts amount (shared)
    sms_reader.dart         - Android: reads the SMS inbox, saves new transactions
    ios_share_intake.dart   - iOS: handles SMS text shared via the share sheet
    ai_categorizer.dart     - batched Gemini category suggestions (optional)
  screens/
    home_screen.dart        - overview / pie chart / sync
    categorize_screen.dart  - walk through uncategorized transactions
    budget_screen.dart      - per-category budgets
    reports_screen.dart     - charts + PDF export
    settings_screen.dart    - categories, about & support
  widgets/
    category_picker.dart    - bottom sheet to pick/create a category

About

Reads your phone's SMS inbox, picks out bank/payment transaction messages, and lets you sort them into spending categories — with an optional AI assist to do the sorting for you. All data is stored in a local SQLite database on the device, so it survives app restarts and reboots — it's only gone if you uninstall the app or clear its data.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages