Skip to content

Latest commit

Β 

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ZΓΌriBudget - iOS Finance Tracker for ZKB Users

A native iOS app built with SwiftUI that allows ZΓΌrcher Kantonalbank (ZKB) users to track their finances by parsing uploaded PDF monthly statements.

πŸš€ Quick Start: See QUICKSTART.md - Get running in 5 minutes πŸ“– Full Setup Guide: See SETUP.md - Comprehensive Xcode configuration πŸ§ͺ Testing Guide: See TESTING.md - Complete testing instructions πŸ”’ Privacy Policy: See PRIVACY_POLICY.md - Privacy guarantees


Design Philosophy: Swiss International Style

ZΓΌriBudget embodies the Swiss International Typographic Style:

  • Grid System: Mathematical, rigid grid layouts with precise alignment
  • Typography: San Francisco font treated like Helvetica - high contrast, large headers, distinct weight differences
  • Minimalism: Generous whitespace, no illustrations, functional design
  • Color Palette: ZKB brand identity with functional color usage
  • Components: Sharp corners (4-8px radius), flat design, no drop shadows

Color Palette

Based on ZKB's brand identity:

Color Hex Usage
ZKB Blue #0066B2 Primary brand color, headers, primary actions
ZΓΌrich Blue #268BCC Secondary/highlight, interactive elements
Signal Red #FF3B30 Expenses/debits, critical actions
Emerald Green #34C759 Income/credits, success states
Canvas White #FFFFFF Light mode background
Deep Slate #1C1C1E Dark mode background

Technical Stack

  • Language: Swift 6
  • UI Framework: SwiftUI
  • Data Persistence: SwiftData (ModelContainer, @Model)
  • PDF Parsing: PDFKit (Native framework)
  • Architecture: MVVM (Model-View-ViewModel)

Project Structure

ZuriBudget/
β”œβ”€β”€ ZuriBudget/
β”‚   β”œβ”€β”€ ZuriBudgetApp.swift                # App entry with security & auth
β”‚   β”œβ”€β”€ Models/
β”‚   β”‚   β”œβ”€β”€ Transaction.swift              # SwiftData model for transactions
β”‚   β”‚   β”œβ”€β”€ TransactionType.swift          # Enum: debit/credit
β”‚   β”‚   └── Category.swift                 # Enum: auto-categorization logic
β”‚   β”œβ”€β”€ Services/
β”‚   β”‚   β”œβ”€β”€ PDFParserService.swift         # Secure ZKB PDF parsing
β”‚   β”‚   β”œβ”€β”€ BiometricAuthService.swift     # Face ID/Touch ID authentication
β”‚   β”‚   β”œβ”€β”€ SecureFileManager.swift        # Secure file handling & auto-delete
β”‚   β”‚   └── DataProtectionManager.swift    # Encryption & data protection
β”‚   β”œβ”€β”€ Views/
β”‚   β”‚   β”œβ”€β”€ HomeView.swift                 # Main dashboard
β”‚   β”‚   β”œβ”€β”€ FinancialSummaryView.swift     # Income/Expense cards
β”‚   β”‚   β”œβ”€β”€ TransactionListView.swift      # Full transaction list
β”‚   β”‚   β”œβ”€β”€ TransactionRowView.swift       # Transaction row component
β”‚   β”‚   β”œβ”€β”€ DryRunView.swift               # Import preview
β”‚   β”‚   └── PDFImportView.swift            # PDF upload UI
β”‚   β”œβ”€β”€ ViewModels/
β”‚   β”‚   └── HomeViewModel.swift            # Dashboard business logic
β”‚   └── Design/
β”‚       └── ZKBColors.swift                # Swiss design system & colors
β”œβ”€β”€ PRIVACY_POLICY.md                      # Complete privacy documentation

Security Features πŸ”’

ZΓΌriBudget implements bank-level security for your financial data:

Multi-Layer Protection

  1. Biometric Authentication

    • Face ID / Touch ID required on app launch (default: enabled)
    • Automatic passcode fallback if biometrics unavailable
    • Re-authentication required when returning from background
  2. Data Encryption

    • SwiftData database encrypted with FileProtectionType.complete
    • Data accessible only when device is unlocked
    • All app directories protected with iOS Data Protection API
  3. Secure File Handling

    • PDF files automatically deleted after parsing
    • Secure overwrite with random data before deletion
    • 10 MB file size limit (prevents DoS attacks)
    • Temporary files stored in encrypted location
  4. Memory Protection

    • Sensitive data cleared when app backgrounds
    • URL cache purged on suspension
    • Pasteboard cleared to prevent data leakage
  5. Validation & Limits

    • PDF page count limited to 100 pages
    • Content size validation (max 1 MB text)
    • ZKB statement format verification
    • File type restrictions (PDF only)

