[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M713QFPWW0DEME6VT6MX88E7":3,"skill-same:01M713QFPWW0DEME6VT6MX88E7":79},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":15,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":13,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M713QFPWW0DEME6VT6MX88E7","netlify-caching",null,"Guide for controlling caching on Netlify's CDN. Use when configuring cache headers, setting up stale-while-revalidate, implementing on-demand cache purge, or understanding Netlify's CDN caching behavior. Covers Cache-Control, Netlify-CDN-Cache-Control, cache tags, durable cache, and framework-specific caching patterns.","ilderaj\u002Fagent-plugin-marketplace","ilderaj","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6321440?v=4","01M70DFHF3YADN6NHGSEZ49NT7","01M70DFHFX74C9CEGTTQ8V8GXW",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--netlify\u002Fskills\u002Fnetlify-caching\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--netlify\u002Fskills\u002Fnetlify-caching\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"caching","netlify","netlify caching","purge","patterns","cdn caching","stale","headers","behavior","control","tags","cdn","cache","framework-specific","when","use","implementing","up","caching patterns","for","2026-11-10 10:12:30",false,"---\nname: netlify-caching\ndescription: Guide for controlling caching on Netlify's CDN. Use when configuring cache headers, setting up stale-while-revalidate, implementing on-demand cache purge, or understanding Netlify's CDN caching behavior. Covers Cache-Control, Netlify-CDN-Cache-Control, cache tags, durable cache, and framework-specific caching patterns.\n---\n\n# Caching on Netlify\n\n## Default Behavior\n\n**Static assets** are cached automatically:\n- CDN: cached for 1 year, invalidated on every deploy\n- Browser: always revalidates (`max-age=0, must-revalidate`)\n- No configuration needed\n\n**Dynamic responses** (functions, edge functions, proxied) are **not cached by default**. Add cache headers explicitly.\n\n## Cache-Control Headers\n\nThree headers control caching, from most to least specific:\n\n| Header | Who sees it | Use case |\n|---|---|---|\n| `Netlify-CDN-Cache-Control` | Netlify CDN only (stripped before browser) | CDN-only caching |\n| `CDN-Cache-Control` | All CDN caches (stripped before browser) | Multi-CDN setups |\n| `Cache-Control` | Browser and all caches | General caching |\n\n### Common Patterns\n\n```typescript\n\u002F\u002F Cache at CDN for 1 hour, browser always revalidates\nreturn new Response(body, {\n  headers: {\n    \"Netlify-CDN-Cache-Control\": \"public, s-maxage=3600, must-revalidate\",\n    \"Cache-Control\": \"public, max-age=0, must-revalidate\",\n  },\n});\n\n\u002F\u002F Stale-while-revalidate (serve stale for 2 min while refreshing)\nreturn new Response(body, {\n  headers: {\n    \"Netlify-CDN-Cache-Control\": \"public, max-age=60, stale-while-revalidate=120\",\n  },\n});\n\n\u002F\u002F Durable cache (shared across edge nodes, serverless functions only)\nreturn new Response(body, {\n  headers: {\n    \"Netlify-CDN-Cache-Control\": \"public, durable, max-age=60, stale-while-revalidate=120\",\n  },\n});\n```\n\n### Immutable Assets\n\nFor fingerprinted files (hash in filename):\n\n```toml\n# netlify.toml\n[[headers]]\nfor = \"\u002Fassets\u002F*\"\n[headers.values]\nCache-Control = \"public, max-age=31536000, immutable\"\n```\n\n## Cache Tags and On-Demand Purge\n\nTag responses for selective cache invalidation:\n\n```typescript\nreturn new Response(body, {\n  headers: {\n    \"Netlify-Cache-ID\": \"product,listing\",\n    \"Netlify-CDN-Cache-Control\": \"public, s-maxage=86400\",\n  },\n});\n```\n\nPurge by tag:\n\n```typescript\nimport { purgeCache } from \"@netlify\u002Ffunctions\";\n\nexport default async () => {\n  await purgeCache({ tags: [\"product\"] });\n  return new Response(\"Purged\", { status: 202 });\n};\n```\n\nPurge entire site:\n\n```typescript\nawait purgeCache();\n```\n\nResponses with `Netlify-Cache-ID` are **excluded from automatic deploy-based invalidation** — they must be purged explicitly.\n\n## Cache Key Variation\n\nCustomize what creates separate cache entries:\n\n```typescript\nreturn new Response(body, {\n  headers: {\n    \"Netlify-Vary\": \"cookie=ab_test|is_logged_in\",\n    \u002F\u002F Other options: query=param1|param2, header=X-Custom, country=us|de, language=en|fr\n  },\n});\n```\n\n## Framework-Specific Caching\n\n### Next.js\nISR uses Netlify's durable cache automatically (runtime 5.5.0+). `revalidatePath` and `revalidateTag` trigger cache purge.\n\n### Astro \u002F Remix\nFull control over cache headers in server routes. Set `Netlify-CDN-Cache-Control` in responses for CDN caching.\n\n### Nuxt\nDefault Nitro preset handles caching. ISR-style patterns use `routeRules` with `swr` or `isr` options.\n\n### Vite SPA\nStatic assets are cached by default. API responses from Netlify Functions need explicit cache headers.\n\n## Debugging\n\nCheck the `Cache-Status` response header:\n- `HIT` — served from cache\n- `MISS` — generated fresh\n- `REVALIDATED` — stale content was revalidated\n\n## Constraints\n\n- Basic auth disables caching for the entire site\n- Durable cache is serverless functions only (not edge functions)\n- Same URL must return identical `Netlify-Vary` headers across responses\n- Deploy invalidation is scoped to deploy context (production vs preview)\n","# Caching on Netlify\n\n## Default Behavior\n\n**Static assets** are cached automatically:\n- CDN: cached for 1 year, invalidated on every deploy\n- Browser: always revalidates (`max-age=0, must-revalidate`)\n- No configuration needed\n\n**Dynamic responses** (functions, edge functions, proxied) are **not cached by default**. Add cache headers explicitly.\n\n## Cache-Control Headers\n\nThree headers control caching, from most to least specific:\n\n| Header | Who sees it | Use case |\n|---|---|---|\n| `Netlify-CDN-Cache-Control` | Netlify CDN only (stripped before browser) | CDN-only caching |\n| `CDN-Cache-Control` | All CDN caches (stripped before browser) | Multi-CDN setups |\n| `Cache-Control` | Browser and all caches | General caching |\n\n### Common Patterns\n\n```typescript\n\u002F\u002F Cache at CDN for 1 hour, browser always revalidates\nreturn new Response(body, {\n  headers: {\n    \"Netlify-CDN-Cache-Control\": \"public, s-maxage=3600, must-revalidate\",\n    \"Cache-Control\": \"public, max-age=0, must-revalidate\",\n  },\n});\n\n\u002F\u002F Stale-while-revalidate (serve stale for 2 min while refreshing)\nreturn new Response(body, {\n  headers: {\n    \"Netlify-CDN-Cache-Control\": \"public, max-age=60, stale-while-revalidate=120\",\n  },\n});\n\n\u002F\u002F Durable cache (shared across edge nodes, serverless functions only)\nreturn new Response(body, {\n  headers: {\n    \"Netlify-CDN-Cache-Control\": \"public, durable, max-age=60, stale-while-revalidate=120\",\n  },\n});\n```\n\n### Immutable Assets\n\nFor fingerprinted files (hash in filename):\n\n```toml\n# netlify.toml\n[[headers]]\nfor = \"\u002Fassets\u002F*\"\n[headers.values]\nCache-Control = \"public, max-age=31536000, immutable\"\n```\n\n## Cache Tags and On-Demand Purge\n\nTag responses for selective cache invalidation:\n\n```typescript\nreturn new Response(body, {\n  headers: {\n    \"Netlify-Cache-ID\": \"product,listing\",\n    \"Netlify-CDN-Cache-Control\": \"public, s-maxage=86400\",\n  },\n});\n```\n\nPurge by tag:\n\n```typescript\nimport { purgeCache } from \"@netlify\u002Ffunctions\";\n\nexport default async () => {\n  await purgeCache({ tags: [\"product\"] });\n  return new Response(\"Purged\", { status: 202 });\n};\n```\n\nPurge entire site:\n\n```typescript\nawait purgeCache();\n```\n\nResponses with `Netlify-Cache-ID` are **excluded from automatic deploy-based invalidation** — they must be purged explicitly.\n\n## Cache Key Variation\n\nCustomize what creates separate cache entries:\n\n```typescript\nreturn new Response(body, {\n  headers: {\n    \"Netlify-Vary\": \"cookie=ab_test|is_logged_in\",\n    \u002F\u002F Other options: query=param1|param2, header=X-Custom, country=us|de, language=en|fr\n  },\n});\n```\n\n## Framework-Specific Caching\n\n### Next.js\nISR uses Netlify's durable cache automatically (runtime 5.5.0+). `revalidatePath` and `revalidateTag` trigger cache purge.\n\n### Astro \u002F Remix\nFull control over cache headers in server routes. Set `Netlify-CDN-Cache-Control` in responses for CDN caching.\n\n### Nuxt\nDefault Nitro preset handles caching. ISR-style patterns use `routeRules` with `swr` or `isr` options.\n\n### Vite SPA\nStatic assets are cached by default. API responses from Netlify Functions need explicit cache headers.\n\n## Debugging\n\nCheck the `Cache-Status` response header:\n- `HIT` — served from cache\n- `MISS` — generated fresh\n- `REVALIDATED` — stale content was revalidated\n\n## Constraints\n\n- Basic auth disables caching for the entire site\n- Durable cache is serverless functions only (not edge functions)\n- Same URL must return identical `Netlify-Vary` headers across responses\n- Deploy invalidation is scoped to deploy context (production vs preview)\n",{"name":5,"description":7},"main","7e72d1e8c9a4b4e902f4b6d40505bc124fe29973","plugins\u002Fcodex--netlify\u002Fskills\u002Fnetlify-caching","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace","https:\u002F\u002Fgithub.com\u002Filderaj","2026-05-09 23:15:35",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add ilderaj\u002Fagent-plugin-marketplace --skill netlify-caching",{"tool":56,"command":57},"bunx","bunx skills add ilderaj\u002Fagent-plugin-marketplace --skill netlify-caching",{"tool":59,"command":60},"pnpm","pnpm dlx skills add ilderaj\u002Fagent-plugin-marketplace --skill netlify-caching","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--netlify\u002Fskills\u002Fnetlify-caching\u002FSKILL.md",true,[64,70,74],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"assets\u002Fnetlify-small.svg","ASSET","资产文件",1291,"https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--netlify\u002Fskills\u002Fnetlify-caching\u002Fassets\u002Fnetlify-small.svg",{"path":71,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":72,"sourceHtmlUrl":73},"assets\u002Fnetlify.png",2686,"https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--netlify\u002Fskills\u002Fnetlify-caching\u002Fassets\u002Fnetlify.png",{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":15},"LICENSE.txt","LICENSE","许可证",10776,[80,105,135,160,194,219],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":84,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":39},"01M713XGWR5JXWPR2A2YJ14YS3","android-emulator-qa","Use when validating Android feature flows in an emulator with adb-driven launch, input, UI-tree inspection, screenshots, and logcat capture.","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--test-android-apps\u002Fskills\u002Fandroid-emulator-qa\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--test-android-apps\u002Fskills\u002Fandroid-emulator-qa\u002FSKILL.md",[],[88,89,90,91,92,93,94,95,34,33,96,97,98,99,100,101,102,103,104],"android emulator qa","qa","android","emulator","tree","feature","flows","inspection","android feature","with","adb","launch","input","capture","ui","screenshots","driven",{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":109,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":117,"publishedAt":39},"01M713VQM4KXQZ2X2PMC3TE5Z2","supabase-postgres-best-practices","Postgres performance optimization and best practices from Supabase. Use this skill when writing, reviewing, or optimizing Postgres queries, schema designs, or database configurations.","MIT","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--supabase\u002Fskills\u002Fsupabase-postgres-best-practices\u002FSKILL.md",[112],{"categoryNo":113,"categoryName":114,"taxonomyType":115,"taxonomyTypeDesc":116},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[118,119,120,121,122,123,124,125,38,126,127,128,129,130,131,34,132,133,134,33],"postgres best practices","supabase","postgres","supabase postgres best practices","best practices","categories","postgres performance","advanced","Optimization","performance","correct","schema","writing","impact","Rules","critical","database",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":139,"sourceHtmlUrl":140,"categories":141,"keywords":143,"publishedAt":39},"01M713TS0QPNEMPP63WQ9AW7PH","sentry","Use when the user asks to inspect Sentry issues or events, summarize recent production errors, or pull basic Sentry health data via the Sentry API; perform read-only queries with the bundled script and require `SENTRY_AUTH_TOKEN`.","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--sentry\u002Fskills\u002Fsentry\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--sentry\u002Fskills\u002Fsentry\u002FSKILL.md",[142],{"categoryNo":113,"categoryName":114,"taxonomyType":115,"taxonomyTypeDesc":116},[137,144,145,146,147,148,149,33,150,151,152,153,154,155,156,157,158,34,159,97],"auth","inspect","sentry issues","issues","errors","only","api","read","token","data","health data","events","pull","read-only","basic","health",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":109,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":177,"publishedAt":39},"01M713TNCA0H80TDG9ZM1YR0RK","render-workflows","Sets up, develops, tests, and deploys Render Workflows. Covers first-time scaffolding (via CLI or manual), SDK installation (Python or TypeScript), task patterns (retries, subtasks, fan-out), local development, Dashboard deployment, and troubleshooting. Use when a user wants to set up Render Workflows for the first time, scaffold a workflow service, add or modify workflow tasks, test workflows locally, or deploy workflows to Render.","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--render\u002Fskills\u002Frender-workflows\u002FSKILL.md",[166,169,172],{"categoryNo":167,"categoryName":168,"taxonomyType":115,"taxonomyTypeDesc":116},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":170,"categoryName":171,"taxonomyType":115,"taxonomyTypeDesc":116},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":173,"categoryName":174,"taxonomyType":175,"taxonomyTypeDesc":176},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[178,179,180,181,182,183,38,184,185,186,187,36,188,189,190,191,34,33,192,193],"render workflows","render","workflows","SET","local development","development","scaffolding","deployment","time","manual","python","local","tests","retries","workflow","tasks",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":109,"licenseFileUrl":6,"sourceHtmlUrl":198,"categories":199,"keywords":203,"publishedAt":39},"01M713TJ4WWJN4D7BNFPQMV39C","render-monitor","Monitor Render services in real-time. Check health, performance metrics, logs, and resource usage. Use when users want to check service status, view metrics, monitor performance, or verify deployments are healthy.","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--render\u002Fskills\u002Frender-monitor\u002FSKILL.md",[200],{"categoryNo":201,"categoryName":202,"taxonomyType":115,"taxonomyTypeDesc":116},"01JBSEEDCAT000000000000023","Skill与智能体开发",[179,204,205,127,186,206,207,33,208,209,210,211,212,213,214,215,216,217,34,218],"render monitor","monitor","render mcp","MCP","logs","monitoring","cli","status","Tools","metrics","usage","view","real-time","deployments","healthy",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":109,"licenseFileUrl":6,"sourceHtmlUrl":223,"categories":224,"keywords":226,"publishedAt":39},"01M713TDTYVHWYS06Y9QJ1QYE0","render-migrate-from-heroku","Migrate from Heroku to Render by reading local project files and generating equivalent Render services. Triggers: any mention of migrating from Heroku, moving off Heroku, Heroku to Render migration, or switching from Heroku. Reads Procfile, dependency files, and app config from the local repo. Optionally uses Heroku MCP to enrich with live config vars, add-on details, and dyno sizes. Uses Render MCP or Blueprint YAML to create services.","https:\u002F\u002Fgithub.com\u002Filderaj\u002Fagent-plugin-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fcodex--render\u002Fskills\u002Frender-migrate-from-heroku\u002FSKILL.md",[225],{"categoryNo":201,"categoryName":202,"taxonomyType":115,"taxonomyTypeDesc":116},[179,227,228,229,230,231,232,233,206,189,234,207,235,236,237,238,239,240,241,242],"migrate","heroku","render migrate from heroku","app","creation","enrich","project","files","switching","Blueprint","mcp server","create","server","verification","dependency","config"]