aeo-optimization
AI Engine Optimization - semantic triples, page templates, content clusters for AI citations
Shopify app development - Remix, Admin API, checkout extensions
$ npx -y skills add alinaqi/maggy --skill shopify-apps --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/shopify-appsContext preview
The summary Claude sees to decide when to auto-load this skill.
Shopify app development - Remix, Admin API, checkout extensions
name: shopify-apps description: Shopify app development - Remix, Admin API, checkout extensions when-to-use: When building Shopify apps or extensions user-invocable: false effort: medium
For building Shopify apps using Remix, the Shopify App framework, and checkout UI extensions.
**Sources:** [Shopify Dev Docs](https://shopify.dev/docs/apps) | [Shopify CLI](https://shopify.dev/docs/apps/tools/cli) | [Admin API](https://shopify.dev/docs/api/admin-graphql)
---
# 1. Shopify Partner Account (free) # Sign up at: https://partners.shopify.com # 2. Development Store # Create in Partner Dashboard → Stores → Add store → Development store # 3. Shopify CLI npm install -g @shopify/cli # 4. Node.js 18.20+ or 20.10+ node --version
1. Create Partner account at partners.shopify.com 2. Create a development store for testing 3. Create an app in Partner Dashboard → Apps → Create app 4. Note your API key and API secret
---
# Create new Shopify app with Remix shopify app init # Answer prompts: # - App name # - Template: Remix (recommended) # - Language: JavaScript or TypeScript # Start development cd your-app-name shopify app dev
shopify-app/ ├── app/ │ ├── routes/ │ │ ├── app._index/ # Main app page │ │ │ └── route.jsx │ │ ├── app.jsx # App layout with Polaris │ │ ├── auth.$.jsx # Auth catch-all │ │ ├── auth.login/ # Login page │ │ │ └── route.jsx │ │ ├── webhooks.app.uninstalled.jsx │ │ ├── webhooks.app.scopes_update.jsx │ │ └── webhooks.gdpr.jsx # GDPR compliance (REQUIRED) │ ├── shopify.server.js # Shopify app config │ ├── db.server.js # Prisma client │ └── entry.server.jsx ├── extensions/ # Checkout/theme extensions │ └── my-extension/ │ ├── src/ │ │ └── index.tsx │ ├── shopify.extension.toml │ └── package.json ├── prisma/ │ └── schema.prisma # Session storage ├── shopify.app.toml # App configuration ├── package.json └── vite.config.js
---
# App configuration - managed by Shopify CLI client_id = "your-api-key" name = "Your App Name" handle = "your-app-handle" application_url = "https://your-app.onrender.com" embedded = true [webhooks] api_version = "2025-01" # Required: App lifecycle webhooks [[webhooks.subscriptions]] topics = ["app/uninstalled"] uri = "/webhooks/app/uninstalled" [[webhooks.subscriptions]] topics = ["app/scopes_update"] uri = "/webhooks/app/scopes_update" # Required: GDPR compliance webhooks [[webhooks.subscriptions]] compliance_topics = [ "customers/data_request", "customers/redact", "shop/redact", ] uri = "/webhooks/gdpr" [access_scopes] scopes = "read_products,write_products" [auth] redirect_urls = [ "https://your-app.onrender.com/auth/callback", "https://your-app.onrender.com/auth/shopify/callback", ] [pos] embedded = false [build] dev_store_url = "your-dev-store.myshopify.com" automatically_update_urls_on_dev = true
import "@shopify/shopify-app-remix/adapters/node";
import {
ApiVersion,
AppDistribution,
shopifyApp,
} from "@shopify/shopify-app-remix/server";
import { PrismaSessionStorage } from "@shopify/shopify-app-session-storage-prisma";
import { prisma } from "./db.server";
const shopify = shopifyApp({
apiKey: process.env.SHOPIFY_API_KEY,
apiSecretKey: process.env.SHOPIFY_API_SECRET || "",
apiVersion: ApiVersion.January25,
scopes: process.env.SCOPES?.split(","),
appUrl: process.env.SHOPIFY_APP_URL || "",
authPathPrefix: "/auth",
sessionStorage: new PrismaSessionStorage(prisma),
distribution: AppDistribution.AppStore,
future: {
unstable_newEmbeddedAuthStrategy: true,
removeRest: true, // Use GraphQL only
},
});
export default shopify;
export const apiVersion = ApiVersion.January25;
export const addDocumentResponseHeaders = shopify.addDocumentResponseHeaders;
export const authenticate = shopify.authenticate;
export const unauthenticated = shopify.unauthenticated;
export const login = shopify.login;
export const registerWebhooks = shopify.registerWebhooks;
export const sessionStorage = shopify.sessionStorage;---
// app/routes/app._index/route.jsx
import { json } from "@remix-run/node";
import { useLoaderData } from "@remix-run/react";
import { authenticate } from "../../shopify.server";
export const loader = async ({ request }) => {
// This authenticates the request and redirects to login if needed
const { admin, session } = await authenticate.admin(request);
// Now you have access to admin API and session
const shop = session.shop;
return json({ shop });
};
export default function Index() {
const { shop } = useLoaderData();
return <div>Connected to: {shop}</div>;
}// app/routes/webhooks.app.uninstalled.jsx
import { authenticate } from "../shopify.server";
import { prisma } from "../db.server";
export const action = async ({ request }) => {
const { shop, topic } = await authenticate.webhook(request);
console.log(`Received ${topic} webhook for ${shop}`);
// Clean up shop data on uninstall
await prisma.session.deleteMany({ where: { shop } });
return new Response(null, { status: 200 });
};---
// app/shopify/adminApi.server.js
export async function getShopId(admin) {
const response = await admin.graphql(`
query getShopId {
shop {
id
name
email
myshopifyDomain
}
}
`);
const data = await response.json();
return data.data?.shop;
}Turn Claude Code into a self-reviewing, test-enforced engineering system that remembers context across sessions — then route work across 13 models from a single dashboard.
Repo: alinaqi/maggy
AI Engine Optimization - semantic triples, page templates, content clusters for AI citations
Claude Code Agent Teams - default team-based development with strict TDD pipeline enforcement
Build AI agents with Pydantic AI (Python) and Claude SDK (Node.js)
Latest AI models reference - Claude, OpenAI, Gemini, Eleven Labs, Replicate
Android Kotlin development with Coroutines, Jetpack Compose, Hilt, and MockK testing