Before Zovle · 002

Spotlight Furnishings

Carpet & furnishings store

An online shop for a carpet and home-furnishings business in Srinagar, Kashmir. Customers browse and order with cash on delivery. The owner runs the whole thing from a phone.

Spotlight Furnishings storefront: a carpet and home-furnishings shop in Srinagar, with a hand-knotted carpet unrolled beside the headline
Year
2026
Place
Srinagar, Kashmir
Role
Design + build
Type
Storefront + admin
Codebase, shop + admin
1
Oversells possible
0
Money, integer-safe
Paise
Cash on delivery
COD

The situation

A carpet and home-furnishings business in Srinagar. It sells Irani, Turkish and Arabic carpets picked one at a time, with curtains, quilts and bedding to go with them. The catalogue lived in the owner’s head and a phone gallery. There was no way to show the range, take an order, or know what was actually in stock without walking to the shelf.

What we built

One storefront and one owner’s panel, from a single codebase. Customers browse by category, order with cash on delivery, and pay when the carpet reaches their door. The owner adds products, prices, coupons and stock, reads every order, and runs the whole business from a phone. No laptop, no separate back office.

What changed

The shop is now something you can send a link to. Stock on the website is the stock on the shelf, prices are set once and apply everywhere, and every order arrives with an address and a phone number instead of a WhatsApp thread.

The number on screen can always be explained

Stock only ever changes through two functions, and both write a ledger row in the same database transaction. So any quantity on screen traces back to the exact event that set it. Checkout decrements stock conditionally, inside a transaction, which makes overselling impossible even if two people buy the last carpet at the same instant. Money is stored as integer paise from end to end, so nothing drifts by a rounding error between the cart, the order and the books.

Run from a phone, with secure sign-in

Admin sign-in uses argon2id password hashing, with sessions kept in the database rather than JWTs, so any lost or shared device can be revoked on the spot. The first visit to the admin walks the owner through creating the account. From there the panel covers products, categories, coupons, orders, inventory, settings, and a full audit log of who changed what.

The fine print

Next.js 16 serves both the storefront and the admin from one codebase. Data lives in Supabase PostgreSQL in the Mumbai region, reached through Drizzle ORM, with images on Cloudinary and error monitoring through Sentry. Self-tests cover the money, phone, pincode and discount logic, and a hardening step revokes public database roles after every migration.

  • Next.js 16
  • React 19
  • TypeScript
  • PostgreSQL · Supabase
  • Drizzle ORM
  • argon2id
  • Cloudinary
  • Zod
  • Sentry
  • Tailwind CSS

Zovle today

Need this inside Jira or Confluence?

Zovle now builds apps for Jira and Confluence Cloud, and rebuilds the custom add-ons teams lose when they leave Data Center.

Builds
Forge apps for Jira and Confluence Cloud
Migrations
Custom add-ons rebuilt for Cloud
Quotes
Fixed price, agreed in writing