Case study · Live
Gondilal Saraf
Full-stack platform for a 150-year-old family jewelry business
Role
Solo — design, full-stack, admin ERP, deploy
Period
2022 → present · live at gondilalsaraf.com
The Pitch
Took my family's 150-year-old gold and silver jewelry shop in Banda, UP, online — public storefront, bilingual catalogue, and an admin ERP that runs daily operations.
The Problem
My family has been in the gold and silver business since 1873 — Banda, Uttar Pradesh, across four generations. The business has always run on trust built over decades and a physical showroom. Customers on WhatsApp wanting to browse inventory, verify hallmarks, or track a gold rate had no digital surface to point them at.
The challenge wasn't "build another e-commerce site." It was: respect the heritage aesthetic, serve a bilingual Hindi / English customer base, run on 3G connections, and give the shop's internal team a real admin ERP — all from one codebase I could maintain alone from San Diego.
The Approach
Three surfaces, one codebase
Public home page at `/`. Bilingual catalogue at `/shop` with search, filters, EMI calculator, and virtual try-on. Admin ERP at `/admin` with POS, inventory, customer database, daily-rate manager, and barcode generation. All three live in a single Next.js 15 App Router project sharing a Prisma schema.
Content sits in a single `content.json` with `hi` and `en` keys. A React context provider handles language switching — the entire UI updates instantly without a page reload.
The image pipeline
The most interesting technical piece. When someone uploads a jewelry photo from the shop, it goes through Photoroom API for background removal → Sharp for contrast and colour correction → WebP conversion for performance. Then Gemini 2.0 Flash generates bilingual product names and descriptions from the processed image. No manual copywriting needed.
For model images, Replicate's SDXL inpainting composites jewelry onto body-part templates — upload a necklace photo and the AI generates a realistic "worn" preview for the catalogue.
Heritage design system
Three switchable themes — ivory-gold, dark-gold, marble-gold — all persisted in localStorage with an inline `<ThemeScript>` to prevent FOUC.
The signature element is a heritage-gate animation on first visit: rosewood doors part with Framer Motion spring physics (stiffness 40, damping 20, mass 2) to reveal the site. Gold ornamental details, diamond motifs, custom cursor with a gold dot on desktop. Every interaction uses 500 ms cubic-bezier easing.
Trust surface, not just polish
Performance matters when your users are on 3G in rural UP. BIS-hallmark certificate badges and transparent pricing breakdowns matter more than flashy animations. The admin panel uses Hindi labels so my uncle can upload product photos without training. Every new feature gets measured against "does this help a real customer trust us more?" before shipping.
Key Decisions
PostgreSQL + Prisma, not a headless CMS
A headless CMS would have been quicker to start. But daily gold-rate updates, customer OTP auth via WhatsApp, encrypted PII, inventory reconciliation, and barcode printing are all relational problems. Prisma gave me type-safe queries across 15 models and let the admin ERP and catalogue share one source of truth.
WhatsApp OTP over SMS
SMS OTP delivery in rural India is unreliable and expensive. Most customers already use WhatsApp every day. A WhatsApp business link with a pre-filled OTP request is higher conversion, cheaper, and lets the shop reply directly.
Static catalogue seed, live database
A `catalogue-products.json` file seeds the database on deploy, so the shop never ships with an empty catalogue even if the database is fresh. The admin can then overwrite anything live — the static file is a fallback, not a source of truth.
Metrics
Prisma models
15
API routes
26
Test suite
85 vitest tests
Themes
3
ivory · dark · marble
Languages
Hindi · English
Legacy
Since 1873
Stack
App
Data & auth
AI
Other