Tappi: Caller ID & Expenses
n., Kotlin, at Tappi- 1A caller ID and expense manager for small businesses: who is calling, and what the money did. Built from the ground up — around ten thousand installs, two thousand of them opening it on any given day.
- 2Local-first for privacy, not merely for patchy networks: transactions are parsed and classified on the handset and stay there. The on-device SQLite database is the system of record, with the schema design and versioned migrations that implies.
- 3Parsing and classification by regex, heuristics and rules, reconciled across several payment sources so income and expense land in the right place.
- 4A chat assistant, also mine. An orchestration layer hands DeepSeek the question and the app's tool definitions and asks it for one thing only: which tool to run. The tool executes locally against the on-device data, and the app draws the result as a chart inside the conversation.
- 5Which is what keeps it honest. The model never receives a figure, so it is never in a position to invent one — hallucinated arithmetic is not a risk mitigated here so much as one the architecture removes.
- 6Unit tests cover essentially every feature in the app, and CI runs them on every build.
Sensitive financial data, so the interface decisions were mine to own. Clarity first, then trust, then convenience.
Kotlin, Jetpack Compose, MVVM, Hilt, SQLite, Retrofit / OkHttp, LLM tool-calling, Firebase, CI/CD