
Bilingual Hotel Resort Marketing Site & Admin CMS







Deluxia Holiday Resort needed a bilingual (English/Turkish) marketing and booking site for its Cyprus beachfront property, paired with a full admin CMS so hotel staff could manage every piece of public content — rooms, amenities, dining, events, gallery, the restaurant menu, and incoming reservations and inquiries — without touching code.
I built the whole stack from the ground up: a Next.js App Router site rendering directly from PostgreSQL via Prisma, Server Actions driving admin CRUD with no separate API layer, and a hand-rolled i18n system for the English/Turkish content pairs stored on each model.
Every section of the public site — rooms, amenities, dining photos, events, gallery, hero video, restaurant menu, and site settings — is backed by a Server Component + Server Actions page pair, giving staff full CRUD control with no headless CMS or extra API layer.
The Reservation model deliberately stores a snapshot of room name, badge, and price at booking time rather than a live relation to Room, so editing or removing a room later never corrupts historical booking records.
Purpose-built image, video, and PDF upload handlers with server-side compression via sharp, serving files back through a catch-all route rather than a third-party CDN or blob service.
A GitHub Actions pipeline builds and ships the app straight to a self-managed VPS running behind PM2 and a reverse proxy, with Prisma migrations applied automatically and NextAuth configured for that self-hosted setup instead of Vercel.
One codebase covers the public bilingual marketing & booking site and a JWT-authenticated admin CMS behind it, deployed via a GitHub Actions CI/CD pipeline to a self-managed VPS rather than Vercel.