Skip to content
Back to projects

Personal iOS project

Finely

Finely is my current personal iOS project and a focused place to build product-level systems outside a company codebase. It turns income, expenses, and recurring subscriptions into searchable activity, period analysis, reusable statistics, and a grounded assistant whose financial answers come from deterministic app data.

UIKit SwiftData StoreKit 2 Foundation Models iOS 26+ English and French

Product

A healthier way to understand personal money flow

Finely organizes the decisions people make every month: what came in, what went out, which recurring charges remain, and how the current period compares with completed months. Search, analysis, and statistics make that money flow visible without turning the app into a dense dashboard.

The interface presents snapshots produced by practical product rules: signed transaction amounts, recurring subscriptions, budget-month boundaries, account totals, Pro entitlements, privacy settings, and localized copy.

What the app covers

  • Income, expense, and recurring subscription tracking
  • Current and completed month analysis
  • Searchable activity with account and category context
  • Period statistics, trends, and contextual insights
  • Grounded assistant answers from deterministic finance facts

Screens

How the product surfaces the system

Each main screen is built around a specific job in the finance workflow. The screenshots below are paired with the technical detail that matters for that screen, without turning the project page into implementation notes.

Finely Home showing the current month balance, spending categories, totals, and a financial insight.

Home

The current month, summarized without hiding the underlying categories.

Home reads from the current budget-month engine. Income, expense, and subscription totals share a snapshot with category ranking and a deterministic insight, so the UIKit layer presents app-owned facts instead of recalculating finance rules.

Finely Month Review comparing a completed month with its baseline and notable financial events.

Month Review

A historical month explained through comparisons and notable events.

Month Review resolves a complete historical period before choosing a comparison baseline. Its snapshot identifies a notable transaction, calculates the savings rate, and counts days without spending, keeping every explanation tied to the same closed month.

Finely Activity showing a searchable July transaction timeline with account and category context.

Activity

A searchable, filterable timeline that preserves transaction context.

Activity uses a diffable dated timeline with a type filter and text search. Each result retains account and category context, while recurrence materialization replaces projected subscription rows with real transactions without rebuilding the entire screen.

Finely Analysis offering grounded natural-language questions about personal financial data.

Finely Analysis

Natural-language questions routed to deterministic financial facts.

Finely Analysis gives SystemLanguageModel a bounded prompt and classified recap for typed intent classification only. Validated app-owned resolvers calculate the requested facts, then deterministic localized renderers compose response text and cards. Unsupported or ambiguous requests use a guided fallback.

Finely Statistics showing a yearly savings trend, summary metrics, and contextual insight.

Statistics

Reusable period snapshots behind trends, insights, and summary metrics.

Statistics centralizes period slicing and incomplete-month handling before calculating the savings trend and a contextual insight. Immutable snapshot rendering keeps charts, summary metrics, and period changes consistent across the screen.

Engineering

The interesting work is in the domain rules

Finely combines product-level iOS systems that share one source of truth: persistence, monetization, recurrence, search, period analysis, privacy, localization, and an assistant layer that stays numerically correct.

UIKit-first architecture

Programmatic UIKit, Coordinator navigation, SwiftData persistence, and feature-level composition keep presentation separate from finance services and storage rules.

Notification scheduling

A centralized notification scheduler rebuilds pending requests from subscriptions, reminder preferences, authorization, and entitlement state, keeping scheduling policy out of forms and screens.

Recurring finance logic

Subscriptions materialize charges idempotently, preserve billed amounts, and handle calendar boundaries without turning projected dues into historical facts early.

Searchable activity

A diffable dated timeline combines type filters and text search while retaining the account, category, and recurrence context behind each transaction.

Immutable statistics

Period slicing, incomplete-month rules, trend calculations, and insights resolve into snapshots that UIKit can render consistently without owning finance calculations.

Foundation Models with app-owned facts

SystemLanguageModel performs typed intent classification from a bounded prompt and classified recap. Validated app-owned resolvers calculate financial facts, and deterministic localized renderers compose response text and cards.

Free vs Pro

Monetization as product architecture

The free plan keeps the core tracker usable while limiting the number of user-created transactions. Pro removes that cap and unlocks analysis, statistics, export, iCloud sync, reminders, and the grounded assistant.

A single entitlement layer lets screens ask clear questions: can this user add another transaction, should this Pro row be locked, and should this background service run? The answers remain consistent across presentation and services.

Assistant

A finance assistant that starts with facts

A bounded prompt and classified recap give Foundation Models one job: typed intent classification. Validated app-owned resolvers calculate income, expenses, subscriptions, categories, trends, and budget facts.

Deterministic localized renderers compose response text and cards from those facts. Unsupported and ambiguous requests return a guided fallback instead of an invented answer.

Read the Foundation Models engineering case study