
Three-sided task marketplace with server-enforced lifecycle and Stripe disbursement.
Worker, Buyer, and Admin each operate in a role-scoped dashboard with context-appropriate data fetching and navigation. Task status transitions — draft → published → submitted → approved/rejected → paid — are validated server-side on every mutation; the client cannot skip states by crafting direct API calls. Stripe payment credits are triggered by webhook confirmation, not client callback, preventing double-credit on network retries. JWT payloads carry the user role; all API routes validate the claim before processing.
Frontend: React
Backend: Node.js, Express
Database: MongoDB
Auth: JWT