# Monkey Split > Monkey Split is a free, privacy-friendly expense-splitting PWA for groups — roommates, trips, couples, and teams. Track shared expenses with categories and tags, visualize spending with cross-filtering interactive charts, settle balances across currencies with ECB-backed rates, and work fully offline. No ads, no tracking, no account paywalls. Monkey Split runs entirely on Cloudflare's edge (Workers + D1 + Pages) and installs as a standalone PWA on iOS, Android, and desktop. ## Key features ### Expenses - **Freeform categories** — create any category on the fly; autocompletes from past entries in the group - **Tags** — comma-separated tags on any transaction; click a tag anywhere to filter by it - **Flexible splits** — equal, weighted, percentage, or absolute per-member amounts - **Multi-currency per transaction** — each expense has its own currency; group has a base currency - **Transfers** — log settlement payments between members as transaction type "transfer" ### Visualisation & analysis - **Three interactive charts with cross-filtering:** - *Category breakdown* (donut) — click a slice to filter the other two charts by that category - *Member activity* (bars: paid / received / net) — click a member to filter by them - *Time-period trends* (stacked bar or line, by day/month/year) — click a period to filter by it - Active drill-down filters shown as removable pills; all three charts stay in sync ### Transactions view - **Search** across description, category, and tags (exact or fuzzy match) - **Group by** date, category, payer, currency, or transaction type - **Bulk select** → bulk delete, bulk set category, or bulk add tags - **CSV export** of the current filtered or selected set (Excel-compatible, with conversions and participants) - Compact vs. detailed density toggle ### Settlement - **Optimal settlement plan** — greedy algorithm minimises the number of transfers needed to zero out all balances - **One-tap record settlement** — confirm a suggested transfer and it's logged as a transaction - **PayPal deep-link** — if a payee has set their PayPal username, the settlement row links directly to PayPal.me - "Show my settlements only" toggle ### Multi-currency - ECB daily reference rates, fetched once per day via cron and cached in Cloudflare KV - Per-transaction conversions are pre-calculated server-side and stored — no client-side FX math, no rate drift between sessions - Group base currency chosen at creation ### Offline & PWA - Installable on iOS, Android, desktop (standalone display) - All writes go through a local offline queue with merge semantics — e.g. creating then deleting an unsynced expense cancels it without ever touching the server - Automatic sync when the device comes back online - Reads served from a 5-minute stale cache when offline ### Sharing & joining - 6-character invite code per group, with optional password (SHA-256 + per-code salt, no plaintext) - Code is regenerable - Deep-link invites (`/join/:code`) survive the login flow and auto-open the join modal ## Use cases - Roommates splitting rent, utilities, groceries — categorised and tagged monthly - Travel groups tracking mixed-currency expenses across countries with daily trend charts - Couples managing shared finances with category and tag breakdowns - Team lunches, events, or shared subscriptions with CSV export for reimbursement ## Links - [Monkey Split app](https://monkeysplit.app) - [Privacy policy](https://monkeysplit.app/#privacy) - [Imprint](https://monkeysplit.app/#imprint) ## Tech Built on Cloudflare Workers, D1 (SQLite), Pages, and KV. Auth via Better Auth with httpOnly session cookies. Cloudflare Turnstile on signup. Native Cloudflare rate limiting on auth and share endpoints. Charts use Plotly. React + Vite client with Workbox service worker. Fully edge-run; no origin servers, no third-party trackers, no analytics.