The product
Aura Commerce — the marketplace that started life as Nantian 南天 — is a multi-vendor shop: buyers browse a catalogue of 856 products, sellers run their own storefront, and operators manage the whole system from one admin console. Three surfaces, one codebase, one catalogue.
Flash sales are a data problem
The countdown on the homepage is not decoration — it has to agree with the price. The discount window lives on the product (price + discountPrice + campaign end), and the rail renders straight from the API payload, so a timer can never outlive its discount.
// The campaign carries its own window; the UI renders what the API returns.
const { endsAt, items } = await getFlashSale('active');
// countdown → endsAt, prices → items[].price.discountPrice
Three audiences, one catalogue
Storefront, seller portal and admin console all read the same MongoDB catalogue through the same Express API. A product edited by a seller shows up in the storefront grid, the category page and the admin table without a sync job.
Realtime without a second service
Chat and notifications run on Socket.IO with the Redis adapter, so any worker in the cluster can push an event to a customer connected to a different process.
Workers, not requests
Order emails, notifications and AI jobs are RabbitMQ consumers with per-queue prefetch and dead-letter queues. The HTTP request returns as soon as the order is written; the slow parts retry behind it.
AI on top of the catalogue
Mistral (through LangChain) does two jobs: a shopping assistant that answers product questions, and product embeddings stored in product_embeddings so search can match meaning instead of keywords.
What the screens show
Every screen below was captured from the running app — Express 5 on MongoDB Atlas, Redis, RabbitMQ, and the Next.js client.