A production MERN travel platform for discovering Sri Lankan destinations, tours and mindful, profession-aware retreats. It combines public discovery pages with an admin back office for enquiries, events, blogs and itineraries.
Project media coming soon
Screenshots and demo videos for this case study will appear here.
INTT Leisure pairs editorial travel content with working enquiry workflows. Visitors browse destinations on an interactive map, explore tours, concierge services, events, blogs and sample itineraries, and send a booking enquiry or newsletter signup. Staff manage all of that content and every incoming enquiry from a protected admin dashboard.
A large, image-heavy catalogue built as a React single-page app had to load quickly and be indexable by search engines. Non-technical staff also needed to run enquiries, events, blogs and itineraries without a developer.
I built a React 18 client with lazy-loaded media, Swiper and Framer Motion, and Leaflet maps with marker clustering and route drawing. Every route is prerendered to static HTML with react-snap, with critical CSS inlined and per-page metadata set through react-helmet-async. The Express and MongoDB API has 11 route modules covering content, enquiries and newsletters, JWT and bcrypt admin authentication, templated transactional email and a Mailchimp integration. It runs on AWS Lightsail.
The live platform handles both destination marketing and day-to-day content operations from one full-stack system, and was my first production deployment.
Destination, tour, mindfulness, events and blog pages, with a clustered map and route drawing between locations.
Every route is snapshotted to static HTML at build time with critical CSS inlined, so crawlers and first paint don't wait for the JavaScript bundle.
11 route modules for tours, concierge services, events, blogs, itineraries, enquiries, contact, newsletter and admin.
Six HTML templates send a confirmation to the visitor and a notification to staff for contact, enquiry and newsletter flows. Subscriptions go to a Mailchimp audience, which reports existing members.
API and client deployed on a Lightsail instance.
Switching frameworks mid-project wasn't justified, so I added react-snap as a post-build step. Each route is rendered in a headless browser and saved as static HTML with inlined critical CSS, and the app hydrates on top. The site gets indexable pages and a faster first paint while keeping the existing React codebase.
Contact, enquiry and newsletter submissions each send two templated emails: a confirmation the visitor can trust and a structured notification the team can act on. Templates live as separate modules, so staff-facing and visitor-facing copy can change independently.