Inspiration

Ask most people "how are you doing with money this month?" and they can't tell you. They aren't careless. Budgeting apps are just one more thing to open, and when you do open one you get charts and tables instead of an answer. Most of them also look backwards: they show what you already spent, not that your car payment is due next week and your balance won't cover it.

We wanted a money tool for everyday people who aren't confident with money. It should live where they already spend their day, in their texts, and give one plain answer they can trust.

What it does

Reeflect lives in your texts, and its calendar shows what's coming.

Over iMessage, you just text it:

"How am I doing?" It replies with your balance and how much you can spend per day until payday. That's the same number the website shows. "12 lunch" logs the spending. Code reads the amount, The agent finds the category, and the reply tells you what's left in that budget. "How much did I spend on food?" or "What's left in my groceries budget?" It answers with exact figures from your own data. Receipt photos become a proposed transaction, which is saved only after you say yes. Subscription alerts and bill reminders arrive on their own. When Reeflect spots a new subscription, or a bill is due in 7 days, it texts you without amounts on the lock screen. Reply DETAILS to see the numbers, and KEEP or CANCEL to mark a subscription. Quiet hours. Set them on the website, or just text "Reeflect, register new quiet hours 11PM to 7AM". On the web, your month is a cash-flow calendar. Paydays, bills, subscriptions and spending sit on the days they happen. A balance line runs across the month. A headline says what you can safely spend per day, with the sum behind it. You can also:

import Capital One CSV and PDF statements sync from Capital One's Nessie API set monthly budgets confirm recurring payments that Reeflect detects track bills plan future spending and see how it changes your runway Reeflect never moves money, never gives investment advice, and never lets the AI make up a number.

How we built it

Web app: Next.js (App Router) and TypeScript, Postgres on Neon with Drizzle ORM, Better Auth, and plain CSS Modules. It's deployed on Vercel. iMessage agent (Photon Spectrum): a small worker on Render keeps a Spectrum connection to iMessage open and passes each text to our Next.js app. The worker has no business logic and never touches the database. All the reasoning lives in the app, with the same auth and tests as the website. A phone only gets financial data after it's linked with a one-time code and approved on the website. Gemini API: Gemini decides what the user is asking, picks the category for a logged expense, writes the reply sentences and reads receipt photos. It never produces a number. Code works out every figure first and gives Gemini only placeholder labels like {cash_total}. Gemini writes around them, and code fills the real values in. A digit scan blocks any number the model makes up. Each text uses a chain of models with fallbacks, so the agent keeps answering when a model's daily limit runs out. Simple commands like STOP, DETAILS and UNDO never call the model at all. Capital One Nessie: Nessie is our live demo data source. We seed a synthetic year of history into Nessie customers. Sync then maps purchases, deposits, withdrawals, transfers and bills into the app, and they show up on the calendar. Bills from Nessie drive the due-date reminders. Statement parsing: CSV and text-based PDF statements are parsed by deterministic code with a Capital One template, not AI. Each import goes through an identity check, duplicate detection and balance reconciliation before anything is saved. Trustworthy money math: every amount is stored and calculated as integer cents through one shared money library. There's no floating-point money anywhere. Process: three of us worked together, each with a coding agent. We recorded design decisions as numbered ADRs and wrote a handoff note at the end of every session. Every change shipped with Vitest and Playwright tests behind CI. We wrote about 140 unit test files over the weekend.

Challenges we ran into

Nessie doesn't match its docs. When we probed the live API, we found that it starts empty, drops the cents on purchases and deposits, never updates balances, and breaks an account's purchase list if a purchase is created without a status. So we generate our own synthetic histories, send whole dollars, always send a status, and compute balances ourselves. Silent iMessage failures. After one deploy, texts reached the agent but no replies came back. We traced it to Photon refusing the typing indicator, which made the reply path give up before it even tried to send. We now send the reply no matter what, and the worker restarts itself if its message stream dies quietly. Keeping AI away from the numbers. A model writing a finance reply naturally wants to quote figures. We had to design a placeholder-and-scan pipeline so the text and the dashboard can never disagree. Gemini rate limits. The strongest models allow only about 20 requests a day on our key, so we built a model fallback chain and kept simple commands away from the model.

Accomplishments that we're proud of

A real iMessage agent you can text from your own phone, which answers with numbers that match the website exactly, because both come from the same calculation. Alerts that are private by design: no amounts on the lock screen, reply DETAILS to see them. Statement import that reconciles against the statement's own balances instead of trusting a parser blindly. A codebase we'd keep building on: it's split by workspace, the money is all in integer cents, it has decision records, and it's tested end to end.

What we learned

Putting a product where people already are, in their messages, changes what "user-friendly" means. A one-sentence answer beats a dashboard. The safest way to use an LLM with financial data is to let it handle language and intent, and keep every number in code. Sandbox APIs need to be probed, not just read about. Writing down what we actually observed saved us hours later. Writing decisions down (ADRs and handoffs) let three people and their coding agents work in parallel without breaking each other's work.

What's next for Reeflect

More channels: WhatsApp and Telegram through Spectrum, with no change to the agent. Real bank linking through Plaid, alongside statement uploads. Households: shared calendars and a family group chat where Reeflect answers about shared bills. A weekly recap text with a picture of the week ahead, and a month-end forecast on the balance line. Statement templates for more banks beyond Capital One.

Built With

Share this project:

Updates

Submission history