Android  ·  Kotlin  ·  On-device

Every subscription, found for you.

You already got a message for every one of them. Recurra reads the bank and payment messages sitting on your phone, works out which charges repeat, and tells you what next month costs before it arrives.

Detected monthly ₹2,417across 7 services
  • NetflixRenews 4 Oct₹649
  • SpotifyRenews 11 Oct₹119
  • Google OneRenews 17 Oct₹130
  • Jio FiberRenews 1 Oct₹699
  • Cult.fitRenews 22 Oct₹499
  • Unknown merchantReviewCharged twice, 60 days apart₹321
Parsed on deviceNo account
01

It reads what your bank already sent

Transaction messages and payment notifications. No bank login, no account aggregator, no screen-scraping of a banking app.

02

It separates a charge from a balance alert

A classifier decides what each message actually is, then dedicated extractors pull the merchant, the amount and the date out of the wording each bank happens to use.

03

It decides what is genuinely recurring

The recurrence engine looks for the same merchant at a steady interval. One coffee is not a subscription. The same ₹649 on the fourth of three straight months is.

The parsing happens on your phone. All of it.

Financial messages are about as sensitive as a phone gets. There is no server in this app to send them to, because there is no server at all.

Messages are read, classified and discarded in the same pass. What is kept is the result: a merchant, an amount, a cadence. Delete the app and that goes with it.

No sign-up, no email, no analytics SDK, no ad identifier.

PERSONALSideload build

Asks for message access as an ordinary runtime permission, which is what lets it read your history and find subscriptions you set up years ago.

PLAY SAFEStore build

Declares no message permission at all and works from notifications going forward. Same interface, same parser, same database. The only difference in the entire project is where the messages come from.

ONE SOURCEHow that is possible

Both builds compile from the same code. The split lives behind a single interface with one implementation per flavour, so no other file in the project knows which build it is in.

Kotlin  language Jetpack Compose  interface Room  storage Android 8.0+  minimum Zero  network calls