# PennyWise turns bank SMS into an expense tracker without a server

> PennyWise is an Android expense tracker that reads the transaction SMS messages your bank already sends and parses them on the phone, so there is no account to create and nothing to sync. The parsing rules cover 163 banks across 25 countries, and the AI assistant that answers questions about your spending runs locally on a Qwen 2.5 model rather than in the cloud.

**sarim2000/pennywiseai-tracker** — 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.

- Repository: https://github.com/sarim2000/pennywiseai-tracker
- Website: https://github.com/sarim2000/pennywiseai-tracker
- Stars: 600 · Forks: 158
- Language: Kotlin
- License: AGPL-3.0
- Published: 2026-10-22 · Updated: 2026-10-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/sarim2000-pennywiseai-tracker

## The premise is that the data already arrives

PennyWise describes itself as a free and open source private SMS-powered expense tracker, and the premise is in the first line. Your bank already texts you every transaction, so the app turns those SMS into a clean, searchable money timeline with on-device AI assistance. Parsing, storage and AI all run on your phone.

That premise is what makes the zero-setup claim work. There is no account to create, no sign-up and no effort, because the information source is already there and already reaching the device.

The three steps of how it works are worth reading in full. You grant SMS permission, read-only, with no account creation, no inbox changes and no messages sent. PennyWise then parses your transactions instantly, extracting amount, merchant, category and date, with new SMS detected in real time. And then you get insights, meaning analytics, budgets, subscriptions and an on-device AI assistant you can ask anything.

That read-only framing is the detail that makes the permission request defensible. An expense tracker asking for SMS access is a red flag for most people, and the distinction between read-only and send, and between the app being a default SMS handler or not, is what the documentation leads with.

The AI assistant is powered by Qwen 2.5 and runs entirely on the phone, so asking what you spent on food is a local inference rather than a request to a server that then learns about your finances.

The project is Kotlin, AGPL-3.0 licensed, with the last push on 2026-10-20 and releases v2.23.0 from 2026-10-17, v2.22.0 from 2026-10-12 and v2.21.0 from 2026-09-26. It is on Google Play, the App Store and F-Droid, with over 100 downloads and 300 or more GitHub supporters according to the badges.

## The parsing is the hard part, and it is the part with a bank count

Every bank sends transaction SMS in its own format, and that is the entire engineering problem in this kind of app. The feature list states the coverage as 163 banks across 25 countries, with real-time detection of incoming SMS.

The number matters because it is the number of message formats that have been worked out. A bank sends a debit notification in one format and a credit notification in a slightly different one, and there are variations by country because the currency, the date format and the merchant naming conventions all differ. 163 banks across 25 countries is a large body of format-specific work, and it is the part of the project that a user experiences as working or not.

The parse result is a normalised transaction with amount, merchant, category and date, which is what lets the rest of the app work with data rather than with text.

Multi-currency support is a separate feature and it is more than a display preference. The app supports INR, USD, AED, THB, NPR, ETB and others natively, with exchange rate management, because a tracker used across several currencies has to convert for totals and has to keep the original amount alongside.

The repository layout shows where the parsing lives. There is a parser-core/ directory at the top level, separate from the app/ directory, which suggests the bank-specific parsing is kept as a separate module rather than inside the Android application code. That separation is what would let the parsers be shared, and it is consistent with the fact that there is also an iosApp/ directory and a shared/ directory alongside app/, since the project is clearly being extended beyond Android.

There is a pennywise-web/ directory too, which is probably the web interface for the data, and a scripts/ and tools/ directory.

## The rules engine is where you take over from the parser

Automatic categorisation is handled by a rules engine, and the rules table is one of the more detailed parts of the documentation.

A rule consists of one or more When conditions and a Then action. The available condition fields are AMOUNT for the transaction amount with the operators less than, greater than and equals, TYPE for income, expense or transfer, CATEGORY for the assigned category, MERCHANT for the merchant or vendor name, NARRATION for the transaction description, SMS_TEXT for the raw SMS body, and BANK_NAME for the bank name from the SMS.

The string fields share the same three operators, contains, equals and starts with. The presence of SMS_TEXT among them is the interesting one, because it lets a rule match on the raw message rather than on the parsed result, which is how you catch a transaction whose format the parser did not recognise.

That is a genuinely useful escape hatch. If your bank sends something the parser misreads, the merchant field will be wrong and a merchant rule will not fire, but a rule on the raw text will still match, so you can build a workaround without waiting for a parser fix.

The point of the rules engine is that the parsers cannot know your intent. The parser knows that a message says you spent 400 at a merchant. It cannot know whether that merchant is a business expense you want in a category called Travel, or a personal one you want excluded from a budget. Rules are how you express that.

The feature list also mentions custom categories with custom colours and icons, which is the manual counterpart to the automatic categorisation, and the Pro tier mentions unlimited rules, which suggests the free version has a capped number.

## Budgeting, analytics and subscriptions cover the reporting side

The feature list runs long, and the parts that make it a tracker rather than a parser are the reporting ones.

