The goal of Spend Sight is to take unstructured receipt text and turn it into data you can actually use: totals, dates, merchants, categories, and spending trends. Itβs built entirely with native iOS tooling to keep performance high and data local.
π Features
- π· Scan receipts using camera or photo library
- π On-device OCR using Appleβs Vision framework
- π§Ύ Extracts store name, total amount, and date (best-effort parsing)
- π· User-selected spending category before saving
- π Rescan an existing receipt to replace stored details
- π Delete receipts at any time
π Insights
- Daily spending chart (filled for missing days)
- Weekly spending chart (grouped by calendar week)
- 30-day summary: total spent + average daily spend
- Designed to scale into monthly trends and category breakdowns
π· Scanner View
The Scanner view is the primary entry point. Users can either take a new photo of a receipt or upload one from their library. After selecting an image, the app runs Vision OCR asynchronously to avoid blocking the UI. When OCR completes, the raw text is parsed into structured fields (store, total, date) and displayed as a clean preview card.
- Scan options: camera capture or photo library upload
- Processing state: shows a loading indicator while OCR runs
- Preview card: displays extracted Store Name, Total, and Date
- Category selection: user picks a category (e.g., Groceries, Dining, Transport)
- Save flow: saves structured data + raw OCR text to Core Data
π§Ύ Receipt List View
The Receipt List view displays all saved receipts pulled from Core Data using a fetch request. Receipts are sorted by date (newest first). Each row shows the merchant, total, category, and date for quick scanning. Tapping a receipt opens a detail page.
- Core Data fetch: persistent list across app launches
- Readable rows: store name + total + category + date
- Navigation: tap a receipt to view details
π§Ύ Receipt Detail View
The Receipt Detail view shows the saved receipt summary and the original OCR output line-by-line. This is useful both for transparency and debugging OCR edge cases. Users can delete a receipt or rescan it to replace all stored details while keeping the same record in Core Data.
- Summary: store name, total, category, date
- OCR transparency: displays scanned text line-by-line
- Rescan + replace: choose a new image β OCR β parse β overwrite fields
- Delete: removes the record from Core Data with confirmation
π Insights View
The Insights view aggregates receipts into daily and weekly totals, then visualizes them using Swift Charts. Daily totals are grouped by calendar day and missing dates are filled with $0 to keep the chart continuous. Weekly totals are grouped by week start date. A summary card displays total spending over the selected window and average daily spend.
- Daily chart: 30-day daily totals (continuous timeline)
- Weekly chart: grouped by week (last 12 weeks)
- Summary metrics: total spent + daily average
- Extensible: ready for category breakdowns and monthly analytics
- SwiftUI β UI framework
- Vision Framework β Optical Character Recognition (OCR)
- Core Data β Local data persistence
- Swift Charts β Spending visualizations
- UIKit (ImagePicker) β Camera & photo library integration
Swift Charts requires iOS 16+. Camera capture requires a physical iPhone.
Clone repository:
git clone https://github.com/chukaufo/Spend-Sight.git
- Open
Spend Sight.xcodeprojin Xcode - Ensure deployment target is iOS 16+
- Run on simulator or device (camera needs a real iPhone)
- Category breakdown (pie chart / stacked bars)
- Monthly + yearly trend analysis
- Budget tracking and alerts
- Improved item-level parsing (line items, quantities)
- Search / filter receipts (merchant, date range, category)
- iCloud sync
- Export to CSV
Spend Sight was built to explore how unstructured financial data from physical receipts can be transformed into structured insights using native iOS technologies. The project highlights OCR processing, parsing, persistence, and visualization end to end in a clean user flow: Scan β Preview β Categorize β Save β Analyze.