Skip to content
All projects

01Travel · Web Platform

Holidays Journey — Char Dham & India Tours

A travel company’s full platform: a scroll-led site through the Himalaya, packages served from a database, and an enquiry pipeline with its own admin.

Role
Full-stack Developer
Context
Holidays Journey
Primary stack
  • Next.js
  • TypeScript
  • Tailwind CSS
  • GSAP
  • Supabase
  • Drizzle
Holidays Journey — Char Dham & India Tours — Holidays Journey

Sixteen destinations, one route

01

Overview

The website and back office for Holidays Journey, a Haridwar tours and travel company built around the Char Dham Yatra, Uttarakhand holidays, pilgrimage journeys and custom tours across India. Visitors travel through sixteen destinations ordered by altitude, follow the four shrines across a schematic Himalayan terrain, and filter packages by kind of trip. Behind it, every enquiry is emailed, stored and worked from an admin.

02

Problem

A pilgrimage is a big, considered purchase, and most people plan it with family over WhatsApp. The site had to make the journey feel real before anyone spoke to the agency, keep package details correct without a developer in the loop, and make sure no enquiry was ever lost on its way in.

03

My role

  • Built the site end to end on Next.js 16 and React 19: the design system, the scroll-led sections and the content model.
  • Modelled destinations, packages, itineraries, categories, gallery, FAQs and testimonials as typed schemas behind one data-access layer.
  • Moved packages into a Supabase Postgres database with Drizzle migrations and a seed script, so listings are edited as data, not code.
  • Built the enquiry pipeline: email through a choice of providers, a database record, an optional Turnstile check and a staff-only admin.
  • Generated canonicals, the sitemap, Open Graph tags and JSON-LD structured data from one configured site origin.
04

Architecture

  1. FrontendNext.js 16 App Router, React 19 and TypeScript, styled with Tailwind v4 tokens and shadcn/ui on Radix. Motion runs through one provider with GSAP and Motion.
  2. ContentTyped schemas for every content type, read through a single data-access module, with business identity and messaging held in config.
  3. DatabaseSupabase Postgres via Drizzle. Once a database is configured, packages are read only from it.
  4. EnquiriesSwappable email delivery (Resend, SMTP, SendGrid or SES), stored records and an optional Cloudflare Turnstile check.
  5. AdminSupabase Auth login with staff roles granted from the command line; enquiries are reviewed in the admin.
  6. SEOCanonicals, sitemap, robots, Open Graph and JSON-LD built from the production origin.
05

Technology

Interface

  • Next.js
  • React
  • TypeScript
  • Tailwind CSS
  • shadcn/ui
  • Radix UI
  • GSAP
  • Motion

Data

  • Supabase
  • PostgreSQL
  • Drizzle ORM

Enquiries

  • Resend
  • SMTP
  • SendGrid
  • Amazon SES
  • Cloudflare Turnstile

Quality

  • Vitest
  • PGlite
  • ESLint
  • Prettier
06

Engineering challenges

C1

An enquiry must never disappear

A form that shows “thank you” while the email silently fails is worse than no form at all: the customer waits and the agency never knows they asked.

C2

Packages the agency can change without a deploy

Routes, durations and starting prices change with the season, and hard-coded listings would turn every change into a developer task.

C3

Making a mountain route feel real

Four shrines at over 3,000 metres are hard to picture from a list of names and prices.

C4

Search visibility for a local business

For a Haridwar agency, being found for the Char Dham Yatra is the business. One wrong origin breaks canonicals, the sitemap and share cards together.

07

Solution

  1. S1

    An enquiry must never disappear

    Each enquiry is both emailed and saved to the database. In production, if neither succeeds the visitor is told plainly and offered WhatsApp or a phone call instead.

  2. S2

    Packages the agency can change without a deploy

    Packages, categories and the fleet live in Postgres behind Drizzle migrations and a seed script, with staff access managed through Supabase roles.

  3. S3

    Making a mountain route feel real

    Destinations are laid out in order of altitude, and the Char Dham sits on a schematic terrain that traces the route from Yamunotri to Badrinath, each stop marked with its height.

  4. S4

    Search visibility for a local business

    Every SEO surface is generated from one configured site URL, and a production build refuses to run without it.

08

Performance

  • Images go through Next.js image optimisation. Stock photos sit at the same paths the agency’s own photography replaces, one for one.
  • Database tests run against PGlite, so the data layer is tested without a live server.
09

Product experience

  • Sixteen destinations, from Varanasi to Kedarnath, ordered by altitude.
  • Package routes show duration, starting point and a starting price, and filter by Char Dham Yatra, Uttarakhand or pan-India tours.
  • WhatsApp is never more than a tap away, through a floating button and in-page links.