PennyWise automatically reads transaction SMS messages and transforms them into organized financial data with on-device AI assistance. No manual entry, no cloud processing, complete privacy.
翻译准备中
金融Kotlin · HTMLGitHub @sarim2000自行安装运营者未确认
试用过了吗? 点一下就好,无需登录。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Turn bank SMS into a clean, searchable money timeline with on-device AI assistance. Parsing, storage, and AI all run on your phone.
⭐ Star us on GitHub — join 300+ supporters!
Your bank already texts you every transaction — PennyWise turns those SMS into a private, zero-setup expense tracker with on-device AI. No accounts, no sign-ups, no effort.
📖 New here? The user guide walks through every feature step by step, with screenshots.
Key Differentiators
Core Features
More Features
Rules let you auto-categorize, modify, or block transactions based on configurable conditions. A rule consists of one or more "When" conditions and a "Then" action.
Available condition fields:
| Field | Description | Example value | Supported operators |
|---|---|---|---|
AMOUNT | Transaction amount | 200 | <, >, = |
TYPE | Income/Expense/Transfer | INCOME | contains, equals, starts with |
CATEGORY | Assigned category | Food & Dining | contains, equals, starts with |
MERCHANT | Merchant/vendor name | Amazon | contains, equals, starts with |
NARRATION | Transaction description | Monthly rent | contains, equals, starts with |
SMS_TEXT | Raw SMS body | OTP | contains, equals, starts with |
BANK_NAME | Bank name from SMS | HDFC Bank | contains, equals, starts with |
TIME / HOUR | Transaction time | 09:00 / 9 | before, after, at or after, at or before |
DAY_OF_WEEK | Day (1=Mon .. 7=Sun) | 1 | is, is any of, is not |
DAY_OF_MONTH | Day of month (1-31) | 15 | is, is any of, before, after |
DATE | Transaction date | 2026-03-21 | is, , |
Account condition (ACCOUNT) — Restricts the rule to transactions from a specific bank account. The value is stored as a BankName||Last4 composite key (e.g. HDFC Bank||1234). When selected, the UI shows an account picker populated from your tracked accounts. Only EQUALS and NOT_EQUALS operators are available.
Conditions can be combined with AND / OR logic, and multiple conditions per rule are supported.
Available actions:
JSON representation (stored locally, not exposed via API):
{
"conditions": [
{"field": "ACCOUNT", "operator": "EQUALS", "value": "HDFC Bank||1234"},
{"field": "AMOUNT", "operator": "GREATER_THAN", "value": "500"}
],
"actions": [
{"field": "CATEGORY", "actionType": "SET", "value": "Food & Dining"}
]
}
Supporting 172 banks & services across 26 countries with multi-currency capabilities:
AU Small Finance Bank, Airtel Payments Bank, Amazon Pay, American Express, Axis Bank, Bandhan Bank, Bank of Baroda, Bank of India, CRED, Canara Bank, Cashfree, Central Bank of India, City Union Bank, DBS Bank, Department of Post, Dhanlaxmi Bank, Equitas Small Finance Bank, Federal Bank, Greater Bank, HDFC Bank, HDFC Mutual Fund, HSBC Bank, ICICI Bank, IDBI Bank, IDFC First Bank, India Post Payments Bank, Indian Bank, Indian Overseas Bank, IndusInd Bank, JK Bank, Jana Small Finance Bank, Jio Payments Bank, JioPay, Jupiter, Karnataka Bank, Kerala Bank, Kerala Gramin Bank, Kotak Bank, LazyPay, NSDL Payments Bank, Navi Mutual Fund, OneCard, Pluxee, Punjab & Sind Bank, Punjab National Bank, SVC Co-operative Bank, Saraswat Co-operative Bank, Slice, South Indian Bank, Standard Chartered Bank, State Bank of India, Suryoday Small Finance Bank, Tamilnad Mercantile Bank, UCO Bank, Union Bank of India, Utkarsh Bank, Yes Bank
Citizens Bank, Everest Bank, Laxmi Sunrise Bank, Lumbini Bikash Bank, Machchhapuchchhre Bank, Manjushree Finance, NMB Bank, Nabil Bank, Nepal Bank Limited, Nepal SBI Bank, Prime Commercial Bank, Siddhartha Bank, Standard Chartered Bank Nepal
BAAC, Bangkok Bank, CIMB Thai, Government Savings Bank, KTC, Kasikorn Bank, Krungsri, Krungthai Bank, Siam Commercial Bank, TTB, UOB Thailand
ALECU, AdelFi, Altana Federal Credit Union, Charles Schwab, Chase, Citi Bank, Discover Card, Huntington Bank, Navy Federal Credit Union, Old Hickory Credit Union
Apollo, Awash Bank, Bank of Abyssinia, Commercial Bank of Ethiopia, Dashen Bank, Siket Bank, Telebirr, ZamZam Bank, Zemen Bank
Access Bank, GTBank, Jaiz Bank, Keystone Bank, Moniepoint, Opay, Standard Chartered Bank Nigeria, VFD Microfinance Bank, Zenith Bank
Al Rajhi Bank, Alinma Bank, Banque Saudi Fransi, D360 Bank, SABB, STC Bank, Saudi National Bank
CRDB Bank, Diamond Trust Bank, M-Pesa Tanzania, Mixx by Yas, NMB Bank Tanzania, Selcom Pesa, Tigo Pesa
Abu Dhabi Commercial Bank, Dubai First, Emirates Islamic, Emirates NBD, First Abu Dhabi Bank, Liv Bank, Mashreq Bank
Bankino, Mellat Bank, Melli Bank, Parsian Bank, Pasargad Bank, blu Bank
Bank al Etihad, Islamic International Arab Bank, Jordan Islamic Bank, Orange Money, Safwa Islamic Bank
Commercial Bank of Ceylon, National Development Bank, National Savings Bank, Nations Trust Bank, Sampath Bank
M-Pesa Mozambique, Millennium BIM, Standard Bank Mozambique, eMola
BRAC Bank, City Bank (Bangladesh), bKash
Arab Bank, CIB Egypt, National Bank of Egypt
Banco Agricola, Banco Cuscatlan, Banco Promerica
BPCE, Sparkasse Rhein-Maas
Equity Bank, M-PESA
Chase UK, Trading 212
Priorbank
Bancolombia
mBank CZ
Bank Muscat
Faysal Bank
T-Bank
Enpara
More banks being added regularly! Request your bank →
All AI processing happens on your device, powered by Google AI Edge LiteRT-LM running Qwen 2.5. Your SMS and transactions are parsed, stored, and analyzed locally — there are no accounts, no analytics, crash-reporting, or telemetry SDKs (no Firebase / Crashlytics / Sentry / Google Analytics — verify in app/build.gradle.kts), and no PennyWise server ever receives your financial data. The whole codebase is open source (AGPL v3) so every claim below is checkable.
standardImplementation), and they do their own background connectivity to Google — this is the most likely source of any "background data" you notice, especially on a single-currency setup. The F-Droid build strips all three and is fully Google-free.open.er-api.com. Automatic currency conversion runs only when you hold more than one currency (same-currency conversions make no call), but opening the currency picker also fetches the current rate list. Either way the request carries just a 3-letter currency code and a static User-Agent — no SMS, transactions, or device identifier — and results are cached locally. (ExchangeRateProvider.kt)Constants.MODEL_URL)pennywise.zynth.dev with the SMS text, its sender, and an RSA-encrypted device identifier (your Android ID plus a timestamp) pre-filled, and parses them server-side to show a preview. Nothing is sent unless you start this yourself. (SmsReportUrlBuilder.kt, DeviceEncryption.kt)Everything else stays on your phone.
Light Theme
Dark Theme
# Clone repository
git clone https://github.com/sarim2000/pennywiseai-tracker.git
cd pennywiseai-tracker
# Environment check + fast test gate (same compile/test tasks CI runs)
./init.sh
# Build APK
./gradlew assembleDebug
# Install
adb install app/build/outputs/apk/standard/debug/app-standard-universal-debug.apk
Architecture: MVVM • Jetpack Compose • Room • Coroutines • Hilt • Google AI Edge (on-device LLM) • Material Design 3
Pro unlocks unlimited custom rules, unlimited PDF statement imports, unlimited CSV export, duplicate-account merge and scheduled daily backups. It's how a solo developer keeps adding banks and features.
Buy it on the website: pennywise.zynth.dev/pro — ₹2,000 lifetime, ₹699/year or ₹149/month, GST included, cards and UPI accepted. You get a license key by email; in the app open Settings → PennyWise Pro → Have a license key? and paste it. One phone at a time; restoring a full PennyWise backup on a new phone carries Pro over, and the key dialog offers "Move to this device" for everything else (Play build 2.20.0+).
See CONTRIBUTING.md for guidelines.
Please read our Code of Conduct before participating.
./gradlew test # Run tests
./gradlew lint # Check style
Please review our Security Policy for how to report vulnerabilities.
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!
GNU Affero General Public License v3.0 - see LICENSE
This project is licensed under AGPL v3, which means:
beforeafterACCOUNT | Bank account composite | Select from picker | is, is not |