Noema is a local demo marketplace built with a FastAPI backend and a Next.js frontend.
Run both services with one command:
./run-dev.shThe script starts:
- Frontend:
http://127.0.0.1:3001orhttp://127.0.0.1:3000if free - Backend:
http://127.0.0.1:8000
If you need to override the ports:
FRONTEND_PORT=3000 BACKEND_PORT=8000 ./run-dev.shBackend:
cd backend
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python -m uvicorn app.main:app --reload --host 127.0.0.1 --port 8000Frontend:
cd frontend/app
npm install
npm run dev -- -H 127.0.0.1 -p 3000backend/app/main.pywires FastAPI, CORS, and static uploads.backend/app/api/upload.pyhandles image uploads and returns a local URL.frontend/app/app/contains the real Next.js app router.frontend/app/components/holds shared UI building blocks.frontend/app/lib/holds local storage helpers, auth state, and shared types.
/redirects to/marketplace/marketplacebrowses products/authopens the guest-login entry point/auth/loginand/auth/signupsupport full accounts/buyershows the buyer dashboard/sellershows the seller dashboard/products/[id]shows product details
This project is demo-first and stores state in the browser.
- Users, auth sessions, cart contents, and purchase history are persisted in
localStorage. - Products are persisted in
localStoragethroughfrontend/app/lib/productStore.ts. - Uploaded images are written to
backend/uploads/product-images/.
- The app router lives under
frontend/app/app/; the old top-level route tree was removed to avoid confusion. - If you deploy this outside local development, set
NEXT_PUBLIC_API_BASE_URLfor the upload widget. - The backend is currently storage-light; there is no database migration layer yet.