About Finance & Inventory App for LatAm Shops
Offline-first PWA + Android app: voice entry, FIFO costing, Drive backup.
What it is A finished, production-deployed finance app for micro and small businesses: the corner shop, the reseller, the one-person importer. It replaces the notebook. Sales, purchases, expenses, income, credit (fiado), loans, contacts and inventory in one mobile app that works with or without internet. It is local-first: each user data lives on their own phone (IndexedDB). No central database, no per-user server cost, no account required to start. It installs as a PWA and there is a signed Android APK/AAB ready for the Play Store. Bilingual Spanish/English, 10 LatAm currencies + USD/EUR. Three things that make it different from every expense tracker 1. Voice entry that understands a shopkeeper. Two modes. A guided mode with a 100% local parser (zero AI cost) that understands amounts, quantities, payment methods, yes/no and contact names in Spanish. And a call mode: a real-time spoken conversation powered by Gemini Live with an audio-reactive orb that pulses with the assistant voice. Neither one saves anything without a spoken yes first. 2. Real profit, not fantasy profit. Inventory uses FIFO batch costing as the single source of truth: every purchase is its own batch, with its own invested amount and its own final profit when it runs out. The product screen shows the real selling price range (min/max/average actually charged), not an invented margin from the list price. Per-product statistics: profit by period, sales pace, rotation, sleeping money, product comparison, and honest guardrails: with fewer than 5 sales or less than 30 days of history it shows the real numbers but refuses to project a trend. 3. Business and personal are two parallel systems, not a filter. Two axes are modelled: what was it for (business / personal) and where did the money come from (business till / own pocket). Paying a business bill with your salary shows up as a personal contribution; buying something personal with the till shows up as a withdrawal. No double counting anywhere. Business view, Personal view, and All (stacked, never summed). Feature list Money. Sales, purchases, expenses, income, inventory adjustments, payments on credit. Credit (fiado) in both directions with per-contact balances. Loans as their own module (cash in + debt, never income) with interest prorated per instalment and a loan-fund tracker. Loans you give out, treated as an asset, with collection tracking. Salary tracking with expected pay dates. Expense categories with real icons, business and personal. CSV export. Inventory. Catalogue with kardex, product variants, SKU/barcode with camera scanner, FIFO batches, physical stock count, restock tab with low-stock badge, copy-for-WhatsApp product sheet, per-product statistics and a product comparison screen. Intelligence. A Financial Checkup: health traffic light, expense-leak detector, snowball vs avalanche debt payoff plan with adjustable extra payment, and savings goals. All the maths is local and unit-tested. The AI only writes the advice text and is forbidden from inventing numbers, so with no quota and no internet the checkup still runs end to end. Platform. Installable PWA, fully offline (service worker precache), signed Android APK + AAB, backup to the user own Google Drive, local file export/import that does not need Google, dark premium UI with custom option menus, Android back button integrated, automatic data repair on startup. How the backup works, and why it costs the owner nothing Backups go into the user own Google Drive, in the hidden appDataFolder, using only the drive.appdata scope, which Google classifies as non-sensitive (basic OAuth verification: no demo video, no annual security audit). The app cannot see the rest of the user Drive, and the operator never stores customer data on any server. Backup cost is therefore 0 at any scale: 10 users or 100,000 users, each one pays with their own free Drive quota. It is a full snapshot system, not a two-way sync: 5 rotating backups, and restore is never silent (it compares local vs backup, takes an automatic safety copy first, runs transactionally, and refuses a backup from a newer schema version). OAuth uses the authorization-code flow with a refresh token, and the code-to-token exchange happens inside the Cloudflare Worker, so the client secret never reaches the browser. Tech stack React 19 + TypeScript, Vite 8, Tailwind 4, lucide-react. Dexie 4 over IndexedDB with 5 additive schema versions and migrations. vite-plugin-pwa for offline. One Cloudflare Worker as the only server (Gemini proxy + Google OAuth token exchange, protected by a shared app secret). Google Gemini for voice and advice. Hosted on Cloudflare Pages. 334 unit tests across 26 files (Vitest), all green. About 25,100 lines of TypeScript over 125 files, of which roughly 4,200 lines are tests. Custom i18n with 926 keys per language, type-safe: a missing translation breaks the build. What is included Full source code (frontend + Cloudflare Worker) with git history and inline docum...
For sale
Asking price: $4,500 USD
What's included
Source code, All related data
Also included: the Android signing keystore and the build pipeline that produced the signed APK and AAB (the .aab is ready to upload to the Play Store); handover of the Cloudflare Pages project and of the Cloudflare Worker; the privacy policy page as a template to adapt; the full test suite; and reasonable email support during the transfer. Not included: the brand. The current name, logo, app icon and intro video stay with me, they belong to my other business. The buyer rebrands, which is a straightforward swap: every PWA icon is generated from one SVG by a script that is included, and the intro video is a single file you replace or delete. The UI design, the code, the tests and the infrastructure all transfer. The buyer will need their own Google Cloud project (OAuth client ID and secret for the Drive backup) and their own Gemini API key. Both are quick to create and the code reads them from environment variables.
Reason for selling
I am busy with other things and no longer have time to maintain this project.