Tell it what you spent. It keeps the books.
I didn't want another expense app with a form. I wanted something I could just talk to: "coffee 4, groceries 23.40 at Coop, train 22.80", said out loud on the way home, and have it all land as proper entries. That's Tally. Type it, say it, or photograph the receipt, and Gemini turns it into structured expenses. It's bring your own key: the AI runs on your own Google AI Studio key, straight from your browser, and nobody but you ever sees your receipts.
Try it: tally.codesaif.dev. You'll need a free Gemini API key.
- Three ways to log: type a sentence, hold the mic and talk, or snap a receipt. One sentence can become several entries.
- A confirm sheet shows what Gemini understood (amount, what, category, when, note) before anything is saved.
- Month total with budget progress and entries grouped by day, one tap away from Analytics: spending by category with shares and like-for-like changes (the first five days of this month against the first five of last), fixed costs apart from day-to-day spending, and a drill-down into any category with its last six months against their average, its own monthly budget and alerts. CSV export.
- A monthly report for every month (total vs budget and the month before, categories, biggest expenses, six-month history, an optional two-sentence Gemini summary) that saves as a PDF; the first-of-month notification opens it.
- Recurring bills: say "Netflix 18.90 every month on the 15th" and it becomes a bill. Tally spots the same price on a steady beat in your past entries and offers to keep it, a calendar shows what is paid and still to pay (tap a day and say a bill to put it there), and each bill either logs itself on the day or asks you first. Home keeps it short: the next bill, anything due, and your last two days, with the rest of the month faded below.
- Ask your data in plain language: "how much on coffee this month?"
- Push notifications: a daily reminder, alerts at 50 / 80 / 100 % of the budget and of each category budget, a Monday summary and a first-of-month report.
- English and French. Installable PWA that behaves like a native app.
Node 22 and npm 10.
npm install
npm run vapid # Web Push keys → .dev.vars
npm run db:migrate:local # local D1 database
npm run dev # http://localhost:5173, API on :8787Sign-in needs a Google OAuth client in .dev.vars (.dev.vars.example explains). Then paste a
Gemini key in Settings and start logging.
npm run check # typecheck app + Worker
npm test # unit tests + Worker tests in workerd with D1
npm run e2e # Playwright, with Gemini, Google sign-in and push mockedA Preact PWA and a Hono Worker on Cloudflare with D1. Audio, text and photos
go from the device straight to Gemini; the Worker only ever stores the resulting entries. Web
Push is implemented with WebCrypto (VAPID, aes128gcm), and a cron trigger every 15 minutes
handles reminders and summaries.
- docs/DEPLOY.md: your own Tally on Cloudflare's free tier.
- docs/SPEC.md: the build spec.
- design/: design round 01, the three layouts this was picked from.
Your Gemini key lives in your browser and is sent only to Google. Tally stores your Google account id, email and entries, nothing else. Sign-in is Google's OpenID Connect flow run by the Worker, with no Google script on the page. Export everything as CSV any time; deleting the account removes all of it.



