
Tally. Scans a receipt and fills in the shop, date and total for you. No INTERNET permission at all. MIT.
Every receipt app I could find was a subscription that uploads photos of my shopping to someone else's server, so I wrote one that can't.
Point the camera at a receipt and it reads the shop, the date and the total, picks a category and adds it to your monthly spend. You don't type anything.
**The privacy part is structural, not a promise.** The app holds no `INTERNET` permission. ML Kit's Play Services dependencies try to pull it into the merged manifest, so it's stripped back out with `tools:node="remove"`. Android won't let the app open a socket even if it wanted to. `CAMERA` is the only permission it asks for. Don't take my word for it — `aapt dump permissions` on the APK will tell you.
OCR is the bundled ML Kit Latin model, shipped inside the APK and run on the phone's own CPU. No first-run download, works in aeroplane mode.
**How the detection works**, since that's the actual work:
- *Shop* matched against a dictionary of ~150 chains. Failing that, scored by layout: large text, near the top, mostly letters, penalised for looking like an address, phone number, VAT ID or a price. Every chain on the page is collected and ranked by prominence rather than taking the first one read, because a photo usually catches other text too and the receipt's own name is the one printed large.
Every field carries a confidence, and anything uncertain is flagged for you to check rather than quietly saved. If a photo loses the amount column which happens, since labels are bold and figures are small it reports the total as unreadable instead of reaching for some other number on the page. Correct a shop name once and it remembers that till's layout next time.
Also does budgets, monthly category breakdowns, and CSV export through the system file picker.
**Honest limitations.** It's v1.0. There are 57 unit tests covering the parser against realistic layouts, but it has been tried on only a handful of real tills, so it will meet one that confuses it I'd genuinely like to hear about it when it does. No line-item parsing yet, no cloud sync by design, Latin script only. The APK is debug-signed, so it sideloads fine but won't update over a future release-signed build.
Not on F-Droid: ML Kit is a proprietary Google dependency, so it isn't eligible for the main repo. IzzyOnDroid submission is next. For now it's GitHub releases.
Kotlin, Compose, Room, CameraX. minSdk 26. MIT.
Source and APK: https://github.com/encryxed/Tally