Free expense splitting app. Split costs with friends, simplify debts, settle up β no paywalls, no limits.
Live: frenmo.onrender.com
- 5 Split Types β Equal, exact amounts, percentage, shares (e.g., 3 shares for you + parents), and full (one person owes all)
- Multi-currency β USD, INR, EUR, GBP, AED, JPY, CAD, AUD. Each group has its own currency. Expenses in any currency auto-convert to group currency with
*(approximate). - Currency Converter β Live exchange rates (cached 12h) with converter widget in every group sidebar.
- Bank Statement Import β Upload PDF bank statement, auto-detect bank and extract transactions. Supports 10 banks: Chase, Amex, Bank of America, Capital One, Citi, Wells Fargo, Apple Card, US Bank, Discover, HDFC/SBI. Auto-categorizes expenses (food, transport, shopping, etc.). Dedup prevents double-imports. PDF never stored β processed in memory and wiped immediately.
- Groups β Create groups (trip, home, couple) with their own currency, invite via shareable link. Editable name and currency.
- Per-Member Expense View β Collapsible sections grouped by who paid, each with unique color. Shows expense count and total per person.
- Friends β Search by email, send/accept/reject requests, add friends to groups directly
- Debt Simplification β Greedy algorithm minimizes transactions needed to settle up
- Spending Charts β Category pie chart, monthly bar chart, per-member spending with progress bars
- Comments β Threaded comments on each expense
- Edit Expenses β Update description, amount, date, split type, category after creation
- Bulk Delete β Checkbox multi-select to delete multiple expenses at once
- Date Picker β Set expense date for past-date expenses (trips, receipts, etc.)
- Password Reset β Email-based via Resend API. Signed token, 30-minute expiry. Doesn't reveal whether email exists (security).
- Account Settings β Edit nickname, email, default currency, change password, delete account
- Dashboard β Hero balance card (green when owed, orange when owing, blue when settled), quick actions, per-group balances with emoji icons
- Sidebar Layout β Members panel with balances on left, converter widget, content on right (responsive β stacks on mobile)
| Bank | Date Format | Status |
|---|---|---|
| Chase (CC & Checking) | MM/DD | β Tested |
| American Express | MM/DD/YY | β Tested |
| Bank of America (CC & Checking) | MM/DD + Post Date | β Tested |
| Capital One | Mon DD (named months) | β Tested |
| Citi | MM/DD | β Tested |
| Wells Fargo | MM/DD | β Tested |
| Apple Card | MM/DD/YYYY | β Tested |
| US Bank | MM/DD | β Tested |
| Discover | MM/DD | β Tested |
| HDFC / SBI | MM/DD | β Generic |
Adding a new bank requires only a regex pattern + detection keywords β no structural changes.
- Backend: Python 3.11+, FastAPI, SQLAlchemy 2.0 (async)
- Frontend: Jinja2 + HTMX + Tailwind CSS + DaisyUI + Chart.js
- Database: SQLite (dev) / PostgreSQL (prod, Neon)
- Auth: Session-based (bcrypt + HTTP-only cookies + signed reset tokens)
- Email: Resend API
- Exchange Rates: open.er-api.com
- PDF Parsing: pdfplumber (server-side, memory-only)
- Hosting: Render + Neon PostgreSQL (both free tier)
- Theme: Apple-inspired light with color-faded cards, per-member colors, USA flag gradient logo
app/
models/ user, group, expense, friendship, comment
routes/ auth, password_reset, account, dashboard, expense,
friend, group, comment, settlement, statement
services/
expense.py 5 split type calculators
balance.py Derived balance computation
friendship.py Friend request logic
charts.py Chart data aggregation
comments.py Comment CRUD
currency.py Exchange rate fetching + caching + conversion
password_reset.py Token generation/validation
email.py Resend API integration
statement/
parser.py Bank detection + 10 bank-specific transaction parsers
extractor.py PDF text extraction (pdfplumber, memory-only)
templates/ Jinja2 (base, auth, dashboard, group, expense, friends, account, statement)
static/style.css Apple-inspired CSS theme
tests/unit/ 99 unit tests
- Minimal data: Only nickname + email. No real name, phone, or address.
- Passwords: Bcrypt hashed
- Sessions: HTTP-only signed cookies
- In transit: HTTPS enforced
- At rest: Neon PostgreSQL encrypts at rest
- Data usage: Expense splitting and charts only. No analytics, no tracking, no third-party sharing.
- Password reset: Doesn't reveal whether email exists (prevents enumeration)
- Account deletion: Permanently deletes all user data
- Bank statements: PDF processed in memory, never stored to disk, bytes wiped immediately after extraction. Only transactions the user explicitly selects are added to the group.
Frenmo was built from zero to production using the Agent Toolkit β an open-source harness for structured AI-assisted development with Claude Code.
How it worked:
/requirementsβ Gathered scope, user stories, and priorities. Researched existing expense-splitting apps to identify feature gaps./architectureβ Designed the system with 11 logged decisions: FastAPI monolith, PostgreSQL with integer cents, derived balances, greedy debt simplification./implementationβ Built feature-by-feature in TDD slabs. Each slab: failing tests β implement β verify β commit. No slab started until the previous was committed and working./precommitβ Quality gate before every commit. Tests must pass, code reviewed, app verified running. Zero skipped gates across 99 tests./debugβ Hypothesis-driven debugging for production issues (asyncpg timezone mismatch, SSL connections). Root cause β test β fix.
What the toolkit provides:
- Skill workflows β Enforce TDD, prevent shortcuts, catch regressions before they ship
- Quality gates β Pre-commit hooks block commits until tests pass
- Session continuity β HANDOFF.md preserves context across sessions
- Auto mode β Skills chain: requirements β architecture β implementation β deploy
The entire app β auth, groups, 5 split types, friends, charts, comments, password reset, currency converter, bank statement import for 10 banks, Apple-inspired theme β was built across 3 sessions.
Repo: github.com/jvalin17/agent-toolkit
MIT