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.
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.
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.
Architecture
- 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.
- ContentTyped schemas for every content type, read through a single data-access module, with business identity and messaging held in config.
- DatabaseSupabase Postgres via Drizzle. Once a database is configured, packages are read only from it.
- EnquiriesSwappable email delivery (Resend, SMTP, SendGrid or SES), stored records and an optional Cloudflare Turnstile check.
- AdminSupabase Auth login with staff roles granted from the command line; enquiries are reviewed in the admin.
- SEOCanonicals, sitemap, robots, Open Graph and JSON-LD built from the production origin.
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
Engineering challenges
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.
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.
Making a mountain route feel real
Four shrines at over 3,000 metres are hard to picture from a list of names and prices.
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.
Solution
- 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.
- 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.
- 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.
- 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.
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.
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.


