01 / 24Next →
Mindful travel platform2024–25

INTT Leisure

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.

ContextSoftware Engineer, INT Terminal Travel Group
Year2024–25
TypeWeb
StatusLive
RoleFull-stack web development & AWS deployment

Project media coming soon

Screenshots and demo videos for this case study will appear here.

Overview

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.

ReactNode.jsExpressMongoDBAWSLeafletFramer MotionMailchimp
Challenge

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.

Approach

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.

Outcome

The live platform handles both destination marketing and day-to-day content operations from one full-stack system, and was my first production deployment.

System architecture
01ClientReact 18 · React Router · Framer Motion · Leaflet

Destination, tour, mindfulness, events and blog pages, with a clustered map and route drawing between locations.

02Prerendering & SEOreact-snap · react-helmet-async

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.

03APIExpress · MongoDB

11 route modules for tours, concierge services, events, blogs, itineraries, enquiries, contact, newsletter and admin.

04MessagingNodemailer · Mailchimp

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.

05HostingAWS Lightsail

API and client deployed on a Lightsail instance.

Engineering decisions
01

Prerender a React SPA instead of rewriting it

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.

02

Two emails for every form

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.

What I built
01Destination, tour, concierge, event, blog and sample-itinerary experiences
02Clustered Leaflet map with route drawing between destinations
03Protected admin dashboard for content, enquiries and itinerary management
04Prerendered pages with per-route SEO metadata
05Dual confirmation and notification emails plus Mailchimp newsletter sync
Next projectRoyal Bakery →