specs
Tech Stack

Tech Stack — Current Implementation

Status: Canonical Last Updated: 2026-05-11 Verification: Run grep -r "from " apps/frontend/package.json to verify versions


Related specs


Core Stack

LayerTechnologyVersionNotes
FrontendNext.js 16^16.xApp Router, Turbopack
StylingTailwind CSSv4CSS variables, tailwindcss-animate
BackendConvex^1.37.xPostgreSQL, real-time
AuthClerk^5.xStaff auth, guest OAuth
i18nparaglide-js^2.xen + vi locales
FormsReact Hook Form + ZodlatestPer-component validation
StateReact localState + BookingContextBooking uses convexQuery bindings
IconsLucide React^0.4.xNever emoji
Animationtailwindcss-animate^1.xFades, slides, zoom

Package Locations

  • Frontend: apps/frontend/package.json
  • Backend (Convex): packages/backend/package.json

Key Paths

apps/frontend/
├── app/
│   ├── [locale]/              # en, vi locales
│   │   ├── (landing)/        # Public pages
│   │   │   ├── page.tsx      # Homepage
│   │   │   ├── about/
│   │   │   ├── artists/
│   │   │   ├── schedule/
│   │   │   ├── reviews/
│   │   │   ├── wall/
│   │   │   ├── experiences/   # french-mentalist, dinner-theater, our-evening
│   │   │   └── inquiry/      # contact, venue-rental, workshops, private-events, artist-proposal, host-an-event
│   │   └── dashboard/         # Admin/staff routes
│   │       ├── admin/        # Admin panel
│   │       ├── pos/          # POS views
│   │       ├── checkin/
│   │       ├── events/
│   │       ├── experiences/
│   │       ├── reservations/
│   │       ├── inquiries/
│   │       └── event-payments/
│   └── layout.tsx
├── components/
│   ├── booking/               # Booking flow components
│   ├── home/                  # Homepage sections
│   ├── marketing/              # Landing page sections
│   ├── layout/                # Header, Footer
│   └── ui/                   # shadcn/ui primitives
└── lib/
    ├── hooks/                  # Custom hooks
    ├── utils/                 # Utilities
    ├── data/                  # Static data
    └── schemas/               # Zod schemas

packages/backend/convex/
├── schema.ts                  # All tables
├── domains/                   # Queries + mutations by domain
│   ├── experiences.ts
│   ├── events.ts
│   ├── reservations.ts
│   ├── addons.ts
│   ├── profiles.ts
│   ├── checkins.ts
│   ├── notifications.ts
│   ├── crm.ts
│   ├── forms.ts
│   ├── analytics.ts
│   ├── payments.ts
│   ├── minigames.ts
│   └── storage.ts
├── functions/
│   ├── events.ts
│   ├── eventReservations.ts
│   └── scheduled.ts
├── http/
│   ├── onepay.ts
│   ├── onepayReturn.ts
│   ├── tickets.ts
│   └── gift_card.ts
├── lib/
│   ├── auth.ts
│   ├── experiencesData.ts
│   ├── onepay/
│   └── env.ts
└── crons.ts

Convex API Pattern

All frontend calls use api.domains.<domain>.<operation>:

import { useQuery, useMutation } from "convex/react";
import { api } from "~/convex/_generated/api";
 
// Queries
const experiences = useQuery(api.domains.experiences.listActive);
const upcomingEvents = useQuery(api.domains.events.upcomingForExperience, {
  experienceId,
  limit,
});
 
// Mutations
const createReservation = useMutation(api.domains.reservations.createPending);
const updateStatus = useMutation(api.domains.events.updateStatus);

Design System

See apps/frontend/DESIGN.md for complete design tokens and component library.

Key tokens:

  • --color-gold: #c5a059 — Primary brand
  • --color-background: #0a0a0f — Dark background
  • --color-foreground: #ededed — Body text
  • --color-surface: #16161a — Card backgrounds