Live-event marketplace, digital ticket wallet, and venue-entry system for Mozambique (pt-MZ/en). Expo mobile app, Next.js web, Fastify + Postgres API, and a staff gate scanner.
# Moz Tickets
Live-event marketplace, digital ticket wallet, and venue-entry system for Mozambique.
Portuguese-first (`pt-MZ`) with English support; prices in MZN.
See PLAN.md for the phased roadmap and DESIGN.md for the app design direction.
## Repo layout
- `apps/api` - Fastify + Drizzle + Postgres backend (catalog, auth, orders, tickets, gate entry).
- `apps/mobile` - Expo (React Native) fan app: Discover, For You, My Tickets, Account.
- `apps/web` - Next.js web app (SSR event pages).
- `apps/scanner` - staff gate-scanning app (placeholder, MVP milestone).
- `packages/shared` - domain types, ticket state machine, i18n dictionaries, money formatting.
## Getting started
```bash
pnpm install
pnpm db:up # Postgres 16 in Docker on port 5433
pnpm db:migrate # push schema
pnpm db:seed # 10 mock Maputo/Matola events
pnpm dev:api # API on :4000
pnpm dev:web # web on :3000
pnpm dev:mobile # Expo dev server (press i for iOS simulator, a for Android)
```
The mobile app auto-discovers the API through the Metro host, so it works on simulators and physical devices on the same network.
## Dev notes
- Auth is phone OTP; in dev the code is returned by `POST /auth/otp/request` and logged to the API console (mock SMS).
Rate limits: 5 code requests per phone per hour, 5 wrong guesses kill a code.
### Demo accounts (after `pnpm db:seed`)
Sign in with the phone number and code `000000` - no OTP request needed.
The bypass is dev-only (disabled in production), works only for these three numbers, and never creates accounts.
| Role | Phone | Code | Where to use it |
|---|---|---|---|
| Fan (has 2 tickets) | `+258842222222` | `000000` | Mobile app or web - My Tickets comes pre-loaded |
| Organizer | `+258840000000` | `000000` | Mobile: Account → "Portal do organizador" · Web: `/organizer` |
| Gate staff | `+258841111111` | `000000` | Mobile: Account → "Modo porteiro" · Web: `/gate` · Scanner app |
Role features have full parity across surfaces: organiz …