Full-stack invoicing app: React + FastAPI, PostgreSQL, RevenueCat subscriptions, dark-mode dashboard, and client/invoice workflows built for African businesses.
# ArewaPay
**Invoicing and receivables for African SMEs** — multi-currency clients and invoices, balance visibility, and overdue tracking.
**Live demo:** _Add your deployed URL (e.g. Railway + static host)._
**Deploy for free (tiers & caveats):** see docs/DEPLOYMENT.md. **Fly.io:** docs/FLY.md.
---
## Stack overview
| Layer | Technologies |
|--------|----------------|
| **Frontend** | React 19, TypeScript, Vite, Tailwind CSS v4, TanStack Query, React Router, React Hook Form + Zod, Recharts, `@react-pdf/renderer` |
| **Backend** | Python 3.11+, FastAPI, SQLAlchemy 2, Alembic, Pydantic, JWT + httpOnly cookies, bcrypt, slowapi |
| **Data** | PostgreSQL 16, Redis 7 |
| **Infra** | Docker Compose, nginx (frontend image), GitHub Actions CI |
---
## What’s in the product
- **Auth & session:** Email OTP registration (`/auth/register/request` → `/auth/register/verify`), login only after verified email, JWT access + refresh in httpOnly cookies, `/auth/me`, logout.
- **Onboarding:** First-run flow (country, currency, optional company name, short survey) before the main app.
- **Dashboard:** Revenue summary, monthly chart, top clients.
- **Clients:** Table view, CSV export, structured address fields; **Add client** on a dedicated page.
- **Invoices:** Table + export, create flow with line items, tax, due date; **bill-to** snapshot from the client address; PDF download; settlement rows and status (draft → paid / overdue).
- **Settings:** Full-width **Profile** and **Account** (display name, country, currency, theme). Theme (light / dark / system) applies **inside the signed-in app** only; marketing and auth pages stay light.
- **Marketing:** Landing, features, about (FAQ link), legal pages; nav shows an **avatar menu** when you’re logged in (dashboard, profile, logout).
---
## Architecture
```mermaid
flowchart LR
subgraph client [Browser]
FE[React + Vite]
end
subgraph server [Backend]
API[FastAPI]
DB[(PostgreSQL)]
RD[(Redis)]
end
FE -->|REST JSON + cookies …