Budget tracking supports multiple budget groups with Limit, Target and Expected types, plus a daily allowance and category-level budgets. The three types are worth distinguishing, because they mean different things. A limit is a cap you must not exceed. A target is what you are aiming for. An expected figure is what you expect to spend, which is a forecast rather than a constraint. Having all three in one place lets you set a hard limit on one category and a softer goal on another without a separate mechanism.

A daily allowance is the feature that changes behaviour rather than just reporting, because it turns a monthly budget into a number you can act on today.

Analytics covers bar charts, line trends, heatmaps, category breakdowns, top merchants and custom date ranges. Multi-account and balance tracking lets you track several bank accounts with a live balance read from the SMS and a balance history. Subscription detection finds recurring payments automatically and alerts you before the due date, which is the feature that catches the thing people actually want to know about their money.

Search and filters work by category, merchant, period, currency and transaction type. Manual transactions let you add and edit entries by hand, which matters because not everything you spend goes through a bank SMS.

On the platform side there are home screen widgets for budget progress and recent transactions, biometric app lock with a configurable timeout, theming with dynamic colours and several cover styles and light, dark and system themes, CSV export for taxes, and full backup and restore in a .pennywisebackup format.

A user guide exists and is linked for anyone new, walking through every feature step by step with screenshots, and there is a Discord community.

## A solo developer with a paid tier and a privacy document

The free and open source framing is paired with a commercial tier, and the documentation is explicit about why.

The app is AGPL v3 licensed with no ads and no trackers, and an optional PennyWise Pro upgrade with unlimited rules, PDF statement imports, CSV export, account merge and scheduled backups supports the solo developer. That is a clean arrangement, and the reason it is stated plainly in the feature list rather than hidden is a good sign.

The repository layout shows the seriousness of the surrounding project management. There is a SECURITY.md, a PRIVACY.md, a CODE_OF_CONDUCT.md, a CONTRIBUTING.md, a GLOSSARY.md, a TODO.md and a TRADEMARKS.md. The glossary is a sign of a project with domain language worth pinning down, and the trademark file suggests the name is defended rather than merely used.

There is an AGENTS.md and a CLAUDE.md, which means the project expects contributions to be made with tooling assistance. There is a .coderabbit.yaml for automated code review and a crowdin.yml with a crowdin/ directory, so the translation workflow is set up for the international audience that 25 countries of banks implies.

The build is Gradle in Kotlin DSL, with build.gradle.kts, settings.gradle.kts, gradle.properties and the gradlew wrappers. There is a fastlane/ directory, which is the usual release automation for both the Play Store and F-Droid, and an init.sh script.

The presence of iosApp/ and pennywise-web/ alongside the Android app/ is the most interesting structural fact. The app is described as Android in the badges, with the minimum at Android 8.0, but an iOS app directory and a shared/ directory suggest the intent is a shared core across platforms, with parser-core/ as the piece that would be common to all of them.

That would fit the design. The hard part of this app is the bank parsers and the AI assistant, and neither of those is Android-specific.

## Conclusion

Adopt PennyWise if you want a spending tracker with no account, no subscription service and no data leaving the phone, since the parsing, the storage and the assistant all run locally and the SMS permission is read-only. Skip it if your bank does not send transaction SMS, because the whole approach depends on it, and if you need multi-device sync, since there is no server to sync with. Verify first that your bank is one of the 163 the parser covers, that you are comfortable granting read SMS access to a finance app, and what the optional Pro tier changes, since the free version and the paid one differ in rules, exports and backups.

## FAQ

### How does PennyWise turn SMS into expense data?

You grant read-only SMS permission with no account creation, no inbox changes and no messages sent, and the app parses incoming transaction SMS instantly, extracting amount, merchant, category and date, detecting new messages in real time. The parsing is specific per bank and covers 163 banks across 25 countries.

### Does PennyWise send my financial data anywhere?

No. All AI processing and transaction storage happen on your phone, with no accounts, no analytics and no servers collecting your data, and the on-device AI assistant is powered by Qwen 2.5 running entirely on the device. The app is AGPL v3 licensed with no ads and no trackers.

### What are the smart rules in PennyWise and what can they match on?

A rule consists of one or more When conditions and a Then action, used to auto-categorize, modify or block transactions. The condition fields are AMOUNT, TYPE, CATEGORY, MERCHANT, NARRATION, SMS_TEXT and BANK_NAME, with the string fields supporting contains, equals and starts with, and including the raw SMS body so a rule can match even when a transaction format was not parsed as expected.

## Sources

- [License: AGPL-3.0](https://github.com/sarim2000/pennywiseai-tracker/blob/main/LICENSE)
- [Project website](https://github.com/sarim2000/pennywiseai-tracker)
- [README](https://github.com/sarim2000/pennywiseai-tracker/blob/main/README.md)
- [Releases](https://github.com/sarim2000/pennywiseai-tracker/releases)
- [sarim2000/pennywiseai-tracker on GitHub](https://github.com/sarim2000/pennywiseai-tracker)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/sarim2000-pennywiseai-tracker
