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.
- 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/-Gsenders 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.
- On first launch, the app asks for SMS permission.
- It scans your inbox and picks out messages that look like transaction alerts (containing an amount plus "debited"/"credited"/"spent" etc.).
- New transactions are saved locally as uncategorized.
- Pull to refresh (or tap the sync icon) any time to pick up new texts.
- Open Messages, long-press a bank/UPI transaction SMS, tap Share, and pick iExpense Tracker from the share sheet.
- 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.
- Repeat per message. There's no inbox-wide scan on iOS since Apple doesn't expose one to third-party apps.
- 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).
- Get a free Gemini API key from https://aistudio.google.com/apikey (no card required).
- Put it in a
.envfile at the project root:(seeAPI_KEY=your_gemini_api_key_here.env.example)..envis gitignored — never commit your key. - 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.
flutter pub get
flutter run # with a device/emulator connectedYou'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.
The share extension is built with receive_sharing_intent, which needs
one manual Xcode step this repo can't script:
cd ios && pod installThen 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.
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.
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