Live in production · beeingbaniya.com

Every bank SMS,
turned into a clean ledger.

BeeingBaniya is a live personal-finance product for Indian bank customers. Your phone forwards each transaction SMS, an LLM turns it into a categorized, searchable transaction, and budgeting + trends do the rest — with zero manual entry.

Frugal today. Fortune tomorrow.

Auto-categorizedno manual typing
iOS app in TestFlightSwiftUI companion
Built with Next.js 16 · App Router React 19 Vercel Supabase (Postgres) Auth.js v5 Claude (Anthropic SDK) Google GenAI Tailwind + shadcn/ui

The problem

A real-time feed of your spending — trapped in your inbox.

Indian banks still text an alert for nearly every debit and credit. That is a live stream of exactly where your money goes — but it sits as unstructured text in the Messages app, and logging expenses by hand is tedious enough that most people give up.

  • Every bank formats SMS differently. ICICI, HDFC, SBI, Axis and wallets each phrase debits, mandates and OTPs their own way — brittle to parse.
  • Manual expense apps don't get used. The friction of typing each purchase means the ledger goes stale within a week.
  • No accountability line. Without an automatic ledger, it's hard to hold discretionary spend against what you actually want to save.
Incoming bank SMS
Rs.480.00 debited from a/c XX4321 on 06-Jul at SWIGGY BENGALURU. Avl bal Rs.—. Not you? Call 1800-XXX.
Sample message · illustrative only
Amount₹480.00
MerchantSwiggy
Date06 Jul
TypeSpend
CategoryFood & Dining

What it does

A finance app that keeps itself up to date.

Ingestion is automatic; everything downstream — categorization, budgets, trends and a weekly recap — builds on that clean, structured stream.

Ingestion

Automatic SMS capture

An iPhone Shortcuts automation (or a macOS Messages daemon) forwards each incoming bank SMS to a secure webhook. No typing, no imports.

Intelligence

AI extraction & classification

An LLM reads each message, decides its type (spend, credit, OTP, EMI, investment, invalid…) and pulls out amount, merchant, date and category.

Dashboard

Draggable widgets

Month-to-date spend versus the prior period, spend-by-category charts with clickable slices, and a merged manual + SMS transaction table.

Trends

Trends & regression

Monthly-spend line chart with an OLS trendline, per-category multi-line comparison, and credit-card-payment / investment trends over a configurable window.

Budgeting

Running-balance budgets

A monthly overall budget with per-category allocations and a cumulative "spend-left" line — overspend carries forward as negative balance, not a bar that just fills up.

Self-improving

Learns from corrections

Recategorize a transaction once and the app writes a keyword rule keyed on that merchant — the same SMS shape skips the LLM next time. Accuracy compounds; cost drops.

Recap

Weekly AI summary

A short LLM-written recap of the week — biggest areas, spikes and outliers — delivered on the dashboard and by email.

Try before signup

Public sandbox

One click opens a demo account seeded with a year of synthetic Indian finance data — explore the full product with no account and nothing real exposed.

Native

iOS companion (TestFlight)

A SwiftUI / Liquid Glass app whose SMS-filter extension can auto-capture bank texts on-device, with explicit consent — currently in TestFlight.

How it works — engineering blueprint

From a raw text message to a categorized transaction, in one request.

Both ingestion sources hit a single webhook. The synchronous path stays fast and idempotent; the expensive AI work runs after the response, in the same serverless invocation — no external queue.

1 The SMS → transaction pipeline

  1. Authenticate the request's bearer against the user's webhook_token.
  2. Rate-limit (100 SMS per user per 6-hour window) and sanitize the text.
  3. Deduplicate — skip if this exact message already exists for the user.
  4. Store a raw_messages row with sms_type = null (the "processing" state) and return 200.
  5. After the response, run the user's keyword rules first — a match can short-circuit the LLM entirely.
  6. Classify + extract with the LLM, decide the final type, then insert a sms_transactions row for debits.
  7. Credits run refund matching against a same-amount debit in the last 30 days.

2 How the AI is used

A provider-pluggable LLM layer with a per-feature config that's overridable by environment variable — the model can change with no code edit. It runs on Anthropic's Claude today, and can switch to Google GenAI, OpenAI or DeepSeek by config.

TaskModelWhy
Classify every SMSClaude HaikuHigh-volume hot path — cost-optimized, fast.
Fallback & messy-merchant extractClaude SonnetRare, quality-critical — "prefer null over a guess."
Weekly summaryClaude SonnetLonger reasoning for a readable recap.

Anthropic calls go through @anthropic-ai/sdk; the Gemini provider uses @google/genai.

3 The data model

