Mobile-first Mpesa bill splitter for the Kenyan market — split bills, send STK push requests
# Gawa — Split Bills, Send Mpesa
> A mobile-first bill splitter built for the Kenyan market. Enter a bill, add friends' Mpesa numbers, and each person gets an STK push payment request instantly.
---
## Features
- **Bill Splitting** — Equal, itemised, or custom splits across any number of people
- **Mpesa STK Push** — Each participant gets a payment prompt sent directly to their phone
- **Real-time Payment Status** — Track who has paid and who hasn't in one view
- **Trip Expense Tracker** — Group multiple events under a trip (e.g. Mombasa Weekend)
- **Recurring Bills** — Handle flatmate rent, utilities, and subscriptions on a schedule
- **Activity Feed** — Full audit log of all splits, payments, and status changes
- **Dashboard Analytics** — Outstanding amounts, collections, and active event counts
---
## Tech Stack
| Layer | Technology |
|---|---|
| Frontend | React 18 + Vite, TypeScript, TailwindCSS, shadcn/ui |
| Backend | Express 5, Node.js, TypeScript |
| Database | PostgreSQL + Drizzle ORM |
| API Contract | OpenAPI 3.0 → Orval codegen (React Query hooks + Zod schemas) |
| Payments | Safaricom Daraja API (Mpesa STK Push) |
| Monorepo | pnpm workspaces |
---
## Project Structure
```
.
├── artifacts/
│ ├── gawa/ # React + Vite frontend (serves at /)
│ └── api-server/ # Express 5 API server (serves at /api)
├── lib/
│ ├── api-spec/ # OpenAPI spec + Orval codegen
│ ├── api-client-react/ # Generated React Query hooks
│ ├── api-zod/ # Generated Zod validation schemas
│ └── db/ # Drizzle ORM schema + migrations
└── scripts/ # Shared utility scripts
```
---
## Database Schema
| Table | Purpose |
|---|---|
| `events` | A bill-splitting event (e.g. dinner, rent) |
| `participants` | People in an event with their share and payment status |
| `bill_items` | Line items for itemised splits |
| `payments` | Mpesa STK push records and their status |
| `trips` | Groups of related eve …