A modern, beautifully crafted iOS expense tracking app built with SwiftUI and SwiftData.
Spendora helps you track, understand, and optimize your spending with a clean UI, powerful analytics, and seamless Apple ecosystem integration.
Managing personal finances shouldnβt feel like a chore.
Spendora is designed to be:
- β‘ Fast
- π― Intuitive
- π Insightful
- π Beautiful in both light & dark mode
Most expense tracking apps are either:
- Too complex π§©
- Too boring π΄
- Or too outdated π°οΈ
Spendora was built to fix that.
The goal was simple:
Build an expense tracker that is fast, beautiful, and actually enjoyable to use.
- Log expenses with title, amount, category, and notes
- Attach receipt images
- Clean and intuitive input flow
- Categorize expenses with icons and colors
- Automatic grouping (Today, Yesterday, Weekly, Monthly)
- Track expenses in multiple currencies
- Automatic conversion to base currency
- Category breakdown (pie chart)
- Monthly spending trends (bar chart)
- Real-time insights into spending habits
- iCloud sync across devices
- Face ID / biometric authentication
- Fully optimized for Light & Dark mode
- Gradient-based design system
- Smooth animations & transitions
Grouped sections like Today, Yesterday, Last Week with realistic data.
![]() |
![]() |
Realistic filled state with selected category.
![]() |
![]() |
Clear breakdown of spending across categories.
![]() |
![]() |
Understand your spending patterns visually.
![]() |
![]() |
![]() |
![]() |
Secure login with Apple Sign In & Face ID.
![]() |
![]() |
- SwiftUI β Declarative UI framework
- SwiftData β Modern persistence layer
- Charts β Native data visualization
- Combine β Reactive programming
- iCloud β Sync & storage
Spendora follows a clean, scalable architecture:
- MVVM β Separation of UI and business logic
- SwiftData β Modern persistence layer with reactive updates
- Feature-based modular structure
- Reusable UI components
- Deterministic snapshot testing for UI stability
Spendora/
βββ Spendora/ # Main app code
β βββ Core/Mock/ # Mock data & testing utilities
β βββ Finances/ # Core finance features (charts, services, views)
β βββ Views/ # App-level UI (Account, MainApp, Splash)
β
βββ SharedModels/ # Shared models, extensions, reusable UI
β βββ Models/ # Spend, Category, User
β βββ Views/ # Reusable UI components
β βββ Helper/ # Utilities & helpers
β
βββ LoginFeature/ # Modular login feature (MVVM)
β βββ API/ # Authentication + Keychain
β βββ ViewModel/
β βββ Views/
β
βββ SpendoraTests/ # Unit + Snapshot tests
β βββ __Snapshots__/ # Snapshot images
β
βββ SpendoraUITests/ # UI tests
βββ Screenshots/ # README images (curated snapshots)
βββ README.md
- iOS 17+
- Xcode 15+
- Apple ID (for iCloud sync)
git clone https://github.com/pragoel/Spendora.git
cd Spendora
open Spendora.xcodeprojRun the app:
Cmd + R
let spend = Spend(
title: "Coffee at Starbucks",
detail: "Morning coffee",
amount: 5.50,
currency: "USD",
date: Date(),
category: foodCategory,
receiptImageDatas: [receiptImageData]
)
modelContext.insert(spend)Contributions are welcome!
- Open issues for bugs or feature requests
- Submit PRs for improvements
- Issues: https://github.com/pragoel/Spendora/issues
- Discussions: https://github.com/pragoel/Spendora/discussions
Pratik Goel
Give it a star βοΈ β it helps a lot!











