Overview
Public brand site for a Thai restaurant brand with multiple branches across the country. The site is a hospitality experience first — menu, lifestyle blog, brand story — and a practical tool second, with a Google Maps branch finder, allergy information, and an FAQ. Bilingual (Thai / English) and backed by an admin CMS that the marketing team runs themselves.
What I built
- Full menu with category browsing and detail views ("menu" + "menus")
- Branch finder using @react-google-maps/api — searchable list of branches with map markers, opening hours, and phone
- Allergy information page so guests can check ingredients before ordering — important for a hospitality brand
- Lifestyle blog and brand-story sections, plus services and FAQ pages
- Bilingual (Thai default +
/enEnglish tree) - Mobile-first carousels and reveals — most diners check the site on a phone, often standing outside a branch
- Companion admin CMS (separate repo) for menu updates, blog posts, and branch info
Tech stack
- Frontend: Next.js 16, React 19 (RC), Tailwind CSS
- UI primitives: Radix UI (accordion, dialog, popover, select)
- Maps: @react-google-maps/api for the branch locator
- Carousels: Embla, Swiper, Slick, react-multi-carousel, react-snap-carousel — different carousel libs for different feels (hero, menu rows, testimonials)
- Animations: Lottie, react-awesome-reveal
- State + utilities: Zustand-style helpers, lodash, date-fns, react-day-picker, react-swipeable for touch gestures
- Backend: AWS Amplify, Lambda + Express, MongoDB Atlas
My role
Built the public brand site end-to-end and the admin CMS that feeds it. The branch finder was the most operationally important feature — the marketing team adds branches as the brand expands, and that flow had to be self-serve. The allergy page was where I leaned hardest on the editorial team to get content right; the engineering side was straightforward, the content side wasn't.
What I learned
Restaurant brand sites get used differently than they're designed for. The team imagines diners reading the brand story; in reality, most traffic is people standing outside a branch checking the menu and opening hours on their phone. So the practical tooling — branch finder, menu loading time, mobile carousel ergonomics — ended up mattering more than the lifestyle content. The other lesson was managing the carousel zoo: five carousel libraries is two too many, and on the next project I'd consolidate hard before shipping.



