← all projects
The Silver House — Full-Stack Jewellery Gallery
👾 Full-Stack ProductsFeaturedMay 2026

The Silver House — Full-Stack Jewellery Gallery

Custom e-commerce catalogue for a 925 sterling silver jewellery brand from Srinagar. Built with Next.js 15 (App Router) and Sanity CMS as the backend.

Next.jsSanityVercel
Live ↗

// the_story

The Real Thing

Every project before this had one thing in common: if it broke, nobody outside of me would notice. The Silver House was different. A real client, a real friend, a real business — 925 sterling silver jewellery from Srinagar, and Adeeb needed a storefront that could actually sell it. First freelance project. Still live. Still maintained by me today.

No safety net.

The Brief

The Silver House needed more than a static catalogue. Silver pricing is weight-based and market-driven — the price of a ring changes as the live spot price per gram changes. The client needed to update inventory without touching code. Orders happen through WhatsApp, not a payment gateway — that's how the business actually operates. And the product had to look like jewellery: clean, elegant, mobile-first.

Sanity v3 as the headless CMS meant Adeeb could add products, update categories, and manage the full catalogue through a clean dashboard — zero developer involvement for day-to-day operations. Next.js 15 App Router for the frontend. Tailwind for styling. Framer Motion for the scroll animations. Deployed on Vercel.

What I Built

Collections — gender and category filters over the full product catalogue, pulled live from Sanity via GROQ queries.

Product modal — multi-image slider, product code, weight in grams, and a price calculated on the fly from a live silver rate feed.

WhatsApp integration — no payment flow, no checkout. The "Order" button generates a pre-filled WhatsApp message with the product name, code, and weight. One tap to contact the seller directly. That's not a technical limitation — it's how Adeeb's business actually works, and building around it rather than against it was the right call.

Dynamic pricing — weight × live silver rate per gram. When the market moves, every price on the site moves with it.

Wishlist — persistent via localStorage. No login required.

ProductModal.tsx
const generateWhatsAppMessage = (product: Product, silverRate: number) => {
  const price = (product.weightGrams * silverRate).toFixed(2);
  const message = `Hi! I'm interested in:\n\n*${product.name}*\nCode: ${product.code}\nWeight: ${product.weightGrams}g\nPrice: ₹${price}\n\nPlease confirm availability.`;
  return `https://wa.me/91${PHONE}?text=${encodeURIComponent(message)}`;
};


The Part Nobody Sees

The hardest part of a freelance project isn't the code — it's understanding that the client's workflow is the product. Adeeb doesn't want to open a terminal. He doesn't want a Stripe integration he doesn't need. He wants to add a new bangle collection on a Tuesday afternoon and have it live by evening. The CMS schema design, the content editing experience, the naming of fields — those decisions matter as much as the frontend architecture.

Building for a portfolio teaches you to code. Building for a real user teaches you to think.

Still Running

The Silver House is live. Products get updated. New collections go up. The silver price feeds through. I push fixes when something needs attention. That ongoing relationship — maintaining something in production for someone who depends on it — is a different kind of responsibility than shipping a side project and moving on.

Phase Two

A week after launch, Adeeb messaged me. He'd been manually entering products into the Sanity dashboard — name, code, weight, category, images, one by one. He'd done 100. There were 2,000 left. He was done.

"Bhai I can't do this."

I put down the TypeScript and picked up Python.

The Script That Saved Him Weeks

The problem was straightforward: a spreadsheet of ~2,000 SKUs with metadata and a folder of product images, none of it in Sanity. The Sanity HTTP API can accept document mutations in bulk. A Python script could bridge the two — read the sheet, upload the images as Sanity assets, and create the product documents programmatically.

AI came in for the product descriptions — GPT to generate a clean two-liner for each SKU from just the name, weight, and category. Not perfect, but Adeeb reviewed and confirmed the outputs were solid for a first pass. Every product, described, uploaded, and live.

The script ran for 20 minutes. It posted everything that would have taken Adeeb weeks — if not longer, because if we're being honest, he would have quit at 200.

2,000 products. 20 minutes. One friend slightly less tired.

What I Learned

  • The tech stack should disappear. The client doesn't know Sanity from a spreadsheet. They know whether they can update their products easily. Choosing the right CMS was a UX decision, not a tech decision.
  • WhatsApp is a payment gateway. In a lot of real-world small business contexts, the order flow goes through messaging. Building a Stripe integration nobody asked for would have been showing off, not solving the problem.
  • Dynamic pricing is a data integrity problem. When every price on the site is computed from a live rate, a bad API response means bad prices. Caching, fallbacks, and error states aren't optional.
  • Maintenance is the job. Shipping is the beginning, not the end. The Silver House being live and functional today — not just at the launch moment — is what makes it a delivered product.
  • Know when to switch tools. The frontend problem was solved. The new problem was a data pipeline problem. Putting down Next.js and picking up a Python script wasn't a detour — it was the right call. The best engineers aren't loyal to a stack; they're loyal to the solution.

For Adeeb — hardworking, ambitious (but lazy) , and one of the people who makes you want to build things that actually matter.

// gallery

The Silver House — Full-Stack Jewellery GalleryThe Silver House — Full-Stack Jewellery GalleryThe Silver House — Full-Stack Jewellery Gallery