LiveExpense tracking that starts with a message.
Conversational personal finance through WhatsApp: record an expense in a message, and let deterministic software keep the records, totals and reminders.
- Role
- Creator · product & engineering
- Domains
- Personal finance · Conversational products · AI
Lunch 38
Recorded: Lunch, 38.00, under Food.
How much on food this week?
This week so far:
- Food
- 284.00
- Transport
- 120.00
Illustrative conversation · sample amounts
The problem
Expense tracking tends to fail for a boring reason: it’s one more app, one more form, one more thing to remember at the moment you’re paying for coffee. The information exists. It just rarely makes it anywhere useful.
Lukre starts from a smaller bet. If recording an expense feels like sending a message, maybe it actually gets recorded. It works with what people tell it: it doesn’t connect to a bank, doesn’t move money, and doesn’t give tax or investment advice.
The experience
You talk to Lukre on WhatsApp. Type an amount, describe it in a voice note, or send a photo of a receipt, and it becomes a categorized record. Later you ask in the same chat: how much went to food this month, what went up, how the budget is doing. A household can share one history, with each member writing from their own number.
A web dashboard complements the chat. It’s where the records become charts and history, and where a few reviews happen more comfortably than in a chat: confirming a receipt that needs a look, answering a pending question, adjusting a budget limit.
The architecture in a few lines

Lukre is two systems with a contract between them. A conversation layer, built on the open-source Hermes agent, holds the WhatsApp session, reads each message and decides which operation is being asked for. A finance service in Python is the only source of truth for money, and exposes a curated set of operations to the agent as Model Context Protocol (MCP) tools.
The agent proposes; the service checks who is asking, reads the numbers with deterministic code, applies the rules and writes the record. The confirmation sentence you get back is built from the stored values.
Decisions that shape it
Numbers stay in code
For typed expenses, the model passes the message along; a domain parser reads amount, date and category. Money is Decimal end to end.
The household is never an argument
It comes from the agent’s credential and is enforced again by row-level security in PostgreSQL. The model can’t choose a different household.
Each message is applied once
A message id is claimed in the same transaction as the record, so a redelivered message doesn’t record the expense twice.
Technology, by responsibility
Conversation
Hermes, an open-source agent runtime, with WhatsApp through Baileys. My part is a Python plugin that gates each message and pins the sender.
Model Context Protocol (MCP)
The structured tool boundary between the agent and the finance service: typed inputs, JSON results, and no authority of its own.
Application and domain
Python 3.12 and FastAPI, with Pydantic at the edges and a domain package free of web or database code.
Records
PostgreSQL through SQLAlchemy and Alembic, with every tenant table scoped by household.
Receipts and voice
A multimodal model reads receipts into a candidate that must pass confidence and arithmetic checks. Voice notes arrive as transcripts.
Dashboard
Server-rendered pages with htmx and charts, reading from the same service.

