Categories & Sub-categories
Five top-level categories with their own sub-categories, shown as a themed carousel on the home page and as a sidebar filter in the shop.
Multi-Vendor Marketplace
Fig. 01
Desktop · Laptop · Tablet · Phone
Carto is a multi-vendor online marketplace where shoppers browse products from many independent stores in one place. It covers the whole shopping loop — discovering products by category and price, comparing them, reading vendor profiles, filling a cart and reaching checkout — on top of a Supabase (Postgres) backend.
The goal was to build a realistic storefront end to end: relational data with vendors, categories and sub-categories, route-level data loading so pages paint with data already in hand, and a cart that survives a refresh.
Menna Selim
Collaborator
Core Features
Five top-level categories with their own sub-categories, shown as a themed carousel on the home page and as a sidebar filter in the shop.
Filters live in the URL query string, so a filtered shop view can be refreshed, bookmarked or shared and still show the same products.
One search box queries products and stores at the same time and returns a mixed result list that links straight to each page.
A Redux Toolkit cart with quantity controls and totals, saved to local storage so it survives a refresh.
Time-limited offers with the old price, the new price, how many items are left and a live expiry countdown.
Each store has its own page with rating, customers, on-time shipping rate, address and a grid of the products it sells.
Add products to a side-by-side table to compare price, rating and details before buying.
Sign-up and login through Supabase Auth, plus a profile area with account details and an order history.

Home
A promo carousel, a category strip with tabs for each top-level category, featured vendors and the popular-products grid — all loaded before the page renders so there is no spinner flash.

Discovery
Every product in a responsive grid with a category sidebar and a price-range slider. Cards show the vendor, rating, old and new price and an add-to-cart button.

Product
Large product image, price with discount, stock, add-to-cart, wishlist and share buttons, then tabs for product info, vendor info and reviews — plus related products from the same category.

Merchandising
A rating-sorted list of the best products, built from one Supabase query that pulls in each product’s vendor and category in the same request.

Marketplace
A storefront inside the marketplace: store logo, rating, customer count, on-time shipping rate, contact details and everything the vendor sells.

Checkout
Quantity steppers, per-line totals, remove buttons and an order summary with shipping fee, delivery address check and coupon field. The cart lives in Redux and is mirrored to local storage.
The problem
The solution
Each route has a loader that prefetches its queries into the TanStack Query cache before the page renders. Components then read the same query keys, so the first paint already has data and later visits come straight from the cache.
The problem
The solution
Products, vendors, categories and sub-categories live in separate tables. Instead of several round trips, queries use Supabase’s embedded relations to fetch a product together with its vendor and category in one request, and filters (category, sub-category, price range) are applied server-side.
The problem
The solution
The cart is a Redux Toolkit slice that is initialised from local storage and written back on change, with reducers for add, remove, increase and decrease so totals stay consistent.
0
Seeded products
0
Vendors
0
Top-level categories
0
Routed pages