27/32proof of conceptPersonal Finance Automation
AI Expense Dashboard
Bank SMS messages parsed and classified into a ledger of monthly spend, income and net position.
What it solves
Spending is scattered across bank text messages and statements. This turns each SMS into a categorised ledger entry and matches it against the statement import.
How it runs
Seven steps, input to output
Goes inThe bank’s SMS, forwarded from the phone
- 01
Forward
The phone forwards each bank SMS to a webhook.
- 02
Authenticate
The edge function accepts only requests that carry the shared secret header.
- 03
Parse
Each message format has its own pattern. A message that matches none is stored raw, never dropped.
- 04
Store
The raw text and parsed fields are saved, with a fingerprint that rejects a re-sent SMS.
- 05
Classify
The merchant map answers first. On a miss, Claude Haiku picks a category and the answer is cached.
- 06
Ledger
The transaction joins the ledger with a fingerprint that matches the statement import.
- 07
Roll up
Statement and SMS transactions roll into monthly spend, income and net position by pay cycle.
Comes outA ledger of monthly spend, income and net position by pay cycle
What it does
Bank SMS parsed, fingerprinted and classified into the ledger, with an LLM fallback and cache, then statement and SMS transactions rolled into monthly spend, income and net position by pay cycle.
Three decisions
What shaped the build
The raw SMS is the source of truth
Every later step can fail on its own without losing the message, and a missing transaction can be backfilled later.
Two fingerprints, two jobs
One rejects an identical re-sent SMS. The other matches the statement import, so an SMS row and a statement row for the same charge dedupe together.
The classifier never blocks a transaction
The LLM runs only when the merchant map has no answer. Any failure falls back to uncategorised, and each answer is cached for the next time.
Built with
8 parts
- Supabase Postgres
- transaction ledger
- Edge Function
- Deno sms-hook
- Claude Haiku
- merchant classifier
- merchant_map
- classifier cache
- md5 fingerprint
- duplicate guard
- Telegram bot
- read-only queries
- supabase-js
- dashboard queries
- Vercel
- dashboard host