From shopify-design
Build Shopify apps — Remix framework, App Bridge, OAuth, session tokens, webhooks, billing API, and extension development. Use when creating Shopify apps, building embedded apps, implementing Shopify OAuth, working with App Bridge, creating theme extensions, or building checkout extensions. Triggers: "shopify app", "app bridge", "shopify remix", "embedded app", "shopify oauth", "checkout extension", "theme extension".
How this skill is triggered — by the user, by Claude, or both
Slash command
/shopify-design:shopify-app-devThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Build embedded Shopify apps using the Remix framework and Shopify App CLI.
Build embedded Shopify apps using the Remix framework and Shopify App CLI.
npm init @shopify/app@latest my-app
cd my-app
npm run dev
app/
├── routes/
│ ├── app._index.jsx # Home page
│ ├── app.products.jsx # Products page
│ └── webhooks.jsx # Webhook handlers
├── shopify.server.js # Shopify session/auth config
└── entry.server.jsx
Shopify handles OAuth via @shopify/shopify-app-remix:
// shopify.server.js
import { shopifyApp } from "@shopify/shopify-app-remix/server";
import { PrismaSessionStorage } from "@shopify/shopify-app-session-storage-prisma";
export const shopify = shopifyApp({
apiKey: process.env.SHOPIFY_API_KEY,
apiSecretKey: process.env.SHOPIFY_API_SECRET,
scopes: ["read_products", "write_products", "read_orders"],
appUrl: process.env.SHOPIFY_APP_URL,
sessionStorage: new PrismaSessionStorage(prisma),
});
// In a route loader
export async function loader({ request }) {
const { admin } = await shopify.authenticate.admin(request);
const response = await admin.graphql(`
query {
products(first: 10) {
edges {
node { id title }
}
}
}
`);
const data = await response.json();
return json(data.data.products);
}
// webhooks.jsx
export const action = async ({ request }) => {
const { topic, shop, payload } = await shopify.authenticate.webhook(request);
switch(topic) {
case "ORDERS_CREATE":
await processNewOrder(payload);
break;
case "PRODUCTS_UPDATE":
await syncProduct(payload);
break;
}
return new Response();
};
// In a React component
import { useAppBridge } from "@shopify/app-bridge-react";
import { Toast, Modal } from "@shopify/polaris";
function ProductsPage() {
const shopify = useAppBridge();
const showToast = () => {
shopify.toast.show("Products saved!", { duration: 3000 });
};
return <Button onClick={showToast}>Save</Button>;
}
// Request subscription
const billingCheck = await shopify.billing.require({
request,
plans: [{
name: "Pro Plan",
amount: 29.99,
currencyCode: "USD",
interval: BillingInterval.Every30Days,
}],
onFailure: async () => shopify.billing.request({ request, plan: "Pro Plan" })
});
# Add theme extension to app
shopify app generate extension --type theme_app_extension
# Extension file structure
extensions/my-extension/
├── blocks/
│ └── my-block.liquid # Custom block for themes
├── assets/
│ └── custom.css
└── shopify.extension.toml
npx claudepluginhub vincent-laroche/hairsolutionsco-ai-toolkit --plugin shopify-designCreates bite-sized, testable implementation plans from specs or requirements, with file structure and task decomposition. Activates before coding multi-step tasks.