Let's connect!Check out my projects!
Case Study

Arasan Travels

Arasan Travels is a highly interactive, high-performance web application designed for a luxury touring and coach travel agency. It provides customers with an immersive browsing experience for day trips and multi-day staycations across the UK and Europe. Built as a pnpm monorepo, the platform features a Vite-powered React 19 frontend, an Express API backend, a PostgreSQL database managed via Drizzle ORM, and automated lead capture with secure Stripe integrations.

View Live Site
Arasan Travels feature
Arasan Travels screenshot 1
Arasan Travels screenshot 2
Arasan Travels screenshot 3

Core Features

Interactive Trip Discovery

A horizontal scroll carousel showcasing staycation packages and day trips with custom nights/days badges and price points.

Custom Expedia Search Widget

Fully responsive widget integration that allows booking flights, hotels, and custom travel packages directly through the platform.

Booking & Enquiry Pipeline

Secure customer booking enquiries validating inputs via Zod schemas, persisting details to PostgreSQL, and sending Nodemailer confirmations.

ESM Bundling for Serverless

Bundles the entire TypeScript Express backend into a single, standalone ES Module (.mjs) in /api/app.mjs using esbuild.

Admin Analytics Portal

Protected dashboard showing real-time aggregates for trips, newsletter subscribers, and booking enquiries under ADMIN_TOKEN authentication.

Technical Deep Dive

01

ESM Bundling for Serverless Environments

To deploy the Express backend within Vercel's serverless environment, I configured a custom build pipeline using esbuild. This compiles the entire TypeScript API into a single, standalone ES Module (/api/app.mjs) with all sub-workspace dependencies inlined. This bypasses Vercel's root-dependency compilation restrictions and ensures lightning-fast lambda cold starts.

02

Lazy Database Proxy Connection Pattern

Direct database pooling at the file level can crash serverless lambdas on cold starts if environment variables are missing or if the serverless pool is slow to respond. To resolve this, I implemented a lazy Proxy wrapper for the Drizzle database instance. The connection pool is provisioned dynamically only when the first SQL query actually executes.

03

End-to-End Type-Safe REST API Client

The entire application runs on a fully connected REST API layer. The React frontend interacts with the Express backend using a generated, type-safe API client package (@workspace/api-client-react). This guarantees that Drizzle database schemas and Zod validation rules propagate directly to React components, eliminating runtime API interface mismatches.

Performance Benchmark

"Engineered a high-performance monorepo with an Express serverless backend, lazy database proxying, and custom ESM bundling, reducing serverless cold starts to near-zero and ensuring 100% type safety from database to UI."