a fullstack event ticketing platform for Ghana's events
# CribEvent
A full-stack event ticketing platform built with Next.js (App Router), TypeScript,
Tailwind CSS, **Supabase** (Postgres + Auth), and **Paystack** for payments.
## Getting started
1. Copy `.env.local.example` to `.env.local` and fill in your Supabase, Paystack,
and Resend keys.
2. Run the SQL migrations in `supabase/migrations/` — see `supabase/README.md`
for step-by-step setup, including how to promote a user to `admin` or `staff`.
3. Install and run:
```bash
npm install
npm run dev
```
Open
localhost.
## IMPORTANT — file structure
This is a real Next.js **App Router** project. Route files **must** be named
exactly `page.tsx` (or `layout.tsx`, `not-found.tsx`, `route.ts`) inside their
folder — the folder path defines the URL, not the file name. For example:
```
src/app/(customer)/account/tickets/page.tsx → /account/tickets
src/app/(customer)/account/tickets/[ticketId]/page.tsx → /account/tickets/123
src/app/admin/scanner/page.tsx → /admin/scanner
src/app/api/webhooks/paystack/route.ts → POST /api/webhooks/paystack
```
Don't rename these — Next.js won't recognize them as routes if you do. Only
files under `src/components/` should be named after their component.
If you're moving code by hand between machines, prefer copying whole folders
(or just re-downloading the project) over retyping file names from memory —
this is also what causes the "differs only in casing" TypeScript errors on
case-insensitive filesystems (macOS/Windows) if a stray duplicate file exists.
## Architecture
```
src/
app/
(public)/ Homepage, event discovery, event details, about, contact
(customer)/ /account, /account/tickets — requires a signed-in user
(auth)/ /login, /signup
admin/ /admin/** — requires role admin or staff (see below)
checkout/ /checkout, /checkout/success
api/
checkout/ POST — creates a pending order + starts a Paystack transaction …