A monorepo of independently publishable Vendure plugins, maintained by Rahul Yadav.
| Package | Version | Description |
|---|---|---|
@rahul_vendure/vendure-meilli-search |
1.0.1 | Drop-in Meilisearch replacement for Vendure's DefaultSearchPlugin. Full-text, faceted, and AI-powered hybrid/semantic search with automatic index syncing. |
@rahul_vendure/vendure-plugin-extra-promotions |
1.1.0 | 9 extra promotion conditions and 5 actions (collection discounts, cross-sell, happy hours, stock clearance, and more). Includes a dashboard UI. |
@rahul_vendure/vendure-plugin-faq |
1.0.7 | FAQ management with i18n translations, multi-channel support, Admin + Shop API extensions, and a dashboard panel. |
@rahul_vendure/vendure-plugin-phone-auth |
1.0.5 | Phone number + OTP authentication for the Shop API. Pluggable SMS providers, phone validation via libphonenumber-js, configurable OTP settings. |
@rahul_vendure/vendure-plugin-wishlist |
1.0.1 | Customer wishlist functionality with add/remove/bulk operations and variant-level wishlist status resolution. |
All plugins above target @vendure/core ^3.0.0 as a peer dependency and are licensed under MIT.
| Package | Version | Description |
|---|---|---|
@rahul_vendure/ai-chat-plugin |
0.1.8 | AI-powered shopping assistant plugin for Vendure — LLM chat with 19 built-in tools, pgvector semantic search, cart management, order tracking, checkout assistance, and an admin dashboard chat. Requires PostgreSQL with pgvector and an OpenAI API key. |
@rahul_vendure/ai-chat-react |
0.1.10 | Drop-in AI shopping assistant React component for Vendure stores. Renders a floating chat panel with product cards, collection badges, cart summary, and quick actions. Ships pre-compiled CSS, supports dark mode, and works with Next.js, Remix, Vite, CRA, etc. Pairs with @rahul_vendure/ai-chat-plugin. |
These packages are not open-source but are freely installable from npm. Licensed under AGPL-3.0.
/
├── packages/ # Publishable plugins
│ ├── vendure-meilli-search/
│ ├── vendure-plugin-extra-promotions/
│ ├── vendure-plugin-faq/
│ ├── vendure-plugin-phone-auth/
│ └── vendure-plugin-wishlist/
├── apps/
│ └── dev-server/ # Local Vendure instance for testing
├── tsconfig.base.json # Shared TypeScript config
└── package.json # Workspace root
- Node.js >= 18
- npm >= 9 (workspaces support)
- PostgreSQL (for the dev server)
- Meilisearch (only if testing the meilli-search plugin)
# Clone the repo
git clone https://github.com/Ryrahul/Vendure-plugins.git
cd vendure-packages
# Install all dependencies (workspaces are linked automatically)
npm install
# Build a specific plugin
npm run build -w packages/vendure-plugin-faq
# Start the dev server (runs server, worker, and dashboard concurrently)
cp apps/dev-server/.env.example apps/dev-server/.env # configure DB credentials
npm run dev -w apps/dev-serverapps/dev-server is a full Vendure instance with all plugins wired in. It uses PostgreSQL and includes mock data for testing. The dev server is never published; it exists solely for local development.
# Start everything (server + worker + dashboard)
npm run dev -w apps/dev-server
# Populate test data
npm run populate -w apps/dev-serverDashboard extensions are automatically discovered from any plugin that has a src/dashboard/index.tsx via a custom Vite plugin in apps/dev-server/vite.config.mts. No manual registration is needed.
Each plugin compiles its backend code to dist/. Dashboard extensions (if present) are published as raw TSX and bundled by the consuming project's Vite build.
# Build a single plugin
npm run build -w packages/vendure-plugin-<name>
# Watch mode
npm run watch -w packages/vendure-plugin-<name>Plugins that extend the GraphQL API use per-plugin @graphql-codegen to generate typed inputs and args. Types are regenerated automatically during npm run build, or manually:
npm run generate -w packages/vendure-plugin-<name>Generated types are committed to git. Do not manually define GraphQL input/args types -- import them from generated-graphql-types.ts instead.
-
Scaffold the plugin directory:
mkdir -p packages/vendure-plugin-<name>/src/{api,services,entities,errors,strategy}
-
Create
package.jsonwith the@rahul_vendure/scope,@vendure/core ^3.0.0as a peer dependency, and the standard build scripts. See any existing plugin for a template. -
Create
tsconfig.jsonextending../../tsconfig.base.jsonwithoutDir: "dist"androotDir: "src". Excludesrc/dashboardif the plugin has a dashboard extension. -
Write the plugin following the standard file layout:
src/ ├── index.ts # Barrel export (public API only) ├── <name>.plugin.ts # @VendurePlugin class ├── constants.ts # Injection tokens, logger context ├── types.ts # Non-GraphQL config interfaces ├── api/ │ ├── api-extensions.ts # GraphQL schema extensions │ └── *.resolver.ts ├── services/ ├── entities/ └── errors/ -
Set up GraphQL codegen if the plugin extends the API. Copy
vendure-schema-stub.graphqlandcodegen.ymlfrom an existing plugin and add the codegen dev dependencies. -
Wire into the dev server by adding the dependency to
apps/dev-server/package.jsonand importing the plugin invendure-config.ts. -
If the plugin includes a dashboard extension, ensure
src/dashboard/index.tsxexists and add a root-levelindex.tsthat re-exports from./src/index.
- Plugins do not ship migrations. Document any schema changes in the plugin's README so consumers know to run
npx vendure migrate. - Only
dist/andsrc/dashboard/are published. Never publish raw backend source. - Follow semantic versioning: patch for bug fixes, minor for new features or entity changes, major for breaking changes.
cd packages/vendure-plugin-<name>
npm run build
npm pack # inspect the tarball contents
npm publish --access publicVerify before publishing:
dist/contains compiled JS and.d.tsfilessrc/dashboard/is included if the plugin has a dashboard- No
src/entities/,src/services/, etc. leak into the package - Version is bumped appropriately
MIT