Veri Fin: The Local-First Android Ledger That Says No to Accounts, Ads, and Auto-Recording
Veri Fin shows a working local-first finance app can skip cloud sync and ad revenue entirely, and its pattern of keeping AI tools read-only is a direct answer to the privacy concerns of AI-assisted bookkeeping.
Veri Fin is a free, open-source Android bookkeeping app that keeps every byte of financial data on the device. There is no account, no ad network, and no cloud synchronization. The developer Talyra42, a frontend engineer, built it after existing apps pushed membership features and busy UIs. The app's core decisions are negative ones: refusing ads despite offers, skipping automatic recording because it would require screen, notification, or accessibility permissions, and leaving AI backend configuration to the user so token costs stay out of the project.
On the technical side, the app is Flutter with SQLite as the storage layer, now at schema v19, handling multi-currency by freezing base amounts at entry time. State management uses a simple Controller plus InheritedNotifier rather than a third-party state library. AI tools are strictly read-only, able to query and chart from a snapshot, but never modify ledger entries. The most time-consuming feature was the desktop widget, which runs in a separate Android environment and needed preview rendering across API versions.
After three months and over 1,300 commits, the repository has 167 stars, 21 forks, and 46 closed issues. The project is GPL-3.0 and accepts issues but not pull requests, to keep the codebase aligned with its internal conventions. The author's reflection: AI accelerates coding only when the product direction and constraints are already clear.
The choice to forgo automatic recording despite its convenience highlights how permission-heavy features can conflict with a strict data boundary; the developer traded convenience for a clear line on what the app can access.
The decision to keep state management off-the-shelf and use a simple Controller with InheritedNotifier suggests that a solo project can benefit more from few abstractions than from adopting a popular library.
The developer's refusal to rewrite in React Native despite familiarity points to a pragmatic rule: if a rewrite doesn't change user-visible behavior, it's often not worth the delay.
You've limited AI queries to read-only, and have recognized results become drafts first—that boundary is very clear in the product. I suggest adding a confirmation scenario across ledgers: select an image in ledger A to generate a draft, switch to ledger B while waiting for the AI response, then click save. The draft should always display the target ledger, and after switching, require re-confirmation to avoid the user looking at B's interface and saving the old draft to the wrong place. You could also add this and the scenario where the original ledger is modified after snapshot generation into regression tests, to verify that the interface prompts match the actual written book_id.
That makes sense, learned something.