Skip to content
Active
Web Apps
AI/ML
Feb 2026

Finance Owl

A personal finance app — bank sync, budgets, investments — across web and mobile, where the AI features are optional and can run on a local model.

26
API modules
59
Test files
91
Merged PRs
Pre-launch
Status
Finance Owl project visual

The constraint

Finance apps want your bank login and then send your transactions to a model you did not choose. The useful parts — a budget, a categorised ledger, an investment view — do not need either compromise.

The approach

A NestJS API with Drizzle on Postgres, a SvelteKit web app and an Expo mobile app over the same API. Plaid handles bank sync; a rules-based categorizer runs before any model is asked; and the AI layer can point at a local Ollama model or be switched off.

Process
  1. 1
    Rules before models

    Put a deterministic categorizer in front of the AI, so most transactions never reach a model at all.

  2. 2
    Make payments idempotent

    Made the Stripe webhook safe to receive twice, because webhooks are delivered at least once.

  3. 3
    Keep secrets local

    Rendered the TOTP enrolment QR code on the server instead of sending the secret to an image service.

Outcomes

  • Rules-based categorisation first, AI only for what the rules cannot place
  • Passkeys and TOTP, with the 2FA QR code rendered locally rather than by a third party
  • An idempotent Stripe webhook and a real job scheduler
  • One pricing source instead of prices restated across the app
Details

Building a personal finance app with a NestJS API, SvelteKit web and Expo mobile clients, Plaid sync, passkeys, and an optional local-model AI layer.