Zentra is a Next.js event platform for organizers, attendees, and admins. It includes public organizer pages, event discovery, ticket checkout, payment callback handling, attendee verification, and internal dashboard flows for managing events, orders, and ticket operations.
- Next.js 16 with the App Router
- React 19
- TypeScript
- Tailwind CSS 4
- TanStack Query
- Nodemailer for contact form email delivery
- Public organizer landing pages and event listings
- Event detail pages with ticket inventory and sold-out handling
- Checkout and payment return flows
- Organizer dashboard for events, attendees, gallery, and staff tools
- Admin dashboard for events, organizers, tickets, and orders
- Ticket verification and check-in utilities
app/: route definitions, pages, layouts, and API routescomponents/: UI building blocks and page-level client componentshelpers/: API clients, auth helpers, formatting, types, and utility logicpublic/: logos and static assets
- Install dependencies:
npm install-
Create a
.env.localfile in the project root. -
Add the required environment variables:
NEXT_PUBLIC_API_BASE_URL=http://localhost:4000/api/v1
EMAIL_HOST=
EMAIL_PORT=587
EMAIL_USER=
EMAIL_PASS=
EMAIL_FROM=
CONTACT_EMAIL_TO=
APP_NAME=Zentra- Start the development server:
npm run dev- Open
http://localhost:3000.
npm run dev
npm run build
npm run start
npm run lint
npm run ts-checkNEXT_PUBLIC_API_BASE_URLis used by the frontend API client inhelpers/api.ts.- If
NEXT_PUBLIC_API_BASE_URLis omitted, the app falls back tohttp://localhost:4000/api/v1. - The contact form route at
app/api/contact/route.tsuses the email variables above.
- Public event browsing:
app/[organizer],app/[organizer]/events,app/[organizer]/events/[id] - Checkout:
app/[organizer]/events/[id]/checkout - Organizer dashboard:
app/[organizer]/dashboard - Admin dashboard:
app/dashboard/adminandapp/(admin) - Payment status and callbacks:
app/payments/*,app/payment-success
- Remote images are allowed through
next.config.ts. - Data fetching on the client is handled through TanStack Query.
- The codebase uses shared helper modules to map backend API responses into UI-friendly shapes.
Before shipping changes, a good quick check is:
npm run ts-check