dist/cursor/saleor-commerce/skills/saleor-dashboard/SKILL.md
Extend the Saleor Dashboard — mounting points, App Bridge actions, MacawUI components, iframe extensions, and custom views. Use when building Dashboard extensions.
npx skillsauth add orcaqubits/agentic-commerce-claude-plugins saleor-dashboardInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Fetch live docs:
https://docs.saleor.io/docs/developer/extending/apps/extending-dashboard-with-apps for Dashboard extension guidesite:docs.saleor.io app bridge actions dispatch notification for App Bridge APIsite:docs.saleor.io dashboard mounting points extensions for extension points referencesite:github.com saleor/macaw-ui components for MacawUI component librarysite:docs.saleor.io app iframe communication for iframe messaging patternsSaleor Dashboard extensions are rendered as Apps inside iframes. The Dashboard loads your App's URL in a sandboxed iframe and communicates with it through the App Bridge messaging protocol.
| Layer | Component | |-------|-----------| | Dashboard | React SPA (host application) | | Extension | Your App (rendered in an iframe) | | Communication | App Bridge (postMessage API) | | Styling | MacawUI component library |
Mounting points define where your App's extension appears in the Dashboard UI:
| Mounting Point | Location | Use Case |
|---------------|----------|----------|
| PRODUCT_DETAILS_MORE_ACTIONS | Product detail page dropdown | Product-level actions |
| PRODUCT_OVERVIEW_CREATE | Product list page | Custom product creation flows |
| PRODUCT_OVERVIEW_MORE_ACTIONS | Product list actions | Bulk product operations |
| ORDER_DETAILS_MORE_ACTIONS | Order detail page dropdown | Order-level actions |
| ORDER_OVERVIEW_CREATE | Order list page | Custom order creation flows |
| ORDER_OVERVIEW_MORE_ACTIONS | Order list actions | Bulk order operations |
| CUSTOMER_DETAILS_MORE_ACTIONS | Customer detail page | Customer-level actions |
| CUSTOMER_OVERVIEW_CREATE | Customer list page | Custom customer flows |
| NAVIGATION_CATALOG | Catalog navigation section | Custom catalog pages |
| NAVIGATION_ORDERS | Orders navigation section | Custom order pages |
| NAVIGATION_CUSTOMERS | Customers navigation section | Custom customer pages |
Mounting points are declared in the App manifest under the extensions array.
| Field | Type | Purpose |
|-------|------|---------|
| label | string | Button or menu item text |
| mount | string | Mounting point identifier |
| target | string | APP_PAGE (full page) or POPUP (modal) |
| permissions | string[] | Required permissions to see the extension |
| url | string | App URL path for this extension |
# In App manifest JSON (extensions array)
# Fetch live docs for current manifest extension shape
# label: "My Extension"
# mount: "PRODUCT_DETAILS_MORE_ACTIONS"
# target: "APP_PAGE"
# url: "/extensions/product-action"
The App Bridge is the communication layer between the Dashboard and your iframe App:
| Action | Direction | Purpose |
|--------|-----------|---------|
| dispatch | App -> Dashboard | Trigger a Dashboard action |
| redirect | App -> Dashboard | Navigate the Dashboard to a URL |
| notification | App -> Dashboard | Show a toast notification |
| handshake | Dashboard -> App | Initial connection with context data |
| theme | Dashboard -> App | Current Dashboard theme (light/dark) |
| token | Dashboard -> App | JWT token for authenticated API calls |
| response | Dashboard -> App | Result of a dispatched action |
| Type | Appearance |
|------|-----------|
| success | Green toast -- operation completed |
| error | Red toast -- operation failed |
| warning | Yellow toast -- caution needed |
| info | Blue toast -- informational message |
// Fetch live docs for current App Bridge initialization
import { useAppBridge } from "@saleor/app-sdk/app-bridge"
function MyExtension() {
const { appBridge } = useAppBridge()
// Use appBridge.dispatch(), appBridge.state, etc.
}
MacawUI is the official design system for Saleor Dashboard extensions:
| Component | Purpose |
|-----------|---------|
| Button | Primary and secondary action buttons |
| Input, Select | Form input fields and dropdowns |
| Box, Sprinkles | Layout primitives with design tokens |
| Text | Typography component with variants |
| List, Table | Data display components |
| Chip | Tag/badge component |
| Combobox | Searchable select with autocomplete |
| Checkbox, Switch | Toggle controls |
| Skeleton | Loading state placeholders |
| Tooltip | Contextual information popover |
Install via npm install @saleor/macaw-ui -- fetch live docs for the current version and available components.
MacawUI supports the Dashboard's light and dark themes. Use the theme tokens from the App Bridge to ensure your extension matches the current Dashboard appearance.
| Step | Action |
|------|--------|
| 1 | Scaffold App with saleor app create |
| 2 | Define extension mounting points in the manifest |
| 3 | Create Next.js pages for each extension URL |
| 4 | Initialize App Bridge in each extension page |
| 5 | Build UI with MacawUI components |
| 6 | Use App Bridge token for authenticated GraphQL calls |
| 7 | Tunnel and install for local testing |
| 8 | Deploy and update the App manifest URL |
| Aspect | Detail |
|--------|--------|
| Protocol | window.postMessage over the iframe boundary |
| Origin | Messages are validated against the Saleor instance origin |
| Handshake | Dashboard sends initial state (domain, token, theme) |
| Security | Always verify message origin before processing |
| Size | Use ResizeObserver to communicate content height to Dashboard |
Your App can register full navigation entries that appear in the Dashboard sidebar:
| Navigation Area | Manifest Mount |
|----------------|---------------|
| Catalog section | NAVIGATION_CATALOG |
| Orders section | NAVIGATION_ORDERS |
| Customers section | NAVIGATION_CUSTOMERS |
These appear as sidebar links that load your App's page in the main content area.
redirect action for Dashboard navigation instead of direct URL changesSkeleton while fetching dataFetch the Saleor Dashboard extension documentation for exact mounting point identifiers, App Bridge action signatures, and MacawUI component APIs before implementing.
development
Build with Spree's headless Next.js storefront — the official `spree/storefront` repo (Next.js 16 App Router with Server Actions and Turbopack, React 19 Server Components, Tailwind CSS 4, TypeScript 5, `@spree/sdk`, Sentry), server-only auth (httpOnly JWT cookies + publishable key), MeiliSearch faceted catalog, one-page checkout with Apple/Google Pay/Klarna/Affirm/SEPA, multi-region market routing, GA4 + JSON-LD SEO, and Vercel/Docker deployment. Use when forking or customizing the storefront, or evaluating headless adoption.
tools
Build Spree extensions as Rails engines — gem scaffolding, `bin/rails g spree:extension`, mounting routes/migrations/assets, the modern `prepend` decorator pattern (`*_decorator.rb` with `self.prepended(base)`), generators (`spree:model_decorator`, `spree:controller_decorator`), the four customization surfaces in preference order (Events > Webhooks > Dependencies > Decorators), Spree::Dependencies for swapping service objects, gem release/versioning, and the deprecated Deface engine. Use when building a reusable Spree extension or adding non-trivial customization to an app.
development
Build with Spree's event bus and Webhooks 2.0 — `Spree::Events` publication, `Spree::Subscriber` DSL with `subscribes_to` and `on`, wildcard matching, lifecycle events (`{model}.created/.updated/.deleted` via `publishes_lifecycle_events`), the canonical event catalog (order.*, payment.*, shipment.*, product.*), Webhooks 2.0 endpoints, HMAC-SHA256 signing (`X-Spree-Webhook-Signature`), exponential-backoff retries, and Sidekiq job orchestration. Use when wiring event-driven business logic, building webhook consumers, or replacing ActiveSupport callback chains.
tools
Cross-cutting Spree development patterns — the customization preference hierarchy (Events > Webhooks > Dependencies > Decorators), `Spree::Dependencies` service-object swapping, the `_decorator.rb` + `prepend` + `self.prepended` idiom, idempotent subscribers and webhook receivers, multi-store scoping discipline, prefixed IDs, calculator polymorphism (shipping/promotion/tax share the base), service-object composition with `dry-monads` or simple results, why to avoid `class_eval` reopening and Deface, and Spree-on-Rails idioms (Hotwire/Turbo Stimulus, ActiveStorage, Action Cable, Sidekiq). Use when designing the architecture of a Spree extension or solving cross-cutting concerns.