Rivoré
Selling fragrance online in Bangladesh, where most customers pay cash on delivery and a courier — not a payment gateway — decides whether the sale completes.
- Role
- Sole engineer
- Stack
- React · TypeScript · Vite
- Status
- Live

A full-stack commerce platform: catalogue, cart, checkout, payment, courier dispatch, invoicing and an admin surface. Live, taking real orders, with a physical store behind it.
An order is not done when payment succeeds
In a market where cash on delivery dominates, the payment gateway is only one of several ways a sale completes — and often the least common. The order lifecycle has to survive a customer who pays later, at the door, to a courier who then has to be reconciled.
Storefront, API, and the parts nobody sees
React and Vite on the front, Express and MongoDB behind. The visible half is the catalogue and cart. The half that took the time is the other side: dispatching to Steadfast Courier, generating invoices in both A4 and thermal POS formats, and an admin surface for the people actually running the shop.
Two invoice formats, not one
A4 is what a customer expects by email. Thermal POS is what the counter printer in the physical store actually produces. Supporting only one would have meant somebody re-typing orders by hand every day, which is the kind of decision that looks like a detail in the repository and like the whole product from behind the counter.
What I would change
Product copy is stored as raw text and rendered verbatim, so Markdown emphasis typed by a shop admin appears on the live page as literal asterisks. The content model should either render Markdown or reject it at the input, rather than leaving the distinction to whoever is typing.
- React
- TypeScript
- Vite
- Zustand
- Node.js
- Express
- MongoDB
- Mongoose
- UddoktaPay
- bKash
- Steadfast Courier
- Cloudinary
- Docker
- Traefik