All projects Work

Fortuna

A finance app that asks how you felt when you spent it.

At a glance

Role
Solo engineer: product, backend, mobile, infra
Timeline
Dec 2025 to now
Status
In active development
Stack
  • React Native
  • TypeScript
  • FastAPI
  • PostgreSQL
  • Supabase
  • Celery
  • Redis
  • Anthropic Claude
  • Plaid
  • APNS
tables in the schema
29
platforms shipped from one codebase
2
emotional states tracked per expense
8
Fortuna home screen showing monthly net, income, spend and impulse percentage Fortuna emotional check-in screen offering eight states such as calm, drained and stressed Fortuna expense detail showing emotional context, reason for purchase and a social pressure trigger

The product in order: the daily surface, the emotional check-in that makes the ledger different, then the coaching and automation built on top of it.

  1. Home
  2. Emotion check-in
  3. Expense reflection
  4. Receipt capture
  5. Aura: budget intelligence
  6. Aura: coaching session
  7. Generated budgets
  8. Bank sync
  9. Ecosystem

Overview

A production personal finance app built on a simple bet: the reason people overspend is emotional, so the ledger should record the feeling alongside the amount.

Every budgeting app I tried could tell me I spent $16.99 at a restaurant. None could tell me I did it because I was hungry and my friends were going anyway. That second fact is the one that predicts whether it happens again next week.

The problem

Budgeting apps stop at categorisation. They produce a tidy record of what already happened and no insight into why, which is exactly the part a person needs in order to change anything. I wanted a system that captured the trigger, not just the transaction.

What I built

  • Emotional ledger: each expense can carry how you felt, why you bought it, and a named trigger (social pressure, stress, boredom), so patterns surface as behaviour rather than as pie charts.
  • Aura, an AI financial coach on Anthropic Claude, running conversational sessions and generating budgets from observed spending, with tool-forced structured outputs and PII stripped before egress.
  • Receipt OCR that extracts line items, prices and merchant from a photo, then asks the user to confirm before anything is written.
  • Plaid bank linking with live transaction sync, plus an ecosystem model for the people, pets and commitments money actually flows to.
  • React Native across iOS and Android with biometric auth, and a FastAPI and PostgreSQL backend with JWT/MFA, row-level security and device-bound sessions across a 29-table schema.
  • Celery and Redis running timezone-aware financial pipelines and APNS delivery per user.

Notes

Things that surprised me, or that I got wrong first.

Asking the question at the right moment

An emotion prompt is worthless an hour later. By then you have already rationalised the purchase. The check-in fires at capture time, in the same flow as logging the expense, which is the only point where the honest answer is still available.

Privacy before the model call

Emotional and financial data is about as sensitive as a dataset gets. A sanitization layer tokenizes identifying fields before anything leaves for the model, so Aura reasons over shapes and amounts rather than identities.

Failure is a product decision

A circuit breaker wraps every model call. When the provider degrades, the app falls back to deterministic summaries instead of hanging on a spinner. A smaller answer beats no answer.

Timezone-aware money

Recurring cashflows evaluate in the user's local timezone, not the server's. Celery schedules per user rather than as one nightly global sweep, which is what makes a 'rent posts tomorrow' notification arrive at the right hour.

Say hi

If you want to talk about Fortuna, or anything on this page, I'd love to hear from you. Email me or use the contact page.