Skip to content
← All projectsNext: Explora AI
Applied ML · Own product — 2026

Finora

An ongoing, self-initiated finance product. The native iOS client is substantially built in Swift 6 with iOS 26 Liquid Glass, a UI-free domain layer and 142 unit tests, and it runs today on mock repositories behind protocol seams. The platform it will connect to is designed: FastAPI, PostgreSQL with pgvector, XGBoost classification, Prophet forecasting and an assistant that answers only from the user's own numbers.

In developmentiOS app built on mock data; backend designed, not yet connected
Role
Founder, architect and engineer
Team
Solo
Timeline
Started early 2026, ongoing
Stack
Swift 6 · SwiftUI · FastAPI · pgvector · XGBoost · Prophet · GCP
Finora
01 ProblemBudget apps assume cents, open banking and diligent logging. Sri Lankan spending is cash, paper receipts and whole rupees.
02 ApproachA clean-architecture iOS client with exact decimal money, designed to plug into a hybrid ML platform with a confirm-and-correct loop.
03 TechnologySwift 6, SwiftUI, Liquid Glass, VisionKit, FastAPI, pgvector, XGBoost, Prophet, Isolation Forest, GCP.
04 OutcomeA working iOS app with 142 passing tests on mock data; the backend is architected but not yet connected.

01 — Problem

People lose control of money mostly because they can't see it: receipts are on paper, cash spending leaves no trail, local banks have no open APIs, and international apps assume cents. Technically the hard parts were exact money arithmetic, a serif font that jitters during number animations, floating glass controls that stopped taking taps, forecasting from very short histories, and an assistant that must never invent a number.

02 — Approach

01Business rules with no UI importsThe domain layer imports only Foundation: immutable entities, stateless use cases and 14 async repository protocols. View models get use cases injected, so rules are deterministic to test and the backend can replace the mock actors without touching a view.
02Money that always adds upMoney wraps Foundation.Decimal, so 0.1 + 0.2 is 0.3. Splits reconcile their remainders, spend-ribbon rounding drift is pushed onto the peak day so bars match the total, and a forced grouping separator keeps 'Rs 72,300' from rendering as '72300'.
03Fix the font, not the animationInstrument Serif has proportional digits that swing up to 16 pt at 76 pt size. TabularNumber measures the widest digit and gives each digit a fixed cell, so the hero count-up no longer shudders sideways.
04Cheap ML in the background, the LLM on demandIn the platform design, XGBoost categorises and Isolation Forest flags anomalies on every insert, Prophet forecasts per user and category with a staged cold start, and a RAG assistant answers only from retrieved context and live tool results.

03 — Architecture

How the system fits together, in two views.

iOS client: dependencies point inward
SwiftUI viewsView modelsUse casesEntities14 protocolsMock actorsAPIClientVisionKit scan
Views and view models depend on protocols; the data layer implements them. Today mock actors fill that layer; the APIClient and Keychain store are ready for the real backend.
Designed ingestion loopPlatform design
Receipt or PDFuser-scoped storageOCRVision · pdfplumberStructureOpenAI functionsClassifyXGBoostAnomaly checkIsolation ForestUser confirmslow-confidence flagsPostgres+ pgvector
Nothing enters history without the user confirming it, and every correction becomes a training label. Forecast models retrain after five new transactions or weekly. This is the designed platform, not yet evidenced as built.

04 — Decisions

  1. D1Prophet for forecastingOver: ARIMA, LSTMTwo or three months of history is about 100 transactions. Prophet handles weekly and monthly seasonality, custom events like salary day, and gives uncertainty intervals; ARIMA assumes stationarity and an LSTM would overfit.
  2. D2XGBoost for categoriesOver: BERT, neural netsSmall tabular data with short text: XGBoost is accurate, interpretable and fast enough to run on every insert.
  3. D3pgvector for the assistantOver: Pinecone, WeaviateOne less service, and embeddings can be written in the same transaction as the data they describe.
  4. D4A staged cold startA forecast from two weeks of data would be confidently wrong. Forecasts stay off in month one and ship with wide, flagged intervals in month two.
  5. D5Keyless deploymentGitHub Actions deploys through Workload Identity Federation, so there is no long-lived cloud key to leak.

05 — Technology

iOS
Swift 6 strict concurrency, SwiftUI, iOS 26 Liquid Glass, VisionKit, AVFoundation, Keychain
Testing
Swift Testing (142 unit tests), XCUITest launch smoke tests
ML
XGBoost, Prophet, Isolation Forest
LLM + RAG
LangChain, OpenAI GPT-4o-mini and text-embedding-3-small, pgvector
Backend (designed)
FastAPI with clean architecture, PostgreSQL 16, Redis, Cloud Storage
Infrastructure
Cloud Run, private Cloud SQL, Secret Manager, GitHub Actions with Workload Identity Federation

06 — Outcome

Own product · 2026
unit tests in the iOS client
repository protocols between domain and data
screens designed across 13 feature modules
third-party binary dependencies in the iOS app

07 — Status

Built
  • Native iOS client: 7 implemented screen groups
  • 142 Swift Testing unit tests
  • Camera receipt capture with per-field confidence flags
  • Budget, safe-daily-spend and affordability maths
  • Three Python ML modules: classifier, analytics, forecasting
  • GCP bootstrap and verification scripts
Designed, not yet connected
  • FastAPI backend and Next.js web app
  • Server-side OCR and ingestion pipeline
  • RAG assistant (the iOS assistant runs a heuristic mock today)
  • Goals, onboarding, account and paywall screens (scaffolded)

08 — My role

A solo, self-initiated build. Claude, Claude Design and Claude Code were used as tools for planning, design and implementation.

  • Product concept, scope and user stories
  • Platform architecture and ML model choices
  • Mobile and web design system
  • iOS clean architecture, domain layer and 142 tests
  • Router, composition root and Liquid Glass components
  • VisionKit scanner and Keychain layer
  • GCP infrastructure scripts
Next project · 06Explora AIA research assistant that finds candidate sources, ranks them for relevance, and grounds Gemini's research output in what it retrieved.