Split event expenses fairly with friends — no login, real-time, offline-first.
- Create an event in seconds — no signup, no email.
- Share the URL with friends. They identify themselves on first visit; one click to "I'm new" or pick from the list.
- Add purchases with per-person consumption multipliers. The app calculates the total to buy.
- Add expenses. The app computes who owes whom and shows the shortest settlement plan.
- Works offline for reading. Syncs live across devices when online.
- Install it as a PWA on your phone or laptop.
- Three languages: English, Spanish, Basque.
- Open EventSplit on any device.
- Tap Create event, name it, and add your name.
- Share the URL.
Open the URL in Chrome, Edge or Safari and use "Add to Home Screen" (mobile) or "Install" (desktop). Behaves like a native app and works offline by design.
No login. Your name (and optional nickname) live in your browser's localStorage. Event data syncs through Supabase (Europe-hosted, encrypted in transit). No analytics, no tracking, no advertising cookies (only your language preference).
Access — all database access goes through SECURITY DEFINER RPCs; the table is not directly readable, so the public key can't bulk-read events. An event is reachable only by its exact id (keep the link private to your group). An optional edit PIN, when set, is enforced server-side (the hash never reaches the browser) and rate-limited.
Your data — events.data holds names, optional email/phone, allergies and the expense/purchase records. Stored data is COMMENT-tagged as personal + special-category (health). Erasure: any participant can permanently delete the event (and all its data) from Location → Danger zone → Delete event. No automatic retention — an event is kept until someone deletes it. Contact: endika2@gmail.com.
Open-source, MIT licensed. PRs welcome.
Stack — TypeScript (strict), React 18, Vite, Tailwind CSS, Supabase (Postgres + Realtime), vite-plugin-pwa, i18next, Vitest.
Architecture — Hexagonal (domain → application → infrastructure → presentation). DI via a small hand-rolled container. Tests use in-memory fakes — no DB mocks.
Local dev
git clone git@github.com:Endika/EventSplit.git
cd EventSplit
cp .env.example .env.local # fill VITE_SUPABASE_URL + VITE_SUPABASE_ANON_KEY
npm install
npm run devCI runs lint, typecheck, tests and the production build on every PR.