← AI / Contable AI Pro

Personal finance — LLM product / 2026

Contable AI Pro

From 4,500 rows of raw transactions to an organized dashboard in milliseconds: AI that understands context, not rule-based sorting.

Partner / year
Personal project — 2026
Product
Personal finance — LLM product
Role
Designer & developer
Product gallery

01

The problem

Personal finance tools ask you to do the work.

You categorize, you label, you reconcile. For anyone with years of banking history and hundreds of monthly transactions, that friction is enough to make the whole thing pointless. I wanted to build something where the user does nothing except drag a file.


02

What I built

A web app that turns raw CSV bank exports into a structured financial dashboard in seconds.

The core engine is Claude 3.5 Sonnet, which handles semantic categorization by learning from the user's own consumption patterns. Not rule-based sorting: actual reasoning about what a transaction means in context.

The technical decisions I'm most proud of: Anthropic's prompt caching to cut token use by ~90% by reusing historical context, and Zod for strict schema validation. An AI that returns malformed data in a financial context is not just wrong; it is a liability.


03

Stack

Next.js, Claude 3.5 Sonnet, Vercel Blob, and private access.

Frontend and API on Next.js. Claude for financial reasoning. Vercel Blob for CSV handling. Private authentication and full search-engine exclusion for privacy.


04

Evolution

From a web that reasoned from scratch every month to a system that learns from my corrections.

I built the first version in Cursor: a Next.js app that sent each statement to the Claude API in batches of 30 rows and returned a classification ready to paste into my spreadsheet. It worked. Using it month after month surfaced problems no prompt tweak could fix:

  • Each batch was classified without seeing the others, so the same merchant could land in two categories inside a single month.
  • Historical context depended on me uploading a master CSV by hand. If it was missing, context switched off without warning.
  • Lists I edited in Settings never reached the classification engine.
  • Amounts came out with a decimal point, and the spreadsheet, set to Spanish, did not read them as numbers.
  • All the intelligence lived in the prompt. I fixed an error by hand and the next month it was back.

I fixed the code bugs. The underlying problem was design: I had built a black box that paid to reason from scratch every month, instead of a system that kept what it learned.

Less infrastructure, more memory

The current version is a Claude project with read-only access to my real spreadsheet. It reads the vocabularies and the history since 2021 live, looks up a precedent for each merchant before classifying it, and returns rows ready to paste. I paste; the system never writes to the sheet.

What changes is where the knowledge lives. Each real error becomes a written rule. A clothing shop was classified as a restaurant because its name sounded like a bar, and that produced the rule to look up a precedent before guessing. Amounts copied with the bank's sign left unflipped produced another. There are fifteen rules now, each born from a real case and checked with me. What the system does not know, it leaves blank with a note: I fill it in on the sheet and, the next month, it already counts as a precedent.

The mechanical part (transfers between my own accounts, reversals, duplicates, the bank entity) is handled by an HTML tool that runs locally, offline, and sends nothing to a server. Only the ambiguous cases reach the conversation.

No backend, no pay-per-use API, and nothing to deploy. And before it hands anything over, each conversion balances to the cent against the statement total.

In a product with AI, the advantage usually sits in where you store what it learns.

Backend

0 lines

The first version needed around 1,150 lines for the analysis endpoint alone, plus cloud storage and a pay-per-use API. The current one has no server to maintain or deploy.

Learned rules

15

Every rule comes from a real error caught while using the system month after month. What it learns is written down and doesn't repeat, instead of relying on the prompt getting it right every time.

Coverage

1:1

Every transaction in the statement produces a row or is listed as excluded, with its reason. Nothing is dropped silently, and every conversion matches the statement total to the cent before delivery.

What does your product need now?

A hard decision, a team, or a product that has to move. Let’s start there.

Contact: chema.a.job@gmail.com