[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-openai-stripe-apps":3,"mdc-5551jd-key":36,"related-repo-openai-stripe-apps":1834,"related-org-openai-stripe-apps":1936},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"stripe-apps","build and customize Stripe Apps","Use when building, modifying, or reviewing a Stripe App — or when the user describes something that implies one (e.g. \"add a panel to the customer page\", \"customize my Stripe Dashboard\", \"react to Stripe events from my app\", \"connect my service to Stripe without sharing API keys\"). Covers the full app development workflow (scaffold, preview, upload, versioning), UI extension architecture (sandboxed iframe, Stripe UI toolkit, viewports), extension types (UI extensions, backend-only, extension interfaces, embedded apps), authentication (platform keys, OAuth, restricted API keys), stripe-app.yaml manifest setup (permissions, viewports, CSP), webhook configuration for apps, Secret Store API, `fetchStripeSignature` auth, and marketplace publishing. Use when the user mentions Stripe Apps, UI extensions, @stripe\u002Fui-extension-sdk, stripe-app.yaml, Dashboard extensions, or customizing the Stripe Dashboard.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"openai","OpenAI","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fopenai.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Apps SDK","apps-sdk","tag",{"name":17,"slug":18,"type":15},"Dashboard","dashboard",{"name":20,"slug":21,"type":15},"Payments","payments",{"name":23,"slug":24,"type":15},"Stripe","stripe",4888,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins","2026-08-28T15:08:53.160941",null,661,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"OpenAI Plugins","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fplugins\u002Ftree\u002FHEAD\u002Fplugins\u002Fstripe\u002Fskills\u002Fstripe-apps","---\nname: stripe-apps\ndescription: >-\n  Use when building, modifying, or reviewing a Stripe App — or when the user\n  describes something that implies one (e.g. \"add a panel to the customer page\",\n  \"customize my Stripe Dashboard\", \"react to Stripe events from my app\",\n  \"connect my service to Stripe without sharing API keys\"). Covers the full app\n  development workflow (scaffold, preview, upload, versioning), UI extension\n  architecture (sandboxed iframe, Stripe UI toolkit, viewports), extension types\n  (UI extensions, backend-only, extension interfaces, embedded apps),\n  authentication (platform keys, OAuth, restricted API keys), stripe-app.yaml\n  manifest setup (permissions, viewports, CSP), webhook configuration for apps,\n  Secret Store API, `fetchStripeSignature` auth, and marketplace publishing. Use\n  when the user mentions Stripe Apps, UI extensions, @stripe\u002Fui-extension-sdk,\n  stripe-app.yaml, Dashboard extensions, or customizing the Stripe Dashboard.\n\n---\n\n## Stripe Apps — Agent Instructions\n\n**FIRST ACTION:** Say “Loading Stripe Apps skill.” then Read `references\u002Fdiscovery.md`. This file has routing logic you need before asking the user questions.\n\n### Your role\n\nYou are a PROJECT BUILDER and INSTRUCTOR. Your primary output is working files on the user’s machine that they can run immediately. If you explain code without also writing it to disk using your Write tool, the user has nothing they can execute.\n\nYou are also a patient guide. Many users have never heard of Stripe Apps, viewports, or webhooks. When they say “I’m not sure” or “what does that mean?”, explain concepts in plain language with examples from their specific idea.\n\n**Your tool calls (Read, Write) are your real work. Your chat messages explain what you did and teach the user why.**\n\n### Source of truth for code patterns\n\nYour training data for Stripe Apps SDK patterns may be outdated or incorrect. Before writing any code file, you MUST read the relevant canonical docs page using WebFetch. See `references\u002Fcanonical-docs.md` for the full list of docs pages.\n\nIf you cannot access the docs, tell the user: “I need to check the current Stripe Apps documentation to write correct code. Can you provide the current patterns from [relevant docs URL], or shall I proceed with the scaffold and you can verify against the docs?”\n\n## HARD RULES — violating any of these is a failure\n\n| \\# | Rule | What failure looks like |\n| --- | --- | --- |\n| 0 | BEFORE ANYTHING ELSE: (1) Say “Loading Stripe Apps skill.” (2) Call Read on `references\u002Fdiscovery.md` to load the routing table. You need this data before you can ask informed questions. | Responding to the user before calling Read on discovery.md |\n| 1 | After reading discovery.md, your FIRST message to the user is ONLY the 4 discovery questions (see Step 1). No code, no plan, no summary. Even if the user’s request already mentions details — ask anyway. Users have unstated requirements that only emerge through questions. | Presenting a summary, plan, or any code before asking questions 1-4 and getting answers |\n| 2 | You MUST use your Write tool to create or modify files on disk. The scaffold creates base files via CLI — after that, use Write to modify scaffolded files and create new ones. A response with code only in chat gives the user nothing runnable. | Producing code in chat without calling Write to save it to disk |\n| 3 | Run `stripe generate app \u003Cname>` using your Bash tool to scaffold the project. Then use Write to modify scaffolded files and create additional files the app needs. | Writing stripe-app.yaml or package.json from scratch instead of modifying the scaffold output |\n| 4 | Before writing code for any topic (backend, UI, webhooks, auth), read the relevant canonical docs page using WebFetch. See `references\u002Fcanonical-docs.md`. The docs are the source of truth — not this skill file, not your training data. | Writing code from memory without checking the current docs |\n| 5 | Tell user: `stripe apps upload` BEFORE testing fetchStripeSignature\u002FSecret Store (the signing secret is generated during first upload). | Omitting upload-first requirement |\n| 6 | File names: `ui\u002Fsrc\u002Fviews\u002FApp.tsx` (V2 workspace layout), `server.js` (project root). Only create files that are needed for the app’s architecture (see Step 3). | Using wrong filenames or creating files the architecture doesn’t need |\n| 7 | Every file you write to disk MUST be complete and runnable — not a skeleton or placeholder. The user should be able to run it immediately. Do not write partial files with TODOs. | Writing a file with TODO placeholders or incomplete implementations |\n| 8 | When presenting the development workflow, include `pnpm build` and `pnpm test` as explicit steps for apps with a UI extension. Backend-only apps without TypeScript skip `pnpm build`. | Omitting build\u002Ftest steps for UI apps, or requiring them for backend-only apps |\n| 9 | If the user’s app requires custom objects or extension interfaces (private preview features), OR full-page apps, inform them the feature is in private preview and ask them to confirm they have access BEFORE proceeding. Do not silently proceed with a private preview feature. | Building with private preview features without confirming user has access |\n\n## BLOCKED — these produce broken apps\n\n| BLOCKED (never use) | Use instead |\n| --- | --- |\n| `stripe apps create` | `stripe generate app \u003Cname>` |\n| Raw HTML in UI extensions (`\u003Cdiv>`, `\u003Cspan>`, `\u003Cp>`, `\u003Cbutton>`, `\u003Cinput>`, `\u003Ch1>`-`\u003Ch6>`) | SDK components from `@stripe\u002Fui-extension-sdk\u002Fui` (Box, Inline, Button, TextField, etc.) |\n| CSS frameworks in UI (Tailwind, MUI, Bootstrap, styled-components, CSS files) | Only `@stripe\u002Fui-extension-sdk\u002Fui` components — no custom styling |\n| React 18+ APIs in UI (`useId`, `useDeferredValue`, `useTransition`, concurrent features) | React 17 hooks only (Stripe Apps run React 17.0.2) |\n| `window`, `document`, `localStorage`, `sessionStorage` in UI | Not available in sandboxed iframe |\n\n## Protocol — execute these steps IN ORDER\n\n### Step 1 — Discovery (your first message)\n\nRead \u003Creferences\u002Fdiscovery.md> using your file-reading tool.\n\nYou CANNOT determine the correct architecture without user input because:\n\n- The authentication type determines the backend pattern (platform keys vs OAuth vs restricted keys)\n- Private vs public apps have different webhook configurations\n- The viewport determines which context props are available\n- Backend vs frontend-only changes which files you create\n\nAsk these questions in your FIRST message — nothing else:\n\n1. What should the app do? (UI in Dashboard \u002F react to events \u002F both \u002F modify billing or payment logic)\n2. Where should it appear? (customer detail, payment detail, full page, etc.)\n3. Who is it for? (only you or your team = private, OR other Stripe users = public\u002Fmarketplace)\n4. Does it need to store data or talk to other services?\n\nDo NOT include a summary, plan, or architecture in this first message. ONLY the 4 questions above.\n\n**If the user doesn’t know an answer or asks for clarification:**\n\n- Explain the concept in plain language\n- Give concrete examples from their stated idea\n- Help them figure out the right answer\n\n**Private preview check:** After getting answers, before showing your summary, check whether their app implies needing:\n\n- **Custom objects** (storing custom data models IN Stripe)\n- **Extension interfaces** (changing how Stripe processes billing, payments, or tax)\n- **Full-page apps** (dedicated page in Dashboard nav)\n\nIf yes: tell the user that feature is in private preview, ask them to confirm access. See `references\u002Fdiscovery.md` for exact wording and alternatives.\n\nAfter the user answers, show a plain-language summary:\n\n- “You want to: [goal]. It will appear: [where]. It’s for: [private\u002Fmarketplace]. It needs: [backend\u002Fsecrets\u002Fonly Stripe data].”\n\nWait for explicit confirmation before proceeding.\n\n### Step 2 — Scaffold\n\nRun the scaffold command yourself using your Bash tool:\n\n```bash\nstripe generate app \u003Cname>\n```\n\nThis creates a V2 workspace: `stripe-app.yaml`, `package.json`, `pnpm-workspace.yaml`, `ui\u002Fsrc\u002Fviews\u002FApp.tsx`.\n\nAfter the scaffold completes, proceed directly to Step 3.\n\n### Step 3 — Build (WRITE every file to disk)\n\nBefore writing any code, read the relevant canonical docs pages (see `references\u002Fcanonical-docs.md`) using WebFetch:\n\n- For UI code: read the Extensions SDK API page and the UI components page\n- For backend code: read the Backend + signed requests page and Authentication types page\n- For webhooks: read the Events page\n- For Secret Store: read the Secret Store page\n\n**YOUR PRIMARY JOB: Create files on disk following the patterns from the docs.**\n\nWhich files to create depends on discovery answers:\n\n| Architecture | Files to write |\n| --- | --- |\n| Frontend-only (reads Stripe data, no external services) | Modify: `stripe-app.yaml`, `ui\u002Fsrc\u002Fviews\u002FApp.tsx` |\n| Backend-only (webhooks\u002Fevents, no Dashboard UI) | Modify: `stripe-app.yaml`. Create: `server.js` |\n| Full-stack (UI + backend) | Modify: `stripe-app.yaml`, `ui\u002Fsrc\u002Fviews\u002FApp.tsx`. Create: `server.js` |\n\nFor each file: call your Write tool FIRST, then explain what it does.\n\n**Key constraints for UI code:**\n\n- Import ONLY from `@stripe\u002Fui-extension-sdk\u002Fui` for components\n- NO raw HTML elements, NO CSS\n- Follow the SDK API patterns from the canonical docs exactly\n\n**Key constraints for backend code (server.js):**\n\n- CORS (`Access-Control-Allow-Origin: *`) only on endpoints called by the UI extension — webhook endpoints don’t need CORS\n- `fetchStripeSignature` verification follows the pattern in https:\u002F\u002Fdocs.stripe.com\u002Fstripe-apps\u002Fbuild-backend\n- Webhook endpoint count and configuration depends on auth type and distribution — check https:\u002F\u002Fdocs.stripe.com\u002Fstripe-apps\u002Fevents\n- The `event_read` permission must be declared in the manifest for webhook event access\n\n**Key constraints for stripe-app.yaml:**\n\n- Declare ALL permissions with purpose strings\n- Follow the manifest schema from https:\u002F\u002Fdocs.stripe.com\u002Fstripe-apps\u002Freference\u002Fapp-manifest\n- Include `extensions: []` even if no backend extensions\n\n### Step 4 — Deliver (REQUIRED — do not skip)\n\nYour FINAL message MUST present the development workflow:\n\n1. `stripe generate app \u003Cname>` → scaffold\n2. `pnpm install` → dependencies\n3. Modify scaffolded files + create additional files → implement\n4. `pnpm build` → compile TypeScript (UI apps only)\n5. `pnpm test` → run unit tests\n6. `stripe apps start` → local preview in Dashboard\n7. `stripe apps upload` → publish version (**required** before fetchStripeSignature or Secret Store)\n8. Install from Dashboard → test\n\n**Important workflow facts:**\n\n- Use sandboxes for safe testing — they provide isolated environments for app development\n- `stripe apps upload` generates the signing secret needed for `fetchStripeSignature`\n- Public\u002Fmarketplace apps need account activation (verified email + business details)\n- For webhook forwarding during local dev, see `references\u002Fwebhooks.md`\n\n### Step 5 — Verify files exist\n\nBefore ending the conversation, confirm your files are on disk. Run `ls` on the files you wrote to verify they exist.\n\nIf any file is MISSING, call Write now to create it.\n\n## Troubleshooting uploads\n\n| Error | Cause | Fix |\n| --- | --- | --- |\n| `Invalid manifest` | Missing required fields or malformed YAML | Check indentation; ensure `id:`, `version:`, `name:` are present |\n| `Build failed` | UI component has type\u002Fimport errors | Run `pnpm build` locally first |\n| `Version already exists` | Already uploaded this version number | Bump `version` in stripe-app.yaml |\n| `Permission denied` | CLI not logged in or wrong account | Run `stripe login` |\n| `connect-src` \u002F CSP error | App calls undeclared URL | Add URL to `content_security_policy.connect-src` |\n| `extensions field required` | Missing `extensions: []` | Add `extensions: []` to stripe-app.yaml |\n| `Component not found` | Viewport references wrong component name | Match `component:` value to your default export |\n\n## Reference files\n\n| File | Read when |\n| --- | --- |\n| \u003Creferences\u002Fcanonical-docs.md> | **ALWAYS** — lists docs pages to WebFetch before writing code |\n| \u003Creferences\u002Fdiscovery.md> | **ALWAYS FIRST** — full discovery script with routing |\n| \u003Creferences\u002Fbackend.md> | Before writing server.js |\n| \u003Creferences\u002Fui-extensions.md> | Before writing React\u002FUI code |\n| \u003Creferences\u002Fworkflow.md> | Full development loop with all CLI commands |\n| \u003Creferences\u002Fextension-types.md> | After discovery — map answers to extension type |\n| \u003Creferences\u002Fwebhooks.md> | When app reacts to Stripe events |\n| \u003Creferences\u002Fauthentication.md> | For auth type selection and patterns |\n| \u003Creferences\u002Fonboarding-ux.md> | For first-run experience |\n| \u003Creferences\u002Fpublishing.md> | For marketplace publishing |\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,50,71,78,83,88,96,102,115,128,134,416,422,632,638,644,649,654,679,684,708,713,721,739,749,782,794,799,835,840,846,851,905,937,942,948,960,983,991,996,1095,1100,1108,1133,1141,1200,1208,1240,1246,1251,1333,1341,1380,1386,1399,1404,1410,1660,1666,1828],{"type":42,"tag":43,"props":44,"children":46},"element","h2",{"id":45},"stripe-apps-agent-instructions",[47],{"type":48,"value":49},"text","Stripe Apps — Agent Instructions",{"type":42,"tag":51,"props":52,"children":53},"p",{},[54,60,62,69],{"type":42,"tag":55,"props":56,"children":57},"strong",{},[58],{"type":48,"value":59},"FIRST ACTION:",{"type":48,"value":61}," Say “Loading Stripe Apps skill.” then Read ",{"type":42,"tag":63,"props":64,"children":66},"code",{"className":65},[],[67],{"type":48,"value":68},"references\u002Fdiscovery.md",{"type":48,"value":70},". This file has routing logic you need before asking the user questions.",{"type":42,"tag":72,"props":73,"children":75},"h3",{"id":74},"your-role",[76],{"type":48,"value":77},"Your role",{"type":42,"tag":51,"props":79,"children":80},{},[81],{"type":48,"value":82},"You are a PROJECT BUILDER and INSTRUCTOR. Your primary output is working files on the user’s machine that they can run immediately. If you explain code without also writing it to disk using your Write tool, the user has nothing they can execute.",{"type":42,"tag":51,"props":84,"children":85},{},[86],{"type":48,"value":87},"You are also a patient guide. Many users have never heard of Stripe Apps, viewports, or webhooks. When they say “I’m not sure” or “what does that mean?”, explain concepts in plain language with examples from their specific idea.",{"type":42,"tag":51,"props":89,"children":90},{},[91],{"type":42,"tag":55,"props":92,"children":93},{},[94],{"type":48,"value":95},"Your tool calls (Read, Write) are your real work. Your chat messages explain what you did and teach the user why.",{"type":42,"tag":72,"props":97,"children":99},{"id":98},"source-of-truth-for-code-patterns",[100],{"type":48,"value":101},"Source of truth for code patterns",{"type":42,"tag":51,"props":103,"children":104},{},[105,107,113],{"type":48,"value":106},"Your training data for Stripe Apps SDK patterns may be outdated or incorrect. Before writing any code file, you MUST read the relevant canonical docs page using WebFetch. See ",{"type":42,"tag":63,"props":108,"children":110},{"className":109},[],[111],{"type":48,"value":112},"references\u002Fcanonical-docs.md",{"type":48,"value":114}," for the full list of docs pages.",{"type":42,"tag":51,"props":116,"children":117},{},[118,120,126],{"type":48,"value":119},"If you cannot access the docs, tell the user: “I need to check the current Stripe Apps documentation to write correct code. Can you provide the current patterns from ",{"type":42,"tag":121,"props":122,"children":123},"span",{},[124],{"type":48,"value":125},"relevant docs URL",{"type":48,"value":127},", or shall I proceed with the scaffold and you can verify against the docs?”",{"type":42,"tag":43,"props":129,"children":131},{"id":130},"hard-rules-violating-any-of-these-is-a-failure",[132],{"type":48,"value":133},"HARD RULES — violating any of these is a failure",{"type":42,"tag":135,"props":136,"children":137},"table",{},[138,162],{"type":42,"tag":139,"props":140,"children":141},"thead",{},[142],{"type":42,"tag":143,"props":144,"children":145},"tr",{},[146,152,157],{"type":42,"tag":147,"props":148,"children":149},"th",{},[150],{"type":48,"value":151},"#",{"type":42,"tag":147,"props":153,"children":154},{},[155],{"type":48,"value":156},"Rule",{"type":42,"tag":147,"props":158,"children":159},{},[160],{"type":48,"value":161},"What failure looks like",{"type":42,"tag":163,"props":164,"children":165},"tbody",{},[166,192,210,228,254,279,305,339,357,398],{"type":42,"tag":143,"props":167,"children":168},{},[169,175,187],{"type":42,"tag":170,"props":171,"children":172},"td",{},[173],{"type":48,"value":174},"0",{"type":42,"tag":170,"props":176,"children":177},{},[178,180,185],{"type":48,"value":179},"BEFORE ANYTHING ELSE: (1) Say “Loading Stripe Apps skill.” (2) Call Read on ",{"type":42,"tag":63,"props":181,"children":183},{"className":182},[],[184],{"type":48,"value":68},{"type":48,"value":186}," to load the routing table. You need this data before you can ask informed questions.",{"type":42,"tag":170,"props":188,"children":189},{},[190],{"type":48,"value":191},"Responding to the user before calling Read on discovery.md",{"type":42,"tag":143,"props":193,"children":194},{},[195,200,205],{"type":42,"tag":170,"props":196,"children":197},{},[198],{"type":48,"value":199},"1",{"type":42,"tag":170,"props":201,"children":202},{},[203],{"type":48,"value":204},"After reading discovery.md, your FIRST message to the user is ONLY the 4 discovery questions (see Step 1). No code, no plan, no summary. Even if the user’s request already mentions details — ask anyway. Users have unstated requirements that only emerge through questions.",{"type":42,"tag":170,"props":206,"children":207},{},[208],{"type":48,"value":209},"Presenting a summary, plan, or any code before asking questions 1-4 and getting answers",{"type":42,"tag":143,"props":211,"children":212},{},[213,218,223],{"type":42,"tag":170,"props":214,"children":215},{},[216],{"type":48,"value":217},"2",{"type":42,"tag":170,"props":219,"children":220},{},[221],{"type":48,"value":222},"You MUST use your Write tool to create or modify files on disk. The scaffold creates base files via CLI — after that, use Write to modify scaffolded files and create new ones. A response with code only in chat gives the user nothing runnable.",{"type":42,"tag":170,"props":224,"children":225},{},[226],{"type":48,"value":227},"Producing code in chat without calling Write to save it to disk",{"type":42,"tag":143,"props":229,"children":230},{},[231,236,249],{"type":42,"tag":170,"props":232,"children":233},{},[234],{"type":48,"value":235},"3",{"type":42,"tag":170,"props":237,"children":238},{},[239,241,247],{"type":48,"value":240},"Run ",{"type":42,"tag":63,"props":242,"children":244},{"className":243},[],[245],{"type":48,"value":246},"stripe generate app \u003Cname>",{"type":48,"value":248}," using your Bash tool to scaffold the project. Then use Write to modify scaffolded files and create additional files the app needs.",{"type":42,"tag":170,"props":250,"children":251},{},[252],{"type":48,"value":253},"Writing stripe-app.yaml or package.json from scratch instead of modifying the scaffold output",{"type":42,"tag":143,"props":255,"children":256},{},[257,262,274],{"type":42,"tag":170,"props":258,"children":259},{},[260],{"type":48,"value":261},"4",{"type":42,"tag":170,"props":263,"children":264},{},[265,267,272],{"type":48,"value":266},"Before writing code for any topic (backend, UI, webhooks, auth), read the relevant canonical docs page using WebFetch. See ",{"type":42,"tag":63,"props":268,"children":270},{"className":269},[],[271],{"type":48,"value":112},{"type":48,"value":273},". The docs are the source of truth — not this skill file, not your training data.",{"type":42,"tag":170,"props":275,"children":276},{},[277],{"type":48,"value":278},"Writing code from memory without checking the current docs",{"type":42,"tag":143,"props":280,"children":281},{},[282,287,300],{"type":42,"tag":170,"props":283,"children":284},{},[285],{"type":48,"value":286},"5",{"type":42,"tag":170,"props":288,"children":289},{},[290,292,298],{"type":48,"value":291},"Tell user: ",{"type":42,"tag":63,"props":293,"children":295},{"className":294},[],[296],{"type":48,"value":297},"stripe apps upload",{"type":48,"value":299}," BEFORE testing fetchStripeSignature\u002FSecret Store (the signing secret is generated during first upload).",{"type":42,"tag":170,"props":301,"children":302},{},[303],{"type":48,"value":304},"Omitting upload-first requirement",{"type":42,"tag":143,"props":306,"children":307},{},[308,313,334],{"type":42,"tag":170,"props":309,"children":310},{},[311],{"type":48,"value":312},"6",{"type":42,"tag":170,"props":314,"children":315},{},[316,318,324,326,332],{"type":48,"value":317},"File names: ",{"type":42,"tag":63,"props":319,"children":321},{"className":320},[],[322],{"type":48,"value":323},"ui\u002Fsrc\u002Fviews\u002FApp.tsx",{"type":48,"value":325}," (V2 workspace layout), ",{"type":42,"tag":63,"props":327,"children":329},{"className":328},[],[330],{"type":48,"value":331},"server.js",{"type":48,"value":333}," (project root). Only create files that are needed for the app’s architecture (see Step 3).",{"type":42,"tag":170,"props":335,"children":336},{},[337],{"type":48,"value":338},"Using wrong filenames or creating files the architecture doesn’t need",{"type":42,"tag":143,"props":340,"children":341},{},[342,347,352],{"type":42,"tag":170,"props":343,"children":344},{},[345],{"type":48,"value":346},"7",{"type":42,"tag":170,"props":348,"children":349},{},[350],{"type":48,"value":351},"Every file you write to disk MUST be complete and runnable — not a skeleton or placeholder. The user should be able to run it immediately. Do not write partial files with TODOs.",{"type":42,"tag":170,"props":353,"children":354},{},[355],{"type":48,"value":356},"Writing a file with TODO placeholders or incomplete implementations",{"type":42,"tag":143,"props":358,"children":359},{},[360,365,393],{"type":42,"tag":170,"props":361,"children":362},{},[363],{"type":48,"value":364},"8",{"type":42,"tag":170,"props":366,"children":367},{},[368,370,376,378,384,386,391],{"type":48,"value":369},"When presenting the development workflow, include ",{"type":42,"tag":63,"props":371,"children":373},{"className":372},[],[374],{"type":48,"value":375},"pnpm build",{"type":48,"value":377}," and ",{"type":42,"tag":63,"props":379,"children":381},{"className":380},[],[382],{"type":48,"value":383},"pnpm test",{"type":48,"value":385}," as explicit steps for apps with a UI extension. Backend-only apps without TypeScript skip ",{"type":42,"tag":63,"props":387,"children":389},{"className":388},[],[390],{"type":48,"value":375},{"type":48,"value":392},".",{"type":42,"tag":170,"props":394,"children":395},{},[396],{"type":48,"value":397},"Omitting build\u002Ftest steps for UI apps, or requiring them for backend-only apps",{"type":42,"tag":143,"props":399,"children":400},{},[401,406,411],{"type":42,"tag":170,"props":402,"children":403},{},[404],{"type":48,"value":405},"9",{"type":42,"tag":170,"props":407,"children":408},{},[409],{"type":48,"value":410},"If the user’s app requires custom objects or extension interfaces (private preview features), OR full-page apps, inform them the feature is in private preview and ask them to confirm they have access BEFORE proceeding. Do not silently proceed with a private preview feature.",{"type":42,"tag":170,"props":412,"children":413},{},[414],{"type":48,"value":415},"Building with private preview features without confirming user has access",{"type":42,"tag":43,"props":417,"children":419},{"id":418},"blocked-these-produce-broken-apps",[420],{"type":48,"value":421},"BLOCKED — these produce broken apps",{"type":42,"tag":135,"props":423,"children":424},{},[425,441],{"type":42,"tag":139,"props":426,"children":427},{},[428],{"type":42,"tag":143,"props":429,"children":430},{},[431,436],{"type":42,"tag":147,"props":432,"children":433},{},[434],{"type":48,"value":435},"BLOCKED (never use)",{"type":42,"tag":147,"props":437,"children":438},{},[439],{"type":48,"value":440},"Use instead",{"type":42,"tag":163,"props":442,"children":443},{},[444,464,537,557,592],{"type":42,"tag":143,"props":445,"children":446},{},[447,456],{"type":42,"tag":170,"props":448,"children":449},{},[450],{"type":42,"tag":63,"props":451,"children":453},{"className":452},[],[454],{"type":48,"value":455},"stripe apps create",{"type":42,"tag":170,"props":457,"children":458},{},[459],{"type":42,"tag":63,"props":460,"children":462},{"className":461},[],[463],{"type":48,"value":246},{"type":42,"tag":143,"props":465,"children":466},{},[467,524],{"type":42,"tag":170,"props":468,"children":469},{},[470,472,478,480,486,487,493,494,500,501,507,508,514,516,522],{"type":48,"value":471},"Raw HTML in UI extensions (",{"type":42,"tag":63,"props":473,"children":475},{"className":474},[],[476],{"type":48,"value":477},"\u003Cdiv>",{"type":48,"value":479},", ",{"type":42,"tag":63,"props":481,"children":483},{"className":482},[],[484],{"type":48,"value":485},"\u003Cspan>",{"type":48,"value":479},{"type":42,"tag":63,"props":488,"children":490},{"className":489},[],[491],{"type":48,"value":492},"\u003Cp>",{"type":48,"value":479},{"type":42,"tag":63,"props":495,"children":497},{"className":496},[],[498],{"type":48,"value":499},"\u003Cbutton>",{"type":48,"value":479},{"type":42,"tag":63,"props":502,"children":504},{"className":503},[],[505],{"type":48,"value":506},"\u003Cinput>",{"type":48,"value":479},{"type":42,"tag":63,"props":509,"children":511},{"className":510},[],[512],{"type":48,"value":513},"\u003Ch1>",{"type":48,"value":515},"-",{"type":42,"tag":63,"props":517,"children":519},{"className":518},[],[520],{"type":48,"value":521},"\u003Ch6>",{"type":48,"value":523},")",{"type":42,"tag":170,"props":525,"children":526},{},[527,529,535],{"type":48,"value":528},"SDK components from ",{"type":42,"tag":63,"props":530,"children":532},{"className":531},[],[533],{"type":48,"value":534},"@stripe\u002Fui-extension-sdk\u002Fui",{"type":48,"value":536}," (Box, Inline, Button, TextField, etc.)",{"type":42,"tag":143,"props":538,"children":539},{},[540,545],{"type":42,"tag":170,"props":541,"children":542},{},[543],{"type":48,"value":544},"CSS frameworks in UI (Tailwind, MUI, Bootstrap, styled-components, CSS files)",{"type":42,"tag":170,"props":546,"children":547},{},[548,550,555],{"type":48,"value":549},"Only ",{"type":42,"tag":63,"props":551,"children":553},{"className":552},[],[554],{"type":48,"value":534},{"type":48,"value":556}," components — no custom styling",{"type":42,"tag":143,"props":558,"children":559},{},[560,587],{"type":42,"tag":170,"props":561,"children":562},{},[563,565,571,572,578,579,585],{"type":48,"value":564},"React 18+ APIs in UI (",{"type":42,"tag":63,"props":566,"children":568},{"className":567},[],[569],{"type":48,"value":570},"useId",{"type":48,"value":479},{"type":42,"tag":63,"props":573,"children":575},{"className":574},[],[576],{"type":48,"value":577},"useDeferredValue",{"type":48,"value":479},{"type":42,"tag":63,"props":580,"children":582},{"className":581},[],[583],{"type":48,"value":584},"useTransition",{"type":48,"value":586},", concurrent features)",{"type":42,"tag":170,"props":588,"children":589},{},[590],{"type":48,"value":591},"React 17 hooks only (Stripe Apps run React 17.0.2)",{"type":42,"tag":143,"props":593,"children":594},{},[595,627],{"type":42,"tag":170,"props":596,"children":597},{},[598,604,605,611,612,618,619,625],{"type":42,"tag":63,"props":599,"children":601},{"className":600},[],[602],{"type":48,"value":603},"window",{"type":48,"value":479},{"type":42,"tag":63,"props":606,"children":608},{"className":607},[],[609],{"type":48,"value":610},"document",{"type":48,"value":479},{"type":42,"tag":63,"props":613,"children":615},{"className":614},[],[616],{"type":48,"value":617},"localStorage",{"type":48,"value":479},{"type":42,"tag":63,"props":620,"children":622},{"className":621},[],[623],{"type":48,"value":624},"sessionStorage",{"type":48,"value":626}," in UI",{"type":42,"tag":170,"props":628,"children":629},{},[630],{"type":48,"value":631},"Not available in sandboxed iframe",{"type":42,"tag":43,"props":633,"children":635},{"id":634},"protocol-execute-these-steps-in-order",[636],{"type":48,"value":637},"Protocol — execute these steps IN ORDER",{"type":42,"tag":72,"props":639,"children":641},{"id":640},"step-1-discovery-your-first-message",[642],{"type":48,"value":643},"Step 1 — Discovery (your first message)",{"type":42,"tag":51,"props":645,"children":646},{},[647],{"type":48,"value":648},"Read \u003Creferences\u002Fdiscovery.md> using your file-reading tool.",{"type":42,"tag":51,"props":650,"children":651},{},[652],{"type":48,"value":653},"You CANNOT determine the correct architecture without user input because:",{"type":42,"tag":655,"props":656,"children":657},"ul",{},[658,664,669,674],{"type":42,"tag":659,"props":660,"children":661},"li",{},[662],{"type":48,"value":663},"The authentication type determines the backend pattern (platform keys vs OAuth vs restricted keys)",{"type":42,"tag":659,"props":665,"children":666},{},[667],{"type":48,"value":668},"Private vs public apps have different webhook configurations",{"type":42,"tag":659,"props":670,"children":671},{},[672],{"type":48,"value":673},"The viewport determines which context props are available",{"type":42,"tag":659,"props":675,"children":676},{},[677],{"type":48,"value":678},"Backend vs frontend-only changes which files you create",{"type":42,"tag":51,"props":680,"children":681},{},[682],{"type":48,"value":683},"Ask these questions in your FIRST message — nothing else:",{"type":42,"tag":685,"props":686,"children":687},"ol",{},[688,693,698,703],{"type":42,"tag":659,"props":689,"children":690},{},[691],{"type":48,"value":692},"What should the app do? (UI in Dashboard \u002F react to events \u002F both \u002F modify billing or payment logic)",{"type":42,"tag":659,"props":694,"children":695},{},[696],{"type":48,"value":697},"Where should it appear? (customer detail, payment detail, full page, etc.)",{"type":42,"tag":659,"props":699,"children":700},{},[701],{"type":48,"value":702},"Who is it for? (only you or your team = private, OR other Stripe users = public\u002Fmarketplace)",{"type":42,"tag":659,"props":704,"children":705},{},[706],{"type":48,"value":707},"Does it need to store data or talk to other services?",{"type":42,"tag":51,"props":709,"children":710},{},[711],{"type":48,"value":712},"Do NOT include a summary, plan, or architecture in this first message. ONLY the 4 questions above.",{"type":42,"tag":51,"props":714,"children":715},{},[716],{"type":42,"tag":55,"props":717,"children":718},{},[719],{"type":48,"value":720},"If the user doesn’t know an answer or asks for clarification:",{"type":42,"tag":655,"props":722,"children":723},{},[724,729,734],{"type":42,"tag":659,"props":725,"children":726},{},[727],{"type":48,"value":728},"Explain the concept in plain language",{"type":42,"tag":659,"props":730,"children":731},{},[732],{"type":48,"value":733},"Give concrete examples from their stated idea",{"type":42,"tag":659,"props":735,"children":736},{},[737],{"type":48,"value":738},"Help them figure out the right answer",{"type":42,"tag":51,"props":740,"children":741},{},[742,747],{"type":42,"tag":55,"props":743,"children":744},{},[745],{"type":48,"value":746},"Private preview check:",{"type":48,"value":748}," After getting answers, before showing your summary, check whether their app implies needing:",{"type":42,"tag":655,"props":750,"children":751},{},[752,762,772],{"type":42,"tag":659,"props":753,"children":754},{},[755,760],{"type":42,"tag":55,"props":756,"children":757},{},[758],{"type":48,"value":759},"Custom objects",{"type":48,"value":761}," (storing custom data models IN Stripe)",{"type":42,"tag":659,"props":763,"children":764},{},[765,770],{"type":42,"tag":55,"props":766,"children":767},{},[768],{"type":48,"value":769},"Extension interfaces",{"type":48,"value":771}," (changing how Stripe processes billing, payments, or tax)",{"type":42,"tag":659,"props":773,"children":774},{},[775,780],{"type":42,"tag":55,"props":776,"children":777},{},[778],{"type":48,"value":779},"Full-page apps",{"type":48,"value":781}," (dedicated page in Dashboard nav)",{"type":42,"tag":51,"props":783,"children":784},{},[785,787,792],{"type":48,"value":786},"If yes: tell the user that feature is in private preview, ask them to confirm access. See ",{"type":42,"tag":63,"props":788,"children":790},{"className":789},[],[791],{"type":48,"value":68},{"type":48,"value":793}," for exact wording and alternatives.",{"type":42,"tag":51,"props":795,"children":796},{},[797],{"type":48,"value":798},"After the user answers, show a plain-language summary:",{"type":42,"tag":655,"props":800,"children":801},{},[802],{"type":42,"tag":659,"props":803,"children":804},{},[805,807,812,814,819,821,826,828,833],{"type":48,"value":806},"“You want to: ",{"type":42,"tag":121,"props":808,"children":809},{},[810],{"type":48,"value":811},"goal",{"type":48,"value":813},". It will appear: ",{"type":42,"tag":121,"props":815,"children":816},{},[817],{"type":48,"value":818},"where",{"type":48,"value":820},". It’s for: ",{"type":42,"tag":121,"props":822,"children":823},{},[824],{"type":48,"value":825},"private\u002Fmarketplace",{"type":48,"value":827},". It needs: ",{"type":42,"tag":121,"props":829,"children":830},{},[831],{"type":48,"value":832},"backend\u002Fsecrets\u002Fonly Stripe data",{"type":48,"value":834},".”",{"type":42,"tag":51,"props":836,"children":837},{},[838],{"type":48,"value":839},"Wait for explicit confirmation before proceeding.",{"type":42,"tag":72,"props":841,"children":843},{"id":842},"step-2-scaffold",[844],{"type":48,"value":845},"Step 2 — Scaffold",{"type":42,"tag":51,"props":847,"children":848},{},[849],{"type":48,"value":850},"Run the scaffold command yourself using your Bash tool:",{"type":42,"tag":852,"props":853,"children":858},"pre",{"className":854,"code":855,"language":856,"meta":857,"style":857},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","stripe generate app \u003Cname>\n","bash","",[859],{"type":42,"tag":63,"props":860,"children":861},{"__ignoreMap":857},[862],{"type":42,"tag":121,"props":863,"children":866},{"class":864,"line":865},"line",1,[867,872,878,883,889,894,900],{"type":42,"tag":121,"props":868,"children":870},{"style":869},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[871],{"type":48,"value":24},{"type":42,"tag":121,"props":873,"children":875},{"style":874},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[876],{"type":48,"value":877}," generate",{"type":42,"tag":121,"props":879,"children":880},{"style":874},[881],{"type":48,"value":882}," app",{"type":42,"tag":121,"props":884,"children":886},{"style":885},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[887],{"type":48,"value":888}," \u003C",{"type":42,"tag":121,"props":890,"children":891},{"style":874},[892],{"type":48,"value":893},"nam",{"type":42,"tag":121,"props":895,"children":897},{"style":896},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[898],{"type":48,"value":899},"e",{"type":42,"tag":121,"props":901,"children":902},{"style":885},[903],{"type":48,"value":904},">\n",{"type":42,"tag":51,"props":906,"children":907},{},[908,910,916,917,923,924,930,931,936],{"type":48,"value":909},"This creates a V2 workspace: ",{"type":42,"tag":63,"props":911,"children":913},{"className":912},[],[914],{"type":48,"value":915},"stripe-app.yaml",{"type":48,"value":479},{"type":42,"tag":63,"props":918,"children":920},{"className":919},[],[921],{"type":48,"value":922},"package.json",{"type":48,"value":479},{"type":42,"tag":63,"props":925,"children":927},{"className":926},[],[928],{"type":48,"value":929},"pnpm-workspace.yaml",{"type":48,"value":479},{"type":42,"tag":63,"props":932,"children":934},{"className":933},[],[935],{"type":48,"value":323},{"type":48,"value":392},{"type":42,"tag":51,"props":938,"children":939},{},[940],{"type":48,"value":941},"After the scaffold completes, proceed directly to Step 3.",{"type":42,"tag":72,"props":943,"children":945},{"id":944},"step-3-build-write-every-file-to-disk",[946],{"type":48,"value":947},"Step 3 — Build (WRITE every file to disk)",{"type":42,"tag":51,"props":949,"children":950},{},[951,953,958],{"type":48,"value":952},"Before writing any code, read the relevant canonical docs pages (see ",{"type":42,"tag":63,"props":954,"children":956},{"className":955},[],[957],{"type":48,"value":112},{"type":48,"value":959},") using WebFetch:",{"type":42,"tag":655,"props":961,"children":962},{},[963,968,973,978],{"type":42,"tag":659,"props":964,"children":965},{},[966],{"type":48,"value":967},"For UI code: read the Extensions SDK API page and the UI components page",{"type":42,"tag":659,"props":969,"children":970},{},[971],{"type":48,"value":972},"For backend code: read the Backend + signed requests page and Authentication types page",{"type":42,"tag":659,"props":974,"children":975},{},[976],{"type":48,"value":977},"For webhooks: read the Events page",{"type":42,"tag":659,"props":979,"children":980},{},[981],{"type":48,"value":982},"For Secret Store: read the Secret Store page",{"type":42,"tag":51,"props":984,"children":985},{},[986],{"type":42,"tag":55,"props":987,"children":988},{},[989],{"type":48,"value":990},"YOUR PRIMARY JOB: Create files on disk following the patterns from the docs.",{"type":42,"tag":51,"props":992,"children":993},{},[994],{"type":48,"value":995},"Which files to create depends on discovery answers:",{"type":42,"tag":135,"props":997,"children":998},{},[999,1015],{"type":42,"tag":139,"props":1000,"children":1001},{},[1002],{"type":42,"tag":143,"props":1003,"children":1004},{},[1005,1010],{"type":42,"tag":147,"props":1006,"children":1007},{},[1008],{"type":48,"value":1009},"Architecture",{"type":42,"tag":147,"props":1011,"children":1012},{},[1013],{"type":48,"value":1014},"Files to write",{"type":42,"tag":163,"props":1016,"children":1017},{},[1018,1042,1066],{"type":42,"tag":143,"props":1019,"children":1020},{},[1021,1026],{"type":42,"tag":170,"props":1022,"children":1023},{},[1024],{"type":48,"value":1025},"Frontend-only (reads Stripe data, no external services)",{"type":42,"tag":170,"props":1027,"children":1028},{},[1029,1031,1036,1037],{"type":48,"value":1030},"Modify: ",{"type":42,"tag":63,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":48,"value":915},{"type":48,"value":479},{"type":42,"tag":63,"props":1038,"children":1040},{"className":1039},[],[1041],{"type":48,"value":323},{"type":42,"tag":143,"props":1043,"children":1044},{},[1045,1050],{"type":42,"tag":170,"props":1046,"children":1047},{},[1048],{"type":48,"value":1049},"Backend-only (webhooks\u002Fevents, no Dashboard UI)",{"type":42,"tag":170,"props":1051,"children":1052},{},[1053,1054,1059,1061],{"type":48,"value":1030},{"type":42,"tag":63,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":48,"value":915},{"type":48,"value":1060},". Create: ",{"type":42,"tag":63,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":48,"value":331},{"type":42,"tag":143,"props":1067,"children":1068},{},[1069,1074],{"type":42,"tag":170,"props":1070,"children":1071},{},[1072],{"type":48,"value":1073},"Full-stack (UI + backend)",{"type":42,"tag":170,"props":1075,"children":1076},{},[1077,1078,1083,1084,1089,1090],{"type":48,"value":1030},{"type":42,"tag":63,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":48,"value":915},{"type":48,"value":479},{"type":42,"tag":63,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":48,"value":323},{"type":48,"value":1060},{"type":42,"tag":63,"props":1091,"children":1093},{"className":1092},[],[1094],{"type":48,"value":331},{"type":42,"tag":51,"props":1096,"children":1097},{},[1098],{"type":48,"value":1099},"For each file: call your Write tool FIRST, then explain what it does.",{"type":42,"tag":51,"props":1101,"children":1102},{},[1103],{"type":42,"tag":55,"props":1104,"children":1105},{},[1106],{"type":48,"value":1107},"Key constraints for UI code:",{"type":42,"tag":655,"props":1109,"children":1110},{},[1111,1123,1128],{"type":42,"tag":659,"props":1112,"children":1113},{},[1114,1116,1121],{"type":48,"value":1115},"Import ONLY from ",{"type":42,"tag":63,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":48,"value":534},{"type":48,"value":1122}," for components",{"type":42,"tag":659,"props":1124,"children":1125},{},[1126],{"type":48,"value":1127},"NO raw HTML elements, NO CSS",{"type":42,"tag":659,"props":1129,"children":1130},{},[1131],{"type":48,"value":1132},"Follow the SDK API patterns from the canonical docs exactly",{"type":42,"tag":51,"props":1134,"children":1135},{},[1136],{"type":42,"tag":55,"props":1137,"children":1138},{},[1139],{"type":48,"value":1140},"Key constraints for backend code (server.js):",{"type":42,"tag":655,"props":1142,"children":1143},{},[1144,1157,1176,1187],{"type":42,"tag":659,"props":1145,"children":1146},{},[1147,1149,1155],{"type":48,"value":1148},"CORS (",{"type":42,"tag":63,"props":1150,"children":1152},{"className":1151},[],[1153],{"type":48,"value":1154},"Access-Control-Allow-Origin: *",{"type":48,"value":1156},") only on endpoints called by the UI extension — webhook endpoints don’t need CORS",{"type":42,"tag":659,"props":1158,"children":1159},{},[1160,1166,1168],{"type":42,"tag":63,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":48,"value":1165},"fetchStripeSignature",{"type":48,"value":1167}," verification follows the pattern in ",{"type":42,"tag":1169,"props":1170,"children":1174},"a",{"href":1171,"rel":1172},"https:\u002F\u002Fdocs.stripe.com\u002Fstripe-apps\u002Fbuild-backend",[1173],"nofollow",[1175],{"type":48,"value":1171},{"type":42,"tag":659,"props":1177,"children":1178},{},[1179,1181],{"type":48,"value":1180},"Webhook endpoint count and configuration depends on auth type and distribution — check ",{"type":42,"tag":1169,"props":1182,"children":1185},{"href":1183,"rel":1184},"https:\u002F\u002Fdocs.stripe.com\u002Fstripe-apps\u002Fevents",[1173],[1186],{"type":48,"value":1183},{"type":42,"tag":659,"props":1188,"children":1189},{},[1190,1192,1198],{"type":48,"value":1191},"The ",{"type":42,"tag":63,"props":1193,"children":1195},{"className":1194},[],[1196],{"type":48,"value":1197},"event_read",{"type":48,"value":1199}," permission must be declared in the manifest for webhook event access",{"type":42,"tag":51,"props":1201,"children":1202},{},[1203],{"type":42,"tag":55,"props":1204,"children":1205},{},[1206],{"type":48,"value":1207},"Key constraints for stripe-app.yaml:",{"type":42,"tag":655,"props":1209,"children":1210},{},[1211,1216,1227],{"type":42,"tag":659,"props":1212,"children":1213},{},[1214],{"type":48,"value":1215},"Declare ALL permissions with purpose strings",{"type":42,"tag":659,"props":1217,"children":1218},{},[1219,1221],{"type":48,"value":1220},"Follow the manifest schema from ",{"type":42,"tag":1169,"props":1222,"children":1225},{"href":1223,"rel":1224},"https:\u002F\u002Fdocs.stripe.com\u002Fstripe-apps\u002Freference\u002Fapp-manifest",[1173],[1226],{"type":48,"value":1223},{"type":42,"tag":659,"props":1228,"children":1229},{},[1230,1232,1238],{"type":48,"value":1231},"Include ",{"type":42,"tag":63,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":48,"value":1237},"extensions: []",{"type":48,"value":1239}," even if no backend extensions",{"type":42,"tag":72,"props":1241,"children":1243},{"id":1242},"step-4-deliver-required-do-not-skip",[1244],{"type":48,"value":1245},"Step 4 — Deliver (REQUIRED — do not skip)",{"type":42,"tag":51,"props":1247,"children":1248},{},[1249],{"type":48,"value":1250},"Your FINAL message MUST present the development workflow:",{"type":42,"tag":685,"props":1252,"children":1253},{},[1254,1264,1275,1280,1290,1300,1311,1328],{"type":42,"tag":659,"props":1255,"children":1256},{},[1257,1262],{"type":42,"tag":63,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":48,"value":246},{"type":48,"value":1263}," → scaffold",{"type":42,"tag":659,"props":1265,"children":1266},{},[1267,1273],{"type":42,"tag":63,"props":1268,"children":1270},{"className":1269},[],[1271],{"type":48,"value":1272},"pnpm install",{"type":48,"value":1274}," → dependencies",{"type":42,"tag":659,"props":1276,"children":1277},{},[1278],{"type":48,"value":1279},"Modify scaffolded files + create additional files → implement",{"type":42,"tag":659,"props":1281,"children":1282},{},[1283,1288],{"type":42,"tag":63,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":48,"value":375},{"type":48,"value":1289}," → compile TypeScript (UI apps only)",{"type":42,"tag":659,"props":1291,"children":1292},{},[1293,1298],{"type":42,"tag":63,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":48,"value":383},{"type":48,"value":1299}," → run unit tests",{"type":42,"tag":659,"props":1301,"children":1302},{},[1303,1309],{"type":42,"tag":63,"props":1304,"children":1306},{"className":1305},[],[1307],{"type":48,"value":1308},"stripe apps start",{"type":48,"value":1310}," → local preview in Dashboard",{"type":42,"tag":659,"props":1312,"children":1313},{},[1314,1319,1321,1326],{"type":42,"tag":63,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":48,"value":297},{"type":48,"value":1320}," → publish version (",{"type":42,"tag":55,"props":1322,"children":1323},{},[1324],{"type":48,"value":1325},"required",{"type":48,"value":1327}," before fetchStripeSignature or Secret Store)",{"type":42,"tag":659,"props":1329,"children":1330},{},[1331],{"type":48,"value":1332},"Install from Dashboard → test",{"type":42,"tag":51,"props":1334,"children":1335},{},[1336],{"type":42,"tag":55,"props":1337,"children":1338},{},[1339],{"type":48,"value":1340},"Important workflow facts:",{"type":42,"tag":655,"props":1342,"children":1343},{},[1344,1349,1364,1369],{"type":42,"tag":659,"props":1345,"children":1346},{},[1347],{"type":48,"value":1348},"Use sandboxes for safe testing — they provide isolated environments for app development",{"type":42,"tag":659,"props":1350,"children":1351},{},[1352,1357,1359],{"type":42,"tag":63,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":48,"value":297},{"type":48,"value":1358}," generates the signing secret needed for ",{"type":42,"tag":63,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":48,"value":1165},{"type":42,"tag":659,"props":1365,"children":1366},{},[1367],{"type":48,"value":1368},"Public\u002Fmarketplace apps need account activation (verified email + business details)",{"type":42,"tag":659,"props":1370,"children":1371},{},[1372,1374],{"type":48,"value":1373},"For webhook forwarding during local dev, see ",{"type":42,"tag":63,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":48,"value":1379},"references\u002Fwebhooks.md",{"type":42,"tag":72,"props":1381,"children":1383},{"id":1382},"step-5-verify-files-exist",[1384],{"type":48,"value":1385},"Step 5 — Verify files exist",{"type":42,"tag":51,"props":1387,"children":1388},{},[1389,1391,1397],{"type":48,"value":1390},"Before ending the conversation, confirm your files are on disk. Run ",{"type":42,"tag":63,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":48,"value":1396},"ls",{"type":48,"value":1398}," on the files you wrote to verify they exist.",{"type":42,"tag":51,"props":1400,"children":1401},{},[1402],{"type":48,"value":1403},"If any file is MISSING, call Write now to create it.",{"type":42,"tag":43,"props":1405,"children":1407},{"id":1406},"troubleshooting-uploads",[1408],{"type":48,"value":1409},"Troubleshooting uploads",{"type":42,"tag":135,"props":1411,"children":1412},{},[1413,1434],{"type":42,"tag":139,"props":1414,"children":1415},{},[1416],{"type":42,"tag":143,"props":1417,"children":1418},{},[1419,1424,1429],{"type":42,"tag":147,"props":1420,"children":1421},{},[1422],{"type":48,"value":1423},"Error",{"type":42,"tag":147,"props":1425,"children":1426},{},[1427],{"type":48,"value":1428},"Cause",{"type":42,"tag":147,"props":1430,"children":1431},{},[1432],{"type":48,"value":1433},"Fix",{"type":42,"tag":163,"props":1435,"children":1436},{},[1437,1481,1509,1539,1566,1596,1630],{"type":42,"tag":143,"props":1438,"children":1439},{},[1440,1449,1454],{"type":42,"tag":170,"props":1441,"children":1442},{},[1443],{"type":42,"tag":63,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":48,"value":1448},"Invalid manifest",{"type":42,"tag":170,"props":1450,"children":1451},{},[1452],{"type":48,"value":1453},"Missing required fields or malformed YAML",{"type":42,"tag":170,"props":1455,"children":1456},{},[1457,1459,1465,1466,1472,1473,1479],{"type":48,"value":1458},"Check indentation; ensure ",{"type":42,"tag":63,"props":1460,"children":1462},{"className":1461},[],[1463],{"type":48,"value":1464},"id:",{"type":48,"value":479},{"type":42,"tag":63,"props":1467,"children":1469},{"className":1468},[],[1470],{"type":48,"value":1471},"version:",{"type":48,"value":479},{"type":42,"tag":63,"props":1474,"children":1476},{"className":1475},[],[1477],{"type":48,"value":1478},"name:",{"type":48,"value":1480}," are present",{"type":42,"tag":143,"props":1482,"children":1483},{},[1484,1493,1498],{"type":42,"tag":170,"props":1485,"children":1486},{},[1487],{"type":42,"tag":63,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":48,"value":1492},"Build failed",{"type":42,"tag":170,"props":1494,"children":1495},{},[1496],{"type":48,"value":1497},"UI component has type\u002Fimport errors",{"type":42,"tag":170,"props":1499,"children":1500},{},[1501,1502,1507],{"type":48,"value":240},{"type":42,"tag":63,"props":1503,"children":1505},{"className":1504},[],[1506],{"type":48,"value":375},{"type":48,"value":1508}," locally first",{"type":42,"tag":143,"props":1510,"children":1511},{},[1512,1521,1526],{"type":42,"tag":170,"props":1513,"children":1514},{},[1515],{"type":42,"tag":63,"props":1516,"children":1518},{"className":1517},[],[1519],{"type":48,"value":1520},"Version already exists",{"type":42,"tag":170,"props":1522,"children":1523},{},[1524],{"type":48,"value":1525},"Already uploaded this version number",{"type":42,"tag":170,"props":1527,"children":1528},{},[1529,1531,1537],{"type":48,"value":1530},"Bump ",{"type":42,"tag":63,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":48,"value":1536},"version",{"type":48,"value":1538}," in stripe-app.yaml",{"type":42,"tag":143,"props":1540,"children":1541},{},[1542,1551,1556],{"type":42,"tag":170,"props":1543,"children":1544},{},[1545],{"type":42,"tag":63,"props":1546,"children":1548},{"className":1547},[],[1549],{"type":48,"value":1550},"Permission denied",{"type":42,"tag":170,"props":1552,"children":1553},{},[1554],{"type":48,"value":1555},"CLI not logged in or wrong account",{"type":42,"tag":170,"props":1557,"children":1558},{},[1559,1560],{"type":48,"value":240},{"type":42,"tag":63,"props":1561,"children":1563},{"className":1562},[],[1564],{"type":48,"value":1565},"stripe login",{"type":42,"tag":143,"props":1567,"children":1568},{},[1569,1580,1585],{"type":42,"tag":170,"props":1570,"children":1571},{},[1572,1578],{"type":42,"tag":63,"props":1573,"children":1575},{"className":1574},[],[1576],{"type":48,"value":1577},"connect-src",{"type":48,"value":1579}," \u002F CSP error",{"type":42,"tag":170,"props":1581,"children":1582},{},[1583],{"type":48,"value":1584},"App calls undeclared URL",{"type":42,"tag":170,"props":1586,"children":1587},{},[1588,1590],{"type":48,"value":1589},"Add URL to ",{"type":42,"tag":63,"props":1591,"children":1593},{"className":1592},[],[1594],{"type":48,"value":1595},"content_security_policy.connect-src",{"type":42,"tag":143,"props":1597,"children":1598},{},[1599,1608,1618],{"type":42,"tag":170,"props":1600,"children":1601},{},[1602],{"type":42,"tag":63,"props":1603,"children":1605},{"className":1604},[],[1606],{"type":48,"value":1607},"extensions field required",{"type":42,"tag":170,"props":1609,"children":1610},{},[1611,1613],{"type":48,"value":1612},"Missing ",{"type":42,"tag":63,"props":1614,"children":1616},{"className":1615},[],[1617],{"type":48,"value":1237},{"type":42,"tag":170,"props":1619,"children":1620},{},[1621,1623,1628],{"type":48,"value":1622},"Add ",{"type":42,"tag":63,"props":1624,"children":1626},{"className":1625},[],[1627],{"type":48,"value":1237},{"type":48,"value":1629}," to stripe-app.yaml",{"type":42,"tag":143,"props":1631,"children":1632},{},[1633,1642,1647],{"type":42,"tag":170,"props":1634,"children":1635},{},[1636],{"type":42,"tag":63,"props":1637,"children":1639},{"className":1638},[],[1640],{"type":48,"value":1641},"Component not found",{"type":42,"tag":170,"props":1643,"children":1644},{},[1645],{"type":48,"value":1646},"Viewport references wrong component name",{"type":42,"tag":170,"props":1648,"children":1649},{},[1650,1652,1658],{"type":48,"value":1651},"Match ",{"type":42,"tag":63,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":48,"value":1657},"component:",{"type":48,"value":1659}," value to your default export",{"type":42,"tag":43,"props":1661,"children":1663},{"id":1662},"reference-files",[1664],{"type":48,"value":1665},"Reference files",{"type":42,"tag":135,"props":1667,"children":1668},{},[1669,1685],{"type":42,"tag":139,"props":1670,"children":1671},{},[1672],{"type":42,"tag":143,"props":1673,"children":1674},{},[1675,1680],{"type":42,"tag":147,"props":1676,"children":1677},{},[1678],{"type":48,"value":1679},"File",{"type":42,"tag":147,"props":1681,"children":1682},{},[1683],{"type":48,"value":1684},"Read when",{"type":42,"tag":163,"props":1686,"children":1687},{},[1688,1706,1724,1737,1750,1763,1776,1789,1802,1815],{"type":42,"tag":143,"props":1689,"children":1690},{},[1691,1696],{"type":42,"tag":170,"props":1692,"children":1693},{},[1694],{"type":48,"value":1695},"\u003Creferences\u002Fcanonical-docs.md>",{"type":42,"tag":170,"props":1697,"children":1698},{},[1699,1704],{"type":42,"tag":55,"props":1700,"children":1701},{},[1702],{"type":48,"value":1703},"ALWAYS",{"type":48,"value":1705}," — lists docs pages to WebFetch before writing code",{"type":42,"tag":143,"props":1707,"children":1708},{},[1709,1714],{"type":42,"tag":170,"props":1710,"children":1711},{},[1712],{"type":48,"value":1713},"\u003Creferences\u002Fdiscovery.md>",{"type":42,"tag":170,"props":1715,"children":1716},{},[1717,1722],{"type":42,"tag":55,"props":1718,"children":1719},{},[1720],{"type":48,"value":1721},"ALWAYS FIRST",{"type":48,"value":1723}," — full discovery script with routing",{"type":42,"tag":143,"props":1725,"children":1726},{},[1727,1732],{"type":42,"tag":170,"props":1728,"children":1729},{},[1730],{"type":48,"value":1731},"\u003Creferences\u002Fbackend.md>",{"type":42,"tag":170,"props":1733,"children":1734},{},[1735],{"type":48,"value":1736},"Before writing server.js",{"type":42,"tag":143,"props":1738,"children":1739},{},[1740,1745],{"type":42,"tag":170,"props":1741,"children":1742},{},[1743],{"type":48,"value":1744},"\u003Creferences\u002Fui-extensions.md>",{"type":42,"tag":170,"props":1746,"children":1747},{},[1748],{"type":48,"value":1749},"Before writing React\u002FUI code",{"type":42,"tag":143,"props":1751,"children":1752},{},[1753,1758],{"type":42,"tag":170,"props":1754,"children":1755},{},[1756],{"type":48,"value":1757},"\u003Creferences\u002Fworkflow.md>",{"type":42,"tag":170,"props":1759,"children":1760},{},[1761],{"type":48,"value":1762},"Full development loop with all CLI commands",{"type":42,"tag":143,"props":1764,"children":1765},{},[1766,1771],{"type":42,"tag":170,"props":1767,"children":1768},{},[1769],{"type":48,"value":1770},"\u003Creferences\u002Fextension-types.md>",{"type":42,"tag":170,"props":1772,"children":1773},{},[1774],{"type":48,"value":1775},"After discovery — map answers to extension type",{"type":42,"tag":143,"props":1777,"children":1778},{},[1779,1784],{"type":42,"tag":170,"props":1780,"children":1781},{},[1782],{"type":48,"value":1783},"\u003Creferences\u002Fwebhooks.md>",{"type":42,"tag":170,"props":1785,"children":1786},{},[1787],{"type":48,"value":1788},"When app reacts to Stripe events",{"type":42,"tag":143,"props":1790,"children":1791},{},[1792,1797],{"type":42,"tag":170,"props":1793,"children":1794},{},[1795],{"type":48,"value":1796},"\u003Creferences\u002Fauthentication.md>",{"type":42,"tag":170,"props":1798,"children":1799},{},[1800],{"type":48,"value":1801},"For auth type selection and patterns",{"type":42,"tag":143,"props":1803,"children":1804},{},[1805,1810],{"type":42,"tag":170,"props":1806,"children":1807},{},[1808],{"type":48,"value":1809},"\u003Creferences\u002Fonboarding-ux.md>",{"type":42,"tag":170,"props":1811,"children":1812},{},[1813],{"type":48,"value":1814},"For first-run experience",{"type":42,"tag":143,"props":1816,"children":1817},{},[1818,1823],{"type":42,"tag":170,"props":1819,"children":1820},{},[1821],{"type":48,"value":1822},"\u003Creferences\u002Fpublishing.md>",{"type":42,"tag":170,"props":1824,"children":1825},{},[1826],{"type":48,"value":1827},"For marketplace publishing",{"type":42,"tag":1829,"props":1830,"children":1831},"style",{},[1832],{"type":48,"value":1833},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1835,"total":1935},[1836,1855,1871,1883,1898,1911,1923],{"slug":1837,"name":1837,"fn":1838,"description":1839,"org":1840,"tags":1841,"stars":25,"repoUrl":26,"updatedAt":1854},"accessibility-and-inclusive-visualization","make data visualizations accessible","Make data visualizations accessible and inclusive. Use when the user needs chart or diagram accessibility guidance, text alternatives for complex visuals, color and contrast review, keyboard support, reduced-motion behavior for animation or parallax, or an accessibility QA workflow for exported figures, UML-like diagrams, and dashboards.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1842,1845,1848,1851],{"name":1843,"slug":1844,"type":15},"Accessibility","accessibility",{"name":1846,"slug":1847,"type":15},"Charts","charts",{"name":1849,"slug":1850,"type":15},"Data Visualization","data-visualization",{"name":1852,"slug":1853,"type":15},"Design","design","2026-06-30T19:00:57.102",{"slug":1856,"name":1856,"fn":1857,"description":1858,"org":1859,"tags":1860,"stars":25,"repoUrl":26,"updatedAt":1870},"adobe-batch-edit-photos","apply consistent photo adjustments","Apply consistent photo adjustments across a set of images so they look like they were edited together. Use this skill whenever the user says \"make my photos look cohesive\", \"give all these the same style\", \"apply a warm and golden feel to all of these\", \"make this cinematic\", \"match the look across my photos\", \"edit all my travel photos the same way\", \"batch edit these\", \"make these consistent\", \"fix my phone photos\", or uploads a folder of photos and wants a unified, polished result. Also triggers for requests like \"apply a preset to all of these\", \"make these look professional\", or \"they were shot in mixed lighting — can you fix them all\". Outputs direct final image URLs plus an in-chat preview grid and optional Firefly Board link. Access: 🔐 Signed-In required | Gen AI: ❌\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1861,1864,1867],{"name":1862,"slug":1863,"type":15},"Creative","creative",{"name":1865,"slug":1866,"type":15},"Editing","editing",{"name":1868,"slug":1869,"type":15},"Imaging","imaging","2026-08-28T15:09:11.185865",{"slug":1872,"name":1872,"fn":1873,"description":1874,"org":1875,"tags":1876,"stars":25,"repoUrl":26,"updatedAt":1882},"adobe-create-mockups","create product and scene mockups","Use when a user wants to see their logo, design, or sketch on a product or scene mockup — mugs, t-shirts, business cards, hats, phone screens, posters, billboards, or similar. Triggers on \"create mockups\", \"show my logo on products\", or any logo upload with a request to visualize it on items. Access: 🔐 Signed-In required | Gen AI: ✅ Adobe Firefly via `image_generate` used for design creation, sketch polishing, and mockup scene generation\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1877,1878,1879],{"name":1862,"slug":1863,"type":15},{"name":1852,"slug":1853,"type":15},{"name":1880,"slug":1881,"type":15},"Graphics","graphics","2026-08-28T15:09:07.42507",{"slug":1884,"name":1884,"fn":1885,"description":1886,"org":1887,"tags":1888,"stars":25,"repoUrl":26,"updatedAt":1897},"adobe-create-social-variations","export platform-ready social media assets","Resize, crop, or export any image or video into platform-ready social media assets using Adobe Creative Cloud tools. Use this skill when a user wants to prepare a photo, image, or video for one or more social platforms — Instagram, TikTok, LinkedIn, Facebook, YouTube, Snapchat, Pinterest, Threads, or X\u002FTwitter. Triggers on: \"prepare my image for Instagram\", \"resize for TikTok\", \"get this ready to post\", \"make versions for all platforms\", \"social media sizes\", \"crop for stories\", \"export for LinkedIn\", \"resize my video for social\", \"make social media assets\", or any request to adapt a photo or video for specific platforms. Handles subject-aware cropping, AI canvas expansion, test previews before full runs, and same-ratio video resizing.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1889,1890,1891,1894],{"name":1862,"slug":1863,"type":15},{"name":1880,"slug":1881,"type":15},{"name":1892,"slug":1893,"type":15},"Marketing","marketing",{"name":1895,"slug":1896,"type":15},"Social Media","social-media","2026-08-28T15:10:07.282096",{"slug":1899,"name":1899,"fn":1900,"description":1901,"org":1902,"tags":1903,"stars":25,"repoUrl":26,"updatedAt":1910},"adobe-design-from-template","create visual designs from templates","Create any visual design using Adobe Express templates — flyers, posters, social media posts (Instagram, Facebook, LinkedIn), business cards, invitations, greeting cards, resumes, cover letters, brochures, newsletters, certificates, presentations, YouTube thumbnails, email headers, logos, menus, and labels. Use this skill whenever the user wants to make, design, or build any visual — even if they just say \"make me a flyer\", \"design a poster\", \"I need something for Instagram\", \"create an event invite\", or \"make a business card\". Also handles browsing templates, editing text, replacing images, changing backgrounds, animating, and exporting designs. Access: 🔐 Signed-In required | Gen AI: ❌ by default — image replacement only where the surface permits generative AI (e.g. Codex); none on Claude\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1904,1905,1906,1907],{"name":1862,"slug":1863,"type":15},{"name":1852,"slug":1853,"type":15},{"name":1880,"slug":1881,"type":15},{"name":1908,"slug":1909,"type":15},"Templates","templates","2026-08-28T15:10:03.050113",{"slug":1912,"name":1912,"fn":1913,"description":1914,"org":1915,"tags":1916,"stars":25,"repoUrl":26,"updatedAt":1922},"adobe-edit-quick-cut","create video sizzle reels","Create a punchy sizzle reel from a video using Adobe Quick Cut. Use this skill whenever a user wants to cut, trim, or shorten a video into highlights — including phrases like \"make a sizzle reel\", \"make a highlight reel\", \"quick cut this\", \"cut the best parts\", \"shorten this video\", \"make a highlight clip\", \"summarize this video visually\", or any request to produce a shorter edited version of a video. Use this skill for Quick Cut requests before suggesting manual editing in Premiere. Requires the user to upload a video file.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1917,1918,1919],{"name":1862,"slug":1863,"type":15},{"name":1865,"slug":1866,"type":15},{"name":1920,"slug":1921,"type":15},"Video","video","2026-08-28T15:09:07.765245",{"slug":1924,"name":1924,"fn":1925,"description":1926,"org":1927,"tags":1928,"stars":25,"repoUrl":26,"updatedAt":1934},"adobe-retouch-portraits","batch retouch portrait photos","Bulk-retouch a folder of portrait photos using Adobe tools — designed for wedding photographers and event photographers who need fast, walk-away batch processing. Use this skill when the user says \"retouch my photos\", \"batch process these portraits\", \"process my wedding photos\", \"clean up this folder of images\", \"run my headshots through Adobe\", or uploads\u002Fselects a folder of photos and wants them polished and ready to review. Automatically applies auto-straighten, auto-tone, and auto-light to every image. Outputs a preview grid and download folder. Access: 🔐 Signed-In required | Gen AI: ❌ by default — optional background-only cleanup only where the surface permits generative AI (e.g. Codex); none on Claude\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1929,1930,1931],{"name":1862,"slug":1863,"type":15},{"name":1868,"slug":1869,"type":15},{"name":1932,"slug":1933,"type":15},"Photography","photography","2026-08-28T15:09:10.386974",499,{"items":1937,"total":2136},[1938,1959,1982,1997,2013,2032,2051,2065,2081,2095,2107,2120],{"slug":1939,"name":1939,"fn":1940,"description":1941,"org":1942,"tags":1943,"stars":1956,"repoUrl":1957,"updatedAt":1958},"prior-auth-packet-builder","build healthcare prior authorization packets","Build a concise prior authorization packet from local case files and payer policy docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1944,1947,1950,1953],{"name":1945,"slug":1946,"type":15},"Documents","documents",{"name":1948,"slug":1949,"type":15},"Healthcare","healthcare",{"name":1951,"slug":1952,"type":15},"Insurance","insurance",{"name":1954,"slug":1955,"type":15},"Regulatory Compliance","regulatory-compliance",28169,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-agents-python","2026-08-02T05:48:07.395855",{"slug":1960,"name":1960,"fn":1961,"description":1962,"org":1963,"tags":1964,"stars":1979,"repoUrl":1980,"updatedAt":1981},"aspnet-core","build ASP.NET Core web applications","Build, review, refactor, or architect ASP.NET Core web applications using current official guidance for .NET web development. Use when working on Blazor Web Apps, Razor Pages, MVC, Minimal APIs, controller-based Web APIs, SignalR, gRPC, middleware, dependency injection, configuration, authentication, authorization, testing, performance, deployment, or ASP.NET Core upgrades.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1965,1968,1970,1973,1976],{"name":1966,"slug":1967,"type":15},".NET","dotnet",{"name":1969,"slug":1960,"type":15},"ASP.NET Core",{"name":1971,"slug":1972,"type":15},"Blazor","blazor",{"name":1974,"slug":1975,"type":15},"C#","csharp",{"name":1977,"slug":1978,"type":15},"Web Development","web-development",23787,"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fskills","2026-04-12T05:07:02.819491",{"slug":1983,"name":1983,"fn":1984,"description":1985,"org":1986,"tags":1987,"stars":1979,"repoUrl":1980,"updatedAt":1996},"chatgpt-apps","build ChatGPT Apps SDK applications","Build, scaffold, refactor, and troubleshoot ChatGPT Apps SDK applications that combine an MCP server and widget UI. Use when Codex needs to design tools, register UI resources, wire the MCP Apps bridge or ChatGPT compatibility APIs, apply Apps SDK metadata or CSP or domain settings, or produce a docs-aligned project scaffold. Prefer a docs-first workflow by invoking the openai-docs skill or OpenAI developer docs MCP tools before generating code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1988,1989,1992,1995],{"name":13,"slug":14,"type":15},{"name":1990,"slug":1991,"type":15},"ChatGPT","chatgpt",{"name":1993,"slug":1994,"type":15},"MCP","mcp",{"name":9,"slug":8,"type":15},"2026-04-12T05:07:05.468097",{"slug":1998,"name":1998,"fn":1999,"description":2000,"org":2001,"tags":2002,"stars":1979,"repoUrl":1980,"updatedAt":2012},"cli-creator","build CLIs from API docs","Build a composable CLI for Codex from API docs, an OpenAPI spec, existing curl examples, an SDK, a web app, an admin tool, or a local script. Use when the user wants Codex to create a command-line tool that can run from any repo, expose composable read\u002Fwrite commands, return stable JSON, manage auth, and pair with a companion skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2003,2006,2009],{"name":2004,"slug":2005,"type":15},"API Development","api-development",{"name":2007,"slug":2008,"type":15},"CLI","cli",{"name":2010,"slug":2011,"type":15},"Codex","codex","2026-04-12T05:07:04.132762",{"slug":2014,"name":2014,"fn":2015,"description":2016,"org":2017,"tags":2018,"stars":1979,"repoUrl":1980,"updatedAt":2031},"cloudflare-deploy","deploy projects to Cloudflare","Deploy applications and infrastructure to Cloudflare using Workers, Pages, and related platform services. Use when the user asks to deploy, host, publish, or set up a project on Cloudflare.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2019,2022,2025,2028],{"name":2020,"slug":2021,"type":15},"Cloudflare","cloudflare",{"name":2023,"slug":2024,"type":15},"Cloudflare Pages","cloudflare-pages",{"name":2026,"slug":2027,"type":15},"Cloudflare Workers","cloudflare-workers",{"name":2029,"slug":2030,"type":15},"Deployment","deployment","2026-04-12T05:07:14.275118",{"slug":2033,"name":2033,"fn":2034,"description":2035,"org":2036,"tags":2037,"stars":1979,"repoUrl":1980,"updatedAt":2050},"define-goal","define and set measurable project goals","Help the user define a concrete, measurable goal before starting work, especially when they ask to use the goal tool, create a goal, set an objective, clarify success criteria, or turn a fuzzy intention into a quantitative outcome. Use this skill for goal creation and goal refinement only; it does not manage durable snapshots, decision logs, or long-running execution artifacts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2038,2041,2044,2047],{"name":2039,"slug":2040,"type":15},"Productivity","productivity",{"name":2042,"slug":2043,"type":15},"Project Management","project-management",{"name":2045,"slug":2046,"type":15},"Strategy","strategy",{"name":2048,"slug":2049,"type":15},"Task Management","task-management","2026-05-23T06:17:16.870838",{"slug":2052,"name":2052,"fn":2053,"description":2054,"org":2055,"tags":2056,"stars":1979,"repoUrl":1980,"updatedAt":2064},"figma","translate Figma designs into code","Use the Figma MCP server to fetch design context, screenshots, variables, and assets from Figma, and to translate Figma nodes into production code. Trigger when a task involves Figma URLs, node IDs, design-to-code implementation, or Figma MCP setup and troubleshooting.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2057,2058,2060,2063],{"name":1852,"slug":1853,"type":15},{"name":2059,"slug":2052,"type":15},"Figma",{"name":2061,"slug":2062,"type":15},"Frontend","frontend",{"name":1993,"slug":1994,"type":15},"2026-04-12T05:06:47.939943",{"slug":2066,"name":2066,"fn":2067,"description":2068,"org":2069,"tags":2070,"stars":1979,"repoUrl":1980,"updatedAt":2080},"figma-code-connect-components","connect Figma designs to code components","Connects Figma design components to code components using Code Connect mapping tools. Use when user says \"code connect\", \"connect this component to code\", \"map this component\", \"link component to code\", \"create code connect mapping\", or wants to establish mappings between Figma designs and code implementations. For canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2071,2072,2075,2076,2077],{"name":1852,"slug":1853,"type":15},{"name":2073,"slug":2074,"type":15},"Design System","design-system",{"name":2059,"slug":2052,"type":15},{"name":2061,"slug":2062,"type":15},{"name":2078,"slug":2079,"type":15},"UI Components","ui-components","2026-05-10T05:59:52.971881",{"slug":2082,"name":2082,"fn":2083,"description":2084,"org":2085,"tags":2086,"stars":1979,"repoUrl":1980,"updatedAt":2094},"figma-create-design-system-rules","generate design system rules from Figma","Generates custom design system rules for the user's codebase. Use when user says \"create design system rules\", \"generate rules for my project\", \"set up design rules\", \"customize design system guidelines\", or wants to establish project-specific conventions for Figma-to-code workflows. Requires Figma MCP server connection.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2087,2088,2089,2092,2093],{"name":1852,"slug":1853,"type":15},{"name":2073,"slug":2074,"type":15},{"name":2090,"slug":2091,"type":15},"Documentation","documentation",{"name":2059,"slug":2052,"type":15},{"name":2061,"slug":2062,"type":15},"2026-05-16T06:07:47.821474",{"slug":2096,"name":2096,"fn":2097,"description":2098,"org":2099,"tags":2100,"stars":1979,"repoUrl":1980,"updatedAt":2106},"figma-implement-design","translate Figma designs into application code","Translates Figma designs into production-ready application code with 1:1 visual fidelity. Use when implementing UI code from Figma files, when user mentions \"implement design\", \"generate code\", \"implement component\", provides Figma URLs, or asks to build components matching Figma specs. For Figma canvas writes via `use_figma`, use `figma-use`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2101,2102,2103,2104,2105],{"name":1852,"slug":1853,"type":15},{"name":2059,"slug":2052,"type":15},{"name":2061,"slug":2062,"type":15},{"name":2078,"slug":2079,"type":15},{"name":1977,"slug":1978,"type":15},"2026-05-16T06:07:40.583615",{"slug":2108,"name":2108,"fn":2109,"description":2110,"org":2111,"tags":2112,"stars":1979,"repoUrl":1980,"updatedAt":2119},"hatch-pet","create animated pets for Codex","Create, repair, validate, visually QA, and package Codex-compatible animated pets and pet spritesheets from character art, generated images, company or prospect brand cues, or visual references. Use when a user wants a lightweight-worker Codex pet workflow, a non-pixel custom pet style, a prospect or company mascot pet, or a full 8x9 animated pet atlas with transparent unused cells, QA contact sheets, and pet.json packaging. This skill composes the installed $imagegen system skill for visual generation and uses bundled scripts for deterministic spritesheet assembly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2113,2116,2117,2118],{"name":2114,"slug":2115,"type":15},"Animation","animation",{"name":2010,"slug":2011,"type":15},{"name":1862,"slug":1863,"type":15},{"name":1852,"slug":1853,"type":15},"2026-05-02T05:31:48.48485",{"slug":2121,"name":2121,"fn":2122,"description":2123,"org":2124,"tags":2125,"stars":1979,"repoUrl":1980,"updatedAt":2135},"imagegen","generate and edit raster images","Generate or edit raster images when the task benefits from AI-created bitmap visuals such as photos, illustrations, textures, sprites, mockups, or transparent-background cutouts. Use when Codex should create a brand-new image, transform an existing image, or derive visual variants from references, and the output should be a bitmap asset rather than repo-native code or vector. Do not use when the task is better handled by editing existing SVG\u002Fvector\u002Fcode-native assets, extending an established icon or logo system, or building the visual directly in HTML\u002FCSS\u002Fcanvas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2126,2127,2128,2131,2134],{"name":1862,"slug":1863,"type":15},{"name":1852,"slug":1853,"type":15},{"name":2129,"slug":2130,"type":15},"Image Generation","image-generation",{"name":2132,"slug":2133,"type":15},"Images","images",{"name":9,"slug":8,"type":15},"2026-05-15T06:23:24.312127",578]