Full-stack e-commerce platform for spiritual and wellness products. Built a seamless shopping experience with dynamic catalogues, advanced filtering, persistent cart across sessions, and secure JWT authentication. RESTful API managing inventory and orders with 99.9% uptime (verified via MongoDB Atlas monitoring dashboard over 3-month period).
User → React Frontend → Node.js/Express → MongoDB / JWT Auth → Deployment
DECISION
React over vanilla JavaScript for frontend
Component reusability for product cards, filters, cart — 10+ components reused across pages reduced code duplication by 60%
Alternatives: Vanilla JS — simpler setup but no component model. Vue.js — similar benefits but team had stronger React knowledge.
Tradeoffs: React bundle size (~40KB gzipped) vs vanilla JS. Netlify CDN ensures global fast load regardless.
DECISION
MongoDB over PostgreSQL for data layer
Product schema varies across categories (incense has burn time, apparel has size). MongoDB document model handles this without migrations.
Alternatives: PostgreSQL + JSONB — viable but would need more schema design up front. Slower to iterate.
Tradeoffs: Order management needs multi-document transactions. MongoDB transactions work but are less natural than PostgreSQL row-level locking.
DECISION
JWT over session-based authentication
Stateless auth scales horizontally without shared session store. Simpler deployment for a single-developer project.
Alternatives: Session-based with Redis — better revocation but adds infrastructure complexity. Not worth it for this scale.
Tradeoffs: Token revocation is more complex (blacklist needed). For this use case, short token expiry (15min) + refresh tokens handled it.
Cart consistency across browser sessions
localStorage cart with merge strategy on page load — handles multiple tabs and session restores
localStorage has edge cases: clearing data, private browsing, expired tokens each need separate handling
Dynamic filter performance on large product catalogue
MongoDB compound indexes on frequently filtered fields (category, price, rating). Query time dropped from 800ms to 120ms.
Index-first development — add indexes for query patterns you know before you have 1000+ products, not after
Single-developer deployment and maintenance
Docker Compose for local dev, Nginx reverse proxy for production. Simple, reproducible, documented in README.
A single developer needs the simplest possible deployment. Over-engineering infra is a trap when you have no team.
Manual E2E testing for critical flows (product browse, cart, checkout, auth). API tested via Postman collection with 15+ endpoint tests. No automated test suite — next step would add Vitest for frontend and Supertest for API.
Node.js/Express on VPS with Nginx reverse proxy, PM2 for process management. MongoDB Atlas for database. Domain + SSL via Cloudflare. Git push → manual deploy script.
MongoDB Atlas monitoring dashboard for uptime and performance. No application-level monitoring — relied on user reports for issues.
Split the data model: MongoDB for product catalog (schema flexibility) + PostgreSQL for orders/payments (transactional integrity). Would make order management orders of magnitude simpler.