Snap a photo of your receipts, or just say what you spent, and SpendSmart turns it into a clean dashboard, a spending map, an AI chat, and smart insights. No bank connection needed.
I'm no longer actively developing SpendSmart, but the app is live and the code is open source under the MIT license. Contributions are very welcome. Fork it, fix something, add a feature, or build on top of it. See Contributing below to get started.
| Area | What it does |
|---|---|
| Scanning | AI receipt scanning (camera, photos, files), batch mode, voice entry ("I spent $12 at Starbucks"), multi-page stitching |
| Intelligence | Smart spending insights, AI chat about your expenses, 8 chart types, store-location spending map |
| Experience | Shareable spending cards, haptics, animated micro-interactions, 10-step onboarding with an interactive scan demo |
The app uses a freemium model (RevenueCat): a free tier with weekly scan limits, and a Plus tier with unlimited scanning, smart insights, cloud sync, and data export.
- App: Swift + SwiftUI (iOS 18.0+), MVVM architecture
- Database & Auth: Supabase (Postgres + Apple Sign-In)
- Subscriptions: RevenueCat (StoreKit 2)
- AI pipeline: Gemini 2.5 Flash (validation + parsing) and Mistral OCR (text extraction)
- Backend: Express.js on Vercel (serverless)
- macOS with Xcode 16+
- iOS 18.0+ device or simulator
-
Clone the repo
git clone https://github.com/madebyshaurya/SpendSmart.git cd SpendSmart -
Create your API keys file from the template
cp SpendSmart/App/APIKeys.template.swift.example SpendSmart/App/APIKeys.swift
APIKeys.swiftis gitignored, so your keys never get committed. -
Fill in your keys in
APIKeys.swift. The template explains where to get each one:Key Where to get it Required? supabaseURL/supabaseAnonKeySupabase dashboard → Project Settings → API Yes (auth + storage) revenueCatAPIKeyRevenueCat → project API keys Yes (subscriptions) secretKeyYour backend's shared secret For AI features productionURLYour deployed backend URL For AI features brandfetchAPIKeyBrandfetch Optional (store logos) -
Open and run
open SpendSmart.xcodeproj
Note
About the backend. AI receipt scanning, chat, and insights call a small backend service (Express on Vercel using Gemini + Mistral OCR). That backend isn't included in this repo. The app builds, runs, and signs in without it, but you'll need to point productionURL (or a local http://localhost:3000) at your own backend that implements the same endpoints for AI features to work.
SpendSmart/
├── App/ # Entry point, API keys, app constants
├── Core/ # Supabase, backend API, local storage, Keychain
├── Services/ # AI, subscriptions, haptics, insights, batch processing
├── ViewModels/ # MVVM view models
├── Models/ # Receipt, Profile, AppState, ChatChart
├── Views/ # Auth, Dashboard, Scanner, Receipts, Chat, Map,
│ # Settings, Subscription, Onboarding, Statistics
├── Components/ # Reusable UI: buttons, cards, toasts, skeletons
├── Charts/ # 8 chart types
├── Extensions/ # Color, Font, Animation, UIImage helpers
└── Illustrations/ # Animated illustrations
Pull requests are welcome, whether it's a bug fix, a new chart, a UI polish, or docs.
- Fork the repo and create a branch:
git checkout -b my-change - Make your change. Match the existing style: SwiftUI + MVVM, and reuse the components in
Components/and the design tokens inExtensions/so things stay visually consistent. - Build and run on a simulator to confirm it works.
- Open a PR with a short description of what you changed and why.
No formal CLA or process. Keep PRs focused and they'll be easier to review.
MIT © 2025 Shaurya Gupta