raw_messages

  • messagetext
  • sms_typeenum·null
  • extracted_amountnumeric
  • received_attimestamptz

sms_transactions

  • amountnumeric
  • merchanttext
  • typedebit·refunded
  • category_sourceai·rule

mapping_rules

  • keywordscsv
  • category_idfk
  • priorityint
  • rule_sourceauto·manual

user_categories

  • nametext
  • colorhex
  • budget_percentnumeric
  • description→ LLM

Postgres on Supabase, accessed via a service-role client with user_id scoping enforced in code. Category descriptions and user-defined transaction types feed back into the classifier prompt.

4 Auth & access

  • Auth.js v5 (NextAuth) with JWT sessions — no session table. Three providers: Google OAuth, email + password, and email one-time code (delivered via Resend).
  • Edge middleware guards the app routes, bounces logged-in users off the auth page, and excludes webhooks, cron and callbacks so machine traffic works without a session.
  • Webhook auth is separate — a per-user bearer token, matched against the profile, not the login session. The same token names the user's realtime channel.
Deployment & ops: Vercel (push to main → production; every branch gets a preview). Two Vercel cron jobs fan out the weekly AI summary, weekly email, daily reminder and a nightly sandbox reset. Transactional email runs on Resend.

Ingestion, from the phone

One Shortcut, four triggers.

iOS runs a personal automation whenever a message contains a money keyword — Amt, debited, INR or Rs. — and hands it to a single "Process Transaction SMS" shortcut that POSTs the text to the webhook.

Shortcut · Forward SMS to BeeingBaniya
Match (?i)(Rs|INR|amt).*\d+ in Shortcut Input
If Text has any value
POST https://www.beeingbaniya.com/api/webhooks/sms
Header · Authorization: Bearer ••••••••••••
Body (JSON) · { text: Shortcut Input }
iOS Shortcuts automation list showing four personal automations, each triggered when a message contains a money keyword — Amt, debited, INR, or Rs. — running Process Transaction SMS
beeingbaniya.com/dashboardSample data
This month
₹42,180
vs last month
+8%
Top category
Food
Food & Dining · ₹12.4k Groceries · ₹9.1k Transport · ₹6.3k Utilities · ₹4.4k
S
Swiggy
Food & Dining · AI
−₹480
B
BigBasket
Groceries · rule
−₹1,240
U
Uber
Transport · AI
−₹214
J
Jio Recharge
Utilities · rule
−₹299

The product, live

Structured spend you can actually read.

Every automated decision is auditable — each transaction is tagged with whether a rule or the AI categorized it, so you always know why something landed where it did. The dashboard, trends and budgets all read from the same clean stream.

Design bias: missing a real spend is worse than an occasional false one. The classifier is tuned to never silently drop a genuine transaction — false positives are cheap to fix; false negatives quietly corrode trust.

Explore the live app

How it was built

Shipped solo — designed, coded and operated with an agentic workflow.

One builder, a tight loop, and production feedback. Every change starts as a tracked issue, gets designed, implemented on a branch by coding agents, QA'd on a Vercel preview, then merged to auto-deploy.

Design
Claude Design
Build
Claude Code
Track
Linear issues
Review
GitHub PR
Ship
Vercel deploy
Parallelism

Split across sub-agents

Multi-area features are decomposed and dispatched to parallel coding agents against a shared spec, so independent slices land without stepping on each other.

Contract-first

One sacrosanct API contract

Web and iOS integrate only through a versioned API contract — two independent agents can build both clients without coordinating, as long as the contract holds.

Owned tradeoffs

Pragmatic, on purpose

No background queue (after() on the same invocation), type errors guarded by a test suite rather than blocking builds — decisions made in writing, not by accident.

Product & customer thinking

Opinions the product is willing to hold.

The interesting decisions aren't in the framework choices — they're in what the product chooses to optimize for its user.

Never miss a real spend

Trust dies quietly when a genuine transaction vanishes. The system leans toward capturing, and makes over-captures cheap to fix and easy to de-duplicate.

It gets better with use

Every manual correction becomes a rule. Over time more traffic bypasses the LLM — accuracy compounds while per-message cost falls.

Provenance you can audit

Every categorization records whether a rule, the AI, or you set it. "Why did this land here?" always has an answer.

Cost tiered by volume

A fast, cheap model on the every-message path; a stronger model reserved for the rare, quality-critical work. Economics decided per call site.

Remove signup friction

A one-click sandbox with a year of synthetic data lets anyone feel the full product before committing an account.

Budgets as accountability

Not a bar that fills up. A cumulative running balance where overspend carries forward — the number tells you the truth about the month.

It's live. Go try it.

Open the sandbox with one click — a full year of synthetic data, no signup — or sign in and connect your own SMS feed.