A local-first semantic automation engine for Android — turning raw notifications and SMS messages into structured, meaningful actions without sacrificing privacy.
- Notification Capture — Listens to all incoming notifications via
NotificationListenerService - SMS Capture — Reads incoming SMS messages via
BroadcastReceiver - Rule Engine — Create custom automation rules with conditions (text match, regex, sender, amount detection, time windows) and actions
- Expense Automation — Auto-extract amount, currency, merchant, and category from bank/payment notifications
- Local Storage — All data stored on-device using SQLite (via sqflite)
- Event Log — Full audit trail of every captured notification and SMS
- Rule Preview — Test rules against sample text before enabling
┌─────────────────────────────────────────┐
│ Flutter UI │
│ (Home, Rules, Expenses, Events, Settings) │
├─────────────────────────────────────────┤
│ Provider State │
│ (Rules, Events, Expenses, Dashboard) │
├─────────────────────────────────────────┤
│ Services Layer │
│ (RuleEngine, ExpenseParser, PlatformChannel) │
├─────────────────────────────────────────┤
│ SQLite Database │
│ (rules, conditions, actions, events, expenses) │
├──────────────────┬──────────────────────┤
│ Platform Channel │ EventChannel │
├──────────────────┴──────────────────────┤
│ Native Android │
│ (NotificationListenerService, │
│ SmsReceiver, MainActivity) │
└─────────────────────────────────────────┘
lib/
├── main.dart # Entry point with provider setup
├── app.dart # App widget, theming, routing
├── models/
│ ├── automator_event.dart # Unified event model
│ ├── rule.dart # Rule, Condition, Action models
│ └── expense.dart # Expense model + categories
├── database/
│ └── database_helper.dart # SQLite database with all CRUD
├── services/
│ ├── rule_engine.dart # Core rule evaluation engine
│ ├── expense_parser.dart # Amount/merchant/category extraction
│ └── platform_channel_service.dart # Flutter <-> Android bridge
├── providers/
│ ├── rules_provider.dart
│ ├── events_provider.dart
│ ├── expenses_provider.dart
│ └── dashboard_provider.dart
└── screens/
├── onboarding/ # Progressive permission onboarding
├── home/ # Dashboard with stats
├── rules/ # Rule list + create rule
├── expenses/ # Expense ledger
├── events/ # Event log / audit trail
└── settings/ # Permissions & app info
android/.../kotlin/.../
├── MainActivity.kt # Platform channels
├── AutomatorNotificationService.kt # Notification listener
└── SmsReceiver.kt # SMS broadcast receiver
# Install dependencies
flutter pub get
# Run on connected Android device
flutter run
# Run tests
flutter testThe app requires:
- Notification Access — Enabled via system settings (NotificationListenerService)
- SMS Read Access — Requested at runtime (RECEIVE_SMS + READ_SMS)
Both permissions are requested progressively during onboarding with clear rationale.
- All processing happens on-device
- No cloud sync, no background uploads
- No analytics or tracking
- Full audit log of every automation