Skip to content
beSaifPublic

About

Tell it what you spent. It keeps the books. Nobody else sees your receipts.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Tally

Tally

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.

Home: month total, budget bar, entries by day A voice note parsed into an entry to confirm One sentence parsed into three entries Month overview with category bars

Try it: tally.codesaif.dev. You'll need a free Gemini API key.

What it does

  • 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.

Run it locally

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 :8787

Sign-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 mocked

Under the hood

A 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.

Privacy

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.

License

MIT

About

Tell it what you spent. It keeps the books. Nobody else sees your receipts.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages