A single-user, voice-and-text-first expense tracker for Android. Tap the mic (or type), say what you spent — an LLM extracts the amount, merchant, and category, and you confirm with one tap.
Not on the Play Store — this is a signed APK for sideloading. You'll need to allow "install from unknown sources" on your device.
- Voice or text logging — "spent 250 on groceries," spoken or typed, both routed through the same AI parsing pipeline.
- On-device speech transcription — Android's
SpeechRecognizer, with a review step so a misheard word is a quick edit, not a wrong transaction. - AI-powered parsing — a Supabase Edge Function proxies the transcribed text to an LLM, which returns structured amount/merchant/category data. The LLM API key lives only as an Edge Function secret; the app never holds it.
- Manual entry, category management, and spending reports with a Canvas-drawn donut chart, all backed by local Room storage.
- Kotlin + Jetpack Compose, Room (local persistence), minSdk 26
- Supabase Edge Function (Deno/TypeScript) as a secure LLM proxy
- Hand-rolled DI (
AppContainer) — no Hilt/Dagger
This app didn't start as a voice-first tracker — it started as an automatic
SMS-detection app that parsed bank UPI messages in the background. That
approach hit a wall: Google Play Protect blocks sideloaded apps requesting SMS
permissions, and iOS never allows any third-party app to read SMS content at
all, at any review tier. The full story of why that design was abandoned and
what replaced it is written up in
docs/PIVOT-FROM-SMS-TO-VOICE-AI.md.
- Copy your Supabase project URL/anon key and release signing config into
local.properties(seeapp/build.gradle.ktsfor the expected keys — never commit this file, it's gitignored on purpose). - Deploy the
voice-parseSupabase Edge Function undersupabase/functions/and set itsTEST_KEYsecret to your OpenAI API key. ./gradlew assembleDebug(orassembleReleasefor a signed build).