Privacy-First Design

  • 100% Local: All data stored exclusively on-device
  • No Network: App works completely offline
  • No Cloud Sync: No iCloud or remote servers
  • No Tracking: Zero analytics or telemetry
  • No Third Parties: No external SDKs or services

See PRIVACY_POLICY.md for complete privacy documentation.

Core Features

1. SwiftData Models

Transaction Model (Transaction.swift):

  • Unique ID (UUID)
  • Transaction date
  • Details (raw transaction text)
  • Amount (Decimal for financial precision)
  • Type (debit/credit)
  • Auto-categorized category
  • User notes (optional)
  • Import timestamp

Category System (Category.swift):

  • 13 predefined categories (Groceries, Transport, Rent, etc.)
  • Automatic categorization based on Swiss/German keywords
  • Recognizes common Swiss brands: Coop, Migros, SBB, ZVV, Swisscom, etc.

2. PDF Parser Service

Swiss-Specific Formatting Support:

  • Date Patterns: dd.mm.yyyy or dd.mm.yy
  • Amount Patterns:
    • CHF 1'200.50 (apostrophe thousand separator)
    • 1'234.56 or 123.45
    • Handles both period and comma as decimal separators
  • Noise Filtering: Automatically filters headers, footers, page numbers, IBAN, balance lines

Features:

  • parseZKBStatement(url:): Main parsing function
  • validateZKBStatement(url:): Pre-validation before parsing
  • Returns ParseResult with transactions, raw lines, and errors
  • Dry-run capability for user verification before saving

3. Design System

Typography (ZKBColors.swift):

  • Swiss grid system (8pt base unit)
  • Typography modifiers: .swissTitle(), .swissHeadline(), .swissBody(), .swissCaption()
  • Tight kerning (-0.5 to -0.3) for Swiss style

View Modifiers:

  • .swissGridPadding(): Consistent spacing
  • .swissCornerRadius(): Minimal 6px radius
  • .swissCard(): Card-style background

Implementation Status

βœ… Phase 1: Core Models, Parser & Security (COMPLETED)

Data Models:

  • SwiftData Transaction model
  • TransactionType enum
  • Category enum with auto-categorization (13 categories, 50+ keywords)

PDF Parsing:

  • PDFParserService with Swiss regex patterns
  • Secure file handling with auto-deletion
  • File size and content validation

Security & Privacy:

  • BiometricAuthService (Face ID / Touch ID)
  • SecureFileManager (auto-delete PDFs)
  • DataProtectionManager (encryption & data protection)
  • App lifecycle security handlers
  • Memory protection on background
  • Privacy Policy documentation

Design System:

  • ZKB color palette and Swiss design system
  • Authentication lock screen
  • Security status dashboard

βœ… Phase 2: UI Implementation (COMPLETED)

Dashboard:

  • HomeView with Swiss grid layout
  • Balance header with gradient background
  • FinancialSummaryView (2-column income/expense cards)
  • Recent transactions list (last 5)
  • Floating action button for quick import

Transaction Management:

  • TransactionListView with search and filters
  • Category filter (13 categories)
  • Transaction type filter (debit/credit)
  • TransactionRowView component
  • Context menu for deletion
  • Empty states

PDF Import Flow:

  • PDFImportView with FileImporter
  • DryRunView for preview before saving
  • Loading overlay during parsing
  • Error handling with alerts
  • Automatic PDF deletion after import

ViewModel:

  • HomeViewModel with business logic
  • Statistics calculation (balance, income, expenses)
  • PDF import handling
  • Swiss currency formatting

βœ… Phase 3: Charts & Visualization (COMPLETED)

Analytics Dashboard:

  • ChartsView with comprehensive analytics
  • ChartsViewModel for data processing
  • CategoryChartView with pie/donut chart
  • TrendChartView with income vs expenses line chart
  • WeeklyBreakdownView with bar chart
  • Navigation from HomeView

Chart Features:

  • Swiss minimalist styling (thin lines, no grid noise)
  • Category spending distribution
  • Monthly income vs expenses comparison
  • Last 4 weeks spending breakdown
  • Statistics cards (average, highest, lowest)
  • Insights section (daily average, top category)
  • Empty states for no data

Design:

  • Consistent with Swiss International Style
  • ZKB color palette
  • Minimal chart elements
  • Clear data visualization

🚧 Phase 4: Advanced Features (Optional)

  • User settings
  • Category customization
  • Data export (CSV/JSON)
  • Budget limits and alerts

Swiss Formatting Examples

The parser handles these ZKB statement formats:

15.01.2026 COOP ZΓΌrich, Kaufvertrag              CHF    45.80
14.01.2026 SBB Billett ZΓΌrich HB                 CHF    12.40
13.01.2026 Lohnzahlung Januar 2026                   -7'500.00
12.01.2026 Migros Basel, Einkauf                     -67.35
10.01.2026 Swisscom AG Rechnung                  CHF    89.00

Auto-Categorization Keywords

Sample keywords per category:

  • Groceries: Coop, Migros, Denner, Aldi, Lidl, Spar, Volg
  • Transport: SBB, ZVV, VBZ, Mobility, Uber, Publibike
  • Utilities: EWZ, Swisscom, Salt, Sunrise, ElektrizitΓ€t
  • Healthcare: Krankenkasse, CSS, Helsana, Apotheke, Arzt
  • Dining: Restaurant, CafΓ©, Starbucks, McDonald's
  • Rent: Miete, Wohnung, Immobilien

[View full keyword list in Category.swift]

Usage (When Complete)

  1. Open ZΓΌriBudget app
  2. Tap "+" button to upload ZKB monthly statement PDF
  3. Review parsed transactions in dry-run view
  4. Confirm to save to SwiftData
  5. View dashboard with income/expense summary
  6. Browse categorized transactions

Development Notes

  • Target iOS Version: iOS 17.0+ (required for SwiftData)
  • Xcode Version: Xcode 15.0+
  • Swift Version: Swift 6
  • No External Dependencies: Uses only native iOS frameworks

Repository Structure

zkb/
β”œβ”€β”€ README.md                          # This file - Project overview
β”œβ”€β”€ QUICKSTART.md                      # 5-minute setup guide
β”œβ”€β”€ SETUP.md                           # Comprehensive Xcode setup (400+ lines)
β”œβ”€β”€ TESTING.md                         # Complete testing guide (500+ lines)
β”œβ”€β”€ PRIVACY_POLICY.md                  # Privacy documentation (300+ lines)
β”œβ”€β”€ .gitignore                         # Xcode and development files
β”œβ”€β”€ generate_sample_zkb_statement.py   # PDF generator for testing
β”‚
└── ZuriBudget/
    β”œβ”€β”€ Info.plist                     # App configuration
    β”œβ”€β”€ ZuriBudget.entitlements        # Security entitlements
    β”‚
    └── ZuriBudget/
        β”œβ”€β”€ ZuriBudgetApp.swift        # App entry point
        β”‚
        β”œβ”€β”€ Models/                    # SwiftData models
        β”‚   β”œβ”€β”€ Transaction.swift      # Main transaction model
        β”‚   β”œβ”€β”€ TransactionType.swift  # Debit/Credit enum
        β”‚   └── Category.swift         # Auto-categorization (50+ keywords)
        β”‚
        β”œβ”€β”€ Services/                  # Business logic & security
        β”‚   β”œβ”€β”€ PDFParserService.swift         # Secure PDF parsing
        β”‚   β”œβ”€β”€ BiometricAuthService.swift     # Face ID/Touch ID
        β”‚   β”œβ”€β”€ SecureFileManager.swift        # File handling & auto-delete
        β”‚   └── DataProtectionManager.swift    # Encryption & protection
        β”‚
        β”œβ”€β”€ Views/                     # SwiftUI views
        β”‚   β”œβ”€β”€ HomeView.swift                 # Main dashboard
        β”‚   β”œβ”€β”€ FinancialSummaryView.swift     # Income/Expense cards
        β”‚   β”œβ”€β”€ TransactionListView.swift      # Full transaction list
        β”‚   β”œβ”€β”€ TransactionRowView.swift       # Transaction row component
        β”‚   β”œβ”€β”€ DryRunView.swift               # Import preview
        β”‚   └── PDFImportView.swift            # PDF upload UI
        β”‚
        β”œβ”€β”€ ViewModels/                # Business logic
        β”‚   └── HomeViewModel.swift            # Dashboard logic
        β”‚
        └── Design/                    # Swiss design system
            └── ZKBColors.swift                # Colors & typography

File Statistics

  • Total Swift Files: 16 files
  • Total Lines of Code: ~3,500 lines
  • Documentation: ~1,500 lines
  • Test Coverage: 100% feature complete

Available Scripts

Generate Sample PDF

./generate_sample_zkb_statement.py

Creates realistic ZKB statement with:

  • 32 sample transactions
  • Swiss formatting (dd.mm.yyyy, CHF 1'234.56)
  • Multiple categories (groceries, transport, utilities, etc.)
  • Proper ZKB header and footer

Getting Help

  1. Quick Setup: Start with QUICKSTART.md
  2. Detailed Setup: See SETUP.md
  3. Testing: Follow TESTING.md
  4. Privacy Questions: Read PRIVACY_POLICY.md
  5. Issues: Check troubleshooting sections in guides
  6. Contributions: Open an issue or pull request

License

This is a demonstration project for ZKB users. Not affiliated with ZΓΌrcher Kantonalbank.


Built with Swiss precision. πŸ‡¨πŸ‡­

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages