Vendure is a mature, open-source headless commerce platform built on NestJS, GraphQL, and TypeORM. It provides a complete backend for e-commerce operations including product catalog management, order lifecycle, payment/shipping/tax processing, promotions, and multi-channel support. The monorepo contains a core backend package, two parallel admin UIs (an older Angular-based admin-ui and a newer React-based dashboard), a CLI tool for scaffolding and migrations, and a plugin ecosystem with official plugins for email, asset server, job queues (BullMQ), caching (Redis), telemetry (OpenTelemetry), and AI integration via the MCP (Model Context Protocol) plugin. The architecture is modular with a strategy pattern for extensibility, an event bus for domain events, a job queue system, and a custom fields system. The codebase demonstrates strong engineering practices with extensive test coverage, CI/CD pipelines, and active maintenance. Notable reusable components include a generic finite state machine framework, a runtime-resolved custom fields system, an OAuth 2.1 authorization server, a dynamic form engine, and a tag-based cache invalidation service.
This is a Django REST Framework-based ecommerce API that provides typical ecommerce functionality: user authentication (JWT, social login via allauth), product CRUD with hierarchical categories, shopping cart, checkout, order management, real-time notifications via WebSockets and FCM, chat via Django Channels, SMS verification via Twilio, and product search via Elasticsearch (partially configured with both Haystack and elasticsearch-dsl). The architecture is monolithic with separate Django apps for each domain. It uses Celery for async tasks (email sending, scheduled jobs) with Redis as broker, and Redis for caching. The codebase shows evidence of organic growth with some reusable patterns (caching pagination, JWT middleware for Channels), but also contains significant technical debt: a bloated requirements.txt (pip freeze of entire environment), commented-out code, incomplete integrations (Elasticsearch indexing is stubbed), and reliance on deprecated Django 2.2 APIs (ugettext_lazy). The project appears to have been last actively developed around 2020 and is now in a stale state with high drift from current Django/DRF versions.