[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-netlify-netlify-frameworks":3,"mdc--1uddd0-key":30,"related-org-netlify-netlify-frameworks":1119,"related-repo-netlify-netlify-frameworks":1297},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":26,"sourceUrl":28,"mdContent":29},"netlify-frameworks","deploy web frameworks on Netlify","Guide for deploying web frameworks on Netlify. Use when setting up a framework project (Vite\u002FReact, Astro, TanStack Start, Next.js, Nuxt, SvelteKit, Remix) for Netlify deployment, configuring adapters or plugins, running a framework project locally with Netlify's platform features, or troubleshooting framework-specific Netlify integration. Covers what Netlify needs from each framework, how adapters handle server-side rendering, and the general local development options (`netlify dev` versus the Netlify Vite plugin family).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"netlify","Netlify","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnetlify.png",[12,14,17],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Deployment","deployment",{"name":18,"slug":19,"type":13},"Web Development","web-development",24,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools","2026-07-17T05:30:20.258295",null,5,[],{"repoUrl":21,"stars":20,"forks":24,"topics":27,"description":23},[],"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools\u002Ftree\u002FHEAD\u002Fskills\u002Fnetlify-frameworks","---\nname: netlify-frameworks\ndescription: Guide for deploying web frameworks on Netlify. Use when setting up a framework project (Vite\u002FReact, Astro, TanStack Start, Next.js, Nuxt, SvelteKit, Remix) for Netlify deployment, configuring adapters or plugins, running a framework project locally with Netlify's platform features, or troubleshooting framework-specific Netlify integration. Covers what Netlify needs from each framework, how adapters handle server-side rendering, and the general local development options (`netlify dev` versus the Netlify Vite plugin family).\n---\n\n# Frameworks on Netlify\n\nNetlify supports any framework that produces static output. For frameworks with server-side capabilities (SSR, API routes, middleware), an adapter or plugin translates the framework's server-side code into Netlify Functions and Edge Functions automatically.\n\n## How It Works\n\nDuring build, the framework adapter writes files to `.netlify\u002Fv1\u002F` — functions, edge functions, redirects, and configuration. Netlify reads these to deploy the site. You do not need to write Netlify Functions manually when using a framework adapter for server-side features.\n\n## Detecting Your Framework\n\nCheck these files to determine the framework:\n\n| File | Framework |\n|---|---|\n| `astro.config.*` | Astro |\n| `next.config.*` | Next.js |\n| `nuxt.config.*` | Nuxt |\n| `vite.config.*` + `react-router` | Vite + React (SPA or Remix) |\n| `vite.config.*` + `@tanstack\u002Freact-start` | TanStack Start |\n| `svelte.config.*` | SvelteKit |\n\n## Framework Reference Guides\n\nEach framework has specific adapter\u002Fplugin requirements and local dev patterns:\n\n- **Vite + React (SPA or with server routes)**: See [references\u002Fvite.md](references\u002Fvite.md)\n- **Astro**: See [references\u002Fastro.md](references\u002Fastro.md)\n- **TanStack Start**: See [references\u002Ftanstack.md](references\u002Ftanstack.md)\n- **Next.js**: See [references\u002Fnextjs.md](references\u002Fnextjs.md)\n- **Nuxt**: See [references\u002Fnuxt.md](references\u002Fnuxt.md)\n- **SvelteKit**: See [references\u002Fsveltekit.md](references\u002Fsveltekit.md)\n\n## Local Development\n\nRunning a framework project locally with Netlify's platform features (environment variables, Functions, Edge Functions) generally comes from one of two places:\n\n### `netlify dev`\n\n```bash\nnetlify dev\n```\n\nWraps the framework's own dev server and adds:\n- Environment variable injection\n- Functions and Edge Functions\n- Redirects and headers processing\n\nWorks with any framework — run `netlify dev` in place of the framework's native dev command (e.g. instead of `npm run dev`).\n\nCustom dev-server wiring — a non-standard `command`, a `port`\u002F`targetPort`, or the `framework` key — goes in `netlify.toml`'s `[dev]` block; see the **netlify-config** skill for the full syntax. One easy-to-miss rule: if you set both a custom `command` and a `targetPort`, `framework` must be `\"#custom\"`, otherwise Netlify Dev runs its own detector and silently ignores your command.\n\n### Netlify Vite plugin family (Vite-based frameworks)\n\nFor frameworks built on Vite, a Netlify Vite plugin exposes platform primitives (Functions, Blobs, DB, environment variables) directly inside the framework's own dev server, so no `netlify dev` wrapper is needed — run the framework's normal dev command (e.g. `npm run dev`) once the plugin is registered in `vite.config.ts`.\n\n- Vite-based projects (React SPA, SvelteKit, Remix): `@netlify\u002Fvite-plugin` — see [references\u002Fvite.md](references\u002Fvite.md)\n- TanStack Start: `@netlify\u002Fvite-plugin-tanstack-start` — see [references\u002Ftanstack.md](references\u002Ftanstack.md)\n\nThe per-framework reference guides may also document other local dev options (e.g. `netlify dev`) — check the guide for your framework for setup specifics.\n\n### Running a single command with the Netlify environment loaded\n\n```bash\nnetlify dev:exec \u003Ccmd>\n```\n\nLoads the Netlify environment (env vars, etc.) for a single command without starting a dev server — useful for scripts, tests, or one-off tasks that need Netlify-managed environment variables.\n\n## General Patterns\n\n### Client-Side Routing (SPA)\n\nFor single-page apps with client-side routing, add a catch-all redirect:\n\n```toml\n# netlify.toml\n[[redirects]]\nfrom = \"\u002F*\"\nto = \"\u002Findex.html\"\nstatus = 200\n```\n\n> **Remove this catch-all when you adopt an SSR adapter.** A `\u002F* → \u002Findex.html` rule left over from an SPA setup will shadow your server routes: user-defined redirects in `netlify.toml`\u002F`_redirects` take precedence over the routes a framework adapter generates, so every request — including SSR pages and API\u002Ffunction routes — is served the static `index.html` with a 200. When you migrate a client-rendered app to SSR, delete the SPA catch-all.\n\n### Custom 404 Pages\n\n- **Static sites**: Create a `404.html` in your publish directory. Netlify serves it automatically for unmatched routes.\n- **SSR frameworks**: Handle 404s in the framework's routing (the adapter maps this to Netlify's function routing).\n\n### Environment Variables in Frameworks\n\nEach framework exposes environment variables to client-side code differently:\n\n| Framework | Client prefix | Access pattern |\n|---|---|---|\n| Vite \u002F React | `VITE_` | `import.meta.env.VITE_VAR` |\n| Astro | `PUBLIC_` | `import.meta.env.PUBLIC_VAR` |\n| Next.js | `NEXT_PUBLIC_` | `process.env.NEXT_PUBLIC_VAR` |\n| Nuxt | `NUXT_PUBLIC_` | `useRuntimeConfig().public.var` |\n\nIn server-side code, prefer `Netlify.env.get(\"VAR\")` to read environment variables. `process.env.VAR` also works inside Netlify Functions, but Edge Functions expose only `Netlify.env.get` — the portable form keeps server code working in both.\n\n**Never use a client prefix (`VITE_`, `PUBLIC_`, `NEXT_PUBLIC_`, `NUXT_PUBLIC_`) for secrets.** Client-prefixed variables are inlined into the client bundle and exposed to the browser.\n\n### Environment Variable Changes Require a Redeploy\n\nClient-prefixed vars (`VITE_`, `NEXT_PUBLIC_`, `PUBLIC_`, `NUXT_PUBLIC_`) are **inlined into the client bundle at build time** — their values are compiled into the JavaScript shipped to the browser. Editing one in the Netlify UI or CLI has no effect on the live site until a new build runs. The same applies server-side: Netlify injects environment variables at build time, so changing a value in the dashboard does **not** propagate to already-deployed functions on the next request. Any env var change — client- or server-side — requires a redeploy to take effect. If a value looks stale after you changed it, trigger a new deploy.\n\n### Runtime File Reads in Adapter-Generated Functions\n\nWhen an adapter turns your server code into a Netlify Function, only traced module dependencies are bundled. Arbitrary files you read from disk at runtime — a local JSON\u002FMarkdown data file, an email template, an `fs.readFile()` target — are **not** uploaded with the function unless you declare them. Such a read succeeds under `npm run dev` (the whole project is on disk) but throws `ENOENT` in production. Declare the files so they ship with the function: in Next.js set `outputFileTracingIncludes` in `next.config`; for a hand-written Netlify Function use `included_files` in its `config`. Never assume the project filesystem is present at function runtime.\n",{"data":31,"body":32},{"name":4,"description":6},{"type":33,"children":34},"root",[35,44,50,57,71,77,82,226,232,237,324,330,335,346,374,379,397,417,506,512,539,575,587,593,634,639,645,651,656,708,752,758,789,795,800,927,956,991,997,1041,1047,1113],{"type":36,"tag":37,"props":38,"children":40},"element","h1",{"id":39},"frameworks-on-netlify",[41],{"type":42,"value":43},"text","Frameworks on Netlify",{"type":36,"tag":45,"props":46,"children":47},"p",{},[48],{"type":42,"value":49},"Netlify supports any framework that produces static output. For frameworks with server-side capabilities (SSR, API routes, middleware), an adapter or plugin translates the framework's server-side code into Netlify Functions and Edge Functions automatically.",{"type":36,"tag":51,"props":52,"children":54},"h2",{"id":53},"how-it-works",[55],{"type":42,"value":56},"How It Works",{"type":36,"tag":45,"props":58,"children":59},{},[60,62,69],{"type":42,"value":61},"During build, the framework adapter writes files to ",{"type":36,"tag":63,"props":64,"children":66},"code",{"className":65},[],[67],{"type":42,"value":68},".netlify\u002Fv1\u002F",{"type":42,"value":70}," — functions, edge functions, redirects, and configuration. Netlify reads these to deploy the site. You do not need to write Netlify Functions manually when using a framework adapter for server-side features.",{"type":36,"tag":51,"props":72,"children":74},{"id":73},"detecting-your-framework",[75],{"type":42,"value":76},"Detecting Your Framework",{"type":36,"tag":45,"props":78,"children":79},{},[80],{"type":42,"value":81},"Check these files to determine the framework:",{"type":36,"tag":83,"props":84,"children":85},"table",{},[86,105],{"type":36,"tag":87,"props":88,"children":89},"thead",{},[90],{"type":36,"tag":91,"props":92,"children":93},"tr",{},[94,100],{"type":36,"tag":95,"props":96,"children":97},"th",{},[98],{"type":42,"value":99},"File",{"type":36,"tag":95,"props":101,"children":102},{},[103],{"type":42,"value":104},"Framework",{"type":36,"tag":106,"props":107,"children":108},"tbody",{},[109,127,144,161,186,209],{"type":36,"tag":91,"props":110,"children":111},{},[112,122],{"type":36,"tag":113,"props":114,"children":115},"td",{},[116],{"type":36,"tag":63,"props":117,"children":119},{"className":118},[],[120],{"type":42,"value":121},"astro.config.*",{"type":36,"tag":113,"props":123,"children":124},{},[125],{"type":42,"value":126},"Astro",{"type":36,"tag":91,"props":128,"children":129},{},[130,139],{"type":36,"tag":113,"props":131,"children":132},{},[133],{"type":36,"tag":63,"props":134,"children":136},{"className":135},[],[137],{"type":42,"value":138},"next.config.*",{"type":36,"tag":113,"props":140,"children":141},{},[142],{"type":42,"value":143},"Next.js",{"type":36,"tag":91,"props":145,"children":146},{},[147,156],{"type":36,"tag":113,"props":148,"children":149},{},[150],{"type":36,"tag":63,"props":151,"children":153},{"className":152},[],[154],{"type":42,"value":155},"nuxt.config.*",{"type":36,"tag":113,"props":157,"children":158},{},[159],{"type":42,"value":160},"Nuxt",{"type":36,"tag":91,"props":162,"children":163},{},[164,181],{"type":36,"tag":113,"props":165,"children":166},{},[167,173,175],{"type":36,"tag":63,"props":168,"children":170},{"className":169},[],[171],{"type":42,"value":172},"vite.config.*",{"type":42,"value":174}," + ",{"type":36,"tag":63,"props":176,"children":178},{"className":177},[],[179],{"type":42,"value":180},"react-router",{"type":36,"tag":113,"props":182,"children":183},{},[184],{"type":42,"value":185},"Vite + React (SPA or Remix)",{"type":36,"tag":91,"props":187,"children":188},{},[189,204],{"type":36,"tag":113,"props":190,"children":191},{},[192,197,198],{"type":36,"tag":63,"props":193,"children":195},{"className":194},[],[196],{"type":42,"value":172},{"type":42,"value":174},{"type":36,"tag":63,"props":199,"children":201},{"className":200},[],[202],{"type":42,"value":203},"@tanstack\u002Freact-start",{"type":36,"tag":113,"props":205,"children":206},{},[207],{"type":42,"value":208},"TanStack Start",{"type":36,"tag":91,"props":210,"children":211},{},[212,221],{"type":36,"tag":113,"props":213,"children":214},{},[215],{"type":36,"tag":63,"props":216,"children":218},{"className":217},[],[219],{"type":42,"value":220},"svelte.config.*",{"type":36,"tag":113,"props":222,"children":223},{},[224],{"type":42,"value":225},"SvelteKit",{"type":36,"tag":51,"props":227,"children":229},{"id":228},"framework-reference-guides",[230],{"type":42,"value":231},"Framework Reference Guides",{"type":36,"tag":45,"props":233,"children":234},{},[235],{"type":42,"value":236},"Each framework has specific adapter\u002Fplugin requirements and local dev patterns:",{"type":36,"tag":238,"props":239,"children":240},"ul",{},[241,259,272,285,298,311],{"type":36,"tag":242,"props":243,"children":244},"li",{},[245,251,253],{"type":36,"tag":246,"props":247,"children":248},"strong",{},[249],{"type":42,"value":250},"Vite + React (SPA or with server routes)",{"type":42,"value":252},": See ",{"type":36,"tag":254,"props":255,"children":257},"a",{"href":256},"references\u002Fvite.md",[258],{"type":42,"value":256},{"type":36,"tag":242,"props":260,"children":261},{},[262,266,267],{"type":36,"tag":246,"props":263,"children":264},{},[265],{"type":42,"value":126},{"type":42,"value":252},{"type":36,"tag":254,"props":268,"children":270},{"href":269},"references\u002Fastro.md",[271],{"type":42,"value":269},{"type":36,"tag":242,"props":273,"children":274},{},[275,279,280],{"type":36,"tag":246,"props":276,"children":277},{},[278],{"type":42,"value":208},{"type":42,"value":252},{"type":36,"tag":254,"props":281,"children":283},{"href":282},"references\u002Ftanstack.md",[284],{"type":42,"value":282},{"type":36,"tag":242,"props":286,"children":287},{},[288,292,293],{"type":36,"tag":246,"props":289,"children":290},{},[291],{"type":42,"value":143},{"type":42,"value":252},{"type":36,"tag":254,"props":294,"children":296},{"href":295},"references\u002Fnextjs.md",[297],{"type":42,"value":295},{"type":36,"tag":242,"props":299,"children":300},{},[301,305,306],{"type":36,"tag":246,"props":302,"children":303},{},[304],{"type":42,"value":160},{"type":42,"value":252},{"type":36,"tag":254,"props":307,"children":309},{"href":308},"references\u002Fnuxt.md",[310],{"type":42,"value":308},{"type":36,"tag":242,"props":312,"children":313},{},[314,318,319],{"type":36,"tag":246,"props":315,"children":316},{},[317],{"type":42,"value":225},{"type":42,"value":252},{"type":36,"tag":254,"props":320,"children":322},{"href":321},"references\u002Fsveltekit.md",[323],{"type":42,"value":321},{"type":36,"tag":51,"props":325,"children":327},{"id":326},"local-development",[328],{"type":42,"value":329},"Local Development",{"type":36,"tag":45,"props":331,"children":332},{},[333],{"type":42,"value":334},"Running a framework project locally with Netlify's platform features (environment variables, Functions, Edge Functions) generally comes from one of two places:",{"type":36,"tag":336,"props":337,"children":339},"h3",{"id":338},"netlify-dev",[340],{"type":36,"tag":63,"props":341,"children":343},{"className":342},[],[344],{"type":42,"value":345},"netlify dev",{"type":36,"tag":347,"props":348,"children":353},"pre",{"className":349,"code":350,"language":351,"meta":352,"style":352},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","netlify dev\n","bash","",[354],{"type":36,"tag":63,"props":355,"children":356},{"__ignoreMap":352},[357],{"type":36,"tag":358,"props":359,"children":362},"span",{"class":360,"line":361},"line",1,[363,368],{"type":36,"tag":358,"props":364,"children":366},{"style":365},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[367],{"type":42,"value":8},{"type":36,"tag":358,"props":369,"children":371},{"style":370},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[372],{"type":42,"value":373}," dev\n",{"type":36,"tag":45,"props":375,"children":376},{},[377],{"type":42,"value":378},"Wraps the framework's own dev server and adds:",{"type":36,"tag":238,"props":380,"children":381},{},[382,387,392],{"type":36,"tag":242,"props":383,"children":384},{},[385],{"type":42,"value":386},"Environment variable injection",{"type":36,"tag":242,"props":388,"children":389},{},[390],{"type":42,"value":391},"Functions and Edge Functions",{"type":36,"tag":242,"props":393,"children":394},{},[395],{"type":42,"value":396},"Redirects and headers processing",{"type":36,"tag":45,"props":398,"children":399},{},[400,402,407,409,415],{"type":42,"value":401},"Works with any framework — run ",{"type":36,"tag":63,"props":403,"children":405},{"className":404},[],[406],{"type":42,"value":345},{"type":42,"value":408}," in place of the framework's native dev command (e.g. instead of ",{"type":36,"tag":63,"props":410,"children":412},{"className":411},[],[413],{"type":42,"value":414},"npm run dev",{"type":42,"value":416},").",{"type":36,"tag":45,"props":418,"children":419},{},[420,422,428,430,436,438,444,446,452,454,460,462,468,470,475,477,482,484,489,491,496,498,504],{"type":42,"value":421},"Custom dev-server wiring — a non-standard ",{"type":36,"tag":63,"props":423,"children":425},{"className":424},[],[426],{"type":42,"value":427},"command",{"type":42,"value":429},", a ",{"type":36,"tag":63,"props":431,"children":433},{"className":432},[],[434],{"type":42,"value":435},"port",{"type":42,"value":437},"\u002F",{"type":36,"tag":63,"props":439,"children":441},{"className":440},[],[442],{"type":42,"value":443},"targetPort",{"type":42,"value":445},", or the ",{"type":36,"tag":63,"props":447,"children":449},{"className":448},[],[450],{"type":42,"value":451},"framework",{"type":42,"value":453}," key — goes in ",{"type":36,"tag":63,"props":455,"children":457},{"className":456},[],[458],{"type":42,"value":459},"netlify.toml",{"type":42,"value":461},"'s ",{"type":36,"tag":63,"props":463,"children":465},{"className":464},[],[466],{"type":42,"value":467},"[dev]",{"type":42,"value":469}," block; see the ",{"type":36,"tag":246,"props":471,"children":472},{},[473],{"type":42,"value":474},"netlify-config",{"type":42,"value":476}," skill for the full syntax. One easy-to-miss rule: if you set both a custom ",{"type":36,"tag":63,"props":478,"children":480},{"className":479},[],[481],{"type":42,"value":427},{"type":42,"value":483}," and a ",{"type":36,"tag":63,"props":485,"children":487},{"className":486},[],[488],{"type":42,"value":443},{"type":42,"value":490},", ",{"type":36,"tag":63,"props":492,"children":494},{"className":493},[],[495],{"type":42,"value":451},{"type":42,"value":497}," must be ",{"type":36,"tag":63,"props":499,"children":501},{"className":500},[],[502],{"type":42,"value":503},"\"#custom\"",{"type":42,"value":505},", otherwise Netlify Dev runs its own detector and silently ignores your command.",{"type":36,"tag":336,"props":507,"children":509},{"id":508},"netlify-vite-plugin-family-vite-based-frameworks",[510],{"type":42,"value":511},"Netlify Vite plugin family (Vite-based frameworks)",{"type":36,"tag":45,"props":513,"children":514},{},[515,517,522,524,529,531,537],{"type":42,"value":516},"For frameworks built on Vite, a Netlify Vite plugin exposes platform primitives (Functions, Blobs, DB, environment variables) directly inside the framework's own dev server, so no ",{"type":36,"tag":63,"props":518,"children":520},{"className":519},[],[521],{"type":42,"value":345},{"type":42,"value":523}," wrapper is needed — run the framework's normal dev command (e.g. ",{"type":36,"tag":63,"props":525,"children":527},{"className":526},[],[528],{"type":42,"value":414},{"type":42,"value":530},") once the plugin is registered in ",{"type":36,"tag":63,"props":532,"children":534},{"className":533},[],[535],{"type":42,"value":536},"vite.config.ts",{"type":42,"value":538},".",{"type":36,"tag":238,"props":540,"children":541},{},[542,559],{"type":36,"tag":242,"props":543,"children":544},{},[545,547,553,555],{"type":42,"value":546},"Vite-based projects (React SPA, SvelteKit, Remix): ",{"type":36,"tag":63,"props":548,"children":550},{"className":549},[],[551],{"type":42,"value":552},"@netlify\u002Fvite-plugin",{"type":42,"value":554}," — see ",{"type":36,"tag":254,"props":556,"children":557},{"href":256},[558],{"type":42,"value":256},{"type":36,"tag":242,"props":560,"children":561},{},[562,564,570,571],{"type":42,"value":563},"TanStack Start: ",{"type":36,"tag":63,"props":565,"children":567},{"className":566},[],[568],{"type":42,"value":569},"@netlify\u002Fvite-plugin-tanstack-start",{"type":42,"value":554},{"type":36,"tag":254,"props":572,"children":573},{"href":282},[574],{"type":42,"value":282},{"type":36,"tag":45,"props":576,"children":577},{},[578,580,585],{"type":42,"value":579},"The per-framework reference guides may also document other local dev options (e.g. ",{"type":36,"tag":63,"props":581,"children":583},{"className":582},[],[584],{"type":42,"value":345},{"type":42,"value":586},") — check the guide for your framework for setup specifics.",{"type":36,"tag":336,"props":588,"children":590},{"id":589},"running-a-single-command-with-the-netlify-environment-loaded",[591],{"type":42,"value":592},"Running a single command with the Netlify environment loaded",{"type":36,"tag":347,"props":594,"children":596},{"className":349,"code":595,"language":351,"meta":352,"style":352},"netlify dev:exec \u003Ccmd>\n",[597],{"type":36,"tag":63,"props":598,"children":599},{"__ignoreMap":352},[600],{"type":36,"tag":358,"props":601,"children":602},{"class":360,"line":361},[603,607,612,618,623,629],{"type":36,"tag":358,"props":604,"children":605},{"style":365},[606],{"type":42,"value":8},{"type":36,"tag":358,"props":608,"children":609},{"style":370},[610],{"type":42,"value":611}," dev:exec",{"type":36,"tag":358,"props":613,"children":615},{"style":614},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[616],{"type":42,"value":617}," \u003C",{"type":36,"tag":358,"props":619,"children":620},{"style":370},[621],{"type":42,"value":622},"cm",{"type":36,"tag":358,"props":624,"children":626},{"style":625},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[627],{"type":42,"value":628},"d",{"type":36,"tag":358,"props":630,"children":631},{"style":614},[632],{"type":42,"value":633},">\n",{"type":36,"tag":45,"props":635,"children":636},{},[637],{"type":42,"value":638},"Loads the Netlify environment (env vars, etc.) for a single command without starting a dev server — useful for scripts, tests, or one-off tasks that need Netlify-managed environment variables.",{"type":36,"tag":51,"props":640,"children":642},{"id":641},"general-patterns",[643],{"type":42,"value":644},"General Patterns",{"type":36,"tag":336,"props":646,"children":648},{"id":647},"client-side-routing-spa",[649],{"type":42,"value":650},"Client-Side Routing (SPA)",{"type":36,"tag":45,"props":652,"children":653},{},[654],{"type":42,"value":655},"For single-page apps with client-side routing, add a catch-all redirect:",{"type":36,"tag":347,"props":657,"children":661},{"className":658,"code":659,"language":660,"meta":352,"style":352},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# netlify.toml\n[[redirects]]\nfrom = \"\u002F*\"\nto = \"\u002Findex.html\"\nstatus = 200\n","toml",[662],{"type":36,"tag":63,"props":663,"children":664},{"__ignoreMap":352},[665,673,682,691,700],{"type":36,"tag":358,"props":666,"children":667},{"class":360,"line":361},[668],{"type":36,"tag":358,"props":669,"children":670},{},[671],{"type":42,"value":672},"# netlify.toml\n",{"type":36,"tag":358,"props":674,"children":676},{"class":360,"line":675},2,[677],{"type":36,"tag":358,"props":678,"children":679},{},[680],{"type":42,"value":681},"[[redirects]]\n",{"type":36,"tag":358,"props":683,"children":685},{"class":360,"line":684},3,[686],{"type":36,"tag":358,"props":687,"children":688},{},[689],{"type":42,"value":690},"from = \"\u002F*\"\n",{"type":36,"tag":358,"props":692,"children":694},{"class":360,"line":693},4,[695],{"type":36,"tag":358,"props":696,"children":697},{},[698],{"type":42,"value":699},"to = \"\u002Findex.html\"\n",{"type":36,"tag":358,"props":701,"children":702},{"class":360,"line":24},[703],{"type":36,"tag":358,"props":704,"children":705},{},[706],{"type":42,"value":707},"status = 200\n",{"type":36,"tag":709,"props":710,"children":711},"blockquote",{},[712],{"type":36,"tag":45,"props":713,"children":714},{},[715,720,722,728,730,735,736,742,744,750],{"type":36,"tag":246,"props":716,"children":717},{},[718],{"type":42,"value":719},"Remove this catch-all when you adopt an SSR adapter.",{"type":42,"value":721}," A ",{"type":36,"tag":63,"props":723,"children":725},{"className":724},[],[726],{"type":42,"value":727},"\u002F* → \u002Findex.html",{"type":42,"value":729}," rule left over from an SPA setup will shadow your server routes: user-defined redirects in ",{"type":36,"tag":63,"props":731,"children":733},{"className":732},[],[734],{"type":42,"value":459},{"type":42,"value":437},{"type":36,"tag":63,"props":737,"children":739},{"className":738},[],[740],{"type":42,"value":741},"_redirects",{"type":42,"value":743}," take precedence over the routes a framework adapter generates, so every request — including SSR pages and API\u002Ffunction routes — is served the static ",{"type":36,"tag":63,"props":745,"children":747},{"className":746},[],[748],{"type":42,"value":749},"index.html",{"type":42,"value":751}," with a 200. When you migrate a client-rendered app to SSR, delete the SPA catch-all.",{"type":36,"tag":336,"props":753,"children":755},{"id":754},"custom-404-pages",[756],{"type":42,"value":757},"Custom 404 Pages",{"type":36,"tag":238,"props":759,"children":760},{},[761,779],{"type":36,"tag":242,"props":762,"children":763},{},[764,769,771,777],{"type":36,"tag":246,"props":765,"children":766},{},[767],{"type":42,"value":768},"Static sites",{"type":42,"value":770},": Create a ",{"type":36,"tag":63,"props":772,"children":774},{"className":773},[],[775],{"type":42,"value":776},"404.html",{"type":42,"value":778}," in your publish directory. Netlify serves it automatically for unmatched routes.",{"type":36,"tag":242,"props":780,"children":781},{},[782,787],{"type":36,"tag":246,"props":783,"children":784},{},[785],{"type":42,"value":786},"SSR frameworks",{"type":42,"value":788},": Handle 404s in the framework's routing (the adapter maps this to Netlify's function routing).",{"type":36,"tag":336,"props":790,"children":792},{"id":791},"environment-variables-in-frameworks",[793],{"type":42,"value":794},"Environment Variables in Frameworks",{"type":36,"tag":45,"props":796,"children":797},{},[798],{"type":42,"value":799},"Each framework exposes environment variables to client-side code differently:",{"type":36,"tag":83,"props":801,"children":802},{},[803,823],{"type":36,"tag":87,"props":804,"children":805},{},[806],{"type":36,"tag":91,"props":807,"children":808},{},[809,813,818],{"type":36,"tag":95,"props":810,"children":811},{},[812],{"type":42,"value":104},{"type":36,"tag":95,"props":814,"children":815},{},[816],{"type":42,"value":817},"Client prefix",{"type":36,"tag":95,"props":819,"children":820},{},[821],{"type":42,"value":822},"Access pattern",{"type":36,"tag":106,"props":824,"children":825},{},[826,852,877,902],{"type":36,"tag":91,"props":827,"children":828},{},[829,834,843],{"type":36,"tag":113,"props":830,"children":831},{},[832],{"type":42,"value":833},"Vite \u002F React",{"type":36,"tag":113,"props":835,"children":836},{},[837],{"type":36,"tag":63,"props":838,"children":840},{"className":839},[],[841],{"type":42,"value":842},"VITE_",{"type":36,"tag":113,"props":844,"children":845},{},[846],{"type":36,"tag":63,"props":847,"children":849},{"className":848},[],[850],{"type":42,"value":851},"import.meta.env.VITE_VAR",{"type":36,"tag":91,"props":853,"children":854},{},[855,859,868],{"type":36,"tag":113,"props":856,"children":857},{},[858],{"type":42,"value":126},{"type":36,"tag":113,"props":860,"children":861},{},[862],{"type":36,"tag":63,"props":863,"children":865},{"className":864},[],[866],{"type":42,"value":867},"PUBLIC_",{"type":36,"tag":113,"props":869,"children":870},{},[871],{"type":36,"tag":63,"props":872,"children":874},{"className":873},[],[875],{"type":42,"value":876},"import.meta.env.PUBLIC_VAR",{"type":36,"tag":91,"props":878,"children":879},{},[880,884,893],{"type":36,"tag":113,"props":881,"children":882},{},[883],{"type":42,"value":143},{"type":36,"tag":113,"props":885,"children":886},{},[887],{"type":36,"tag":63,"props":888,"children":890},{"className":889},[],[891],{"type":42,"value":892},"NEXT_PUBLIC_",{"type":36,"tag":113,"props":894,"children":895},{},[896],{"type":36,"tag":63,"props":897,"children":899},{"className":898},[],[900],{"type":42,"value":901},"process.env.NEXT_PUBLIC_VAR",{"type":36,"tag":91,"props":903,"children":904},{},[905,909,918],{"type":36,"tag":113,"props":906,"children":907},{},[908],{"type":42,"value":160},{"type":36,"tag":113,"props":910,"children":911},{},[912],{"type":36,"tag":63,"props":913,"children":915},{"className":914},[],[916],{"type":42,"value":917},"NUXT_PUBLIC_",{"type":36,"tag":113,"props":919,"children":920},{},[921],{"type":36,"tag":63,"props":922,"children":924},{"className":923},[],[925],{"type":42,"value":926},"useRuntimeConfig().public.var",{"type":36,"tag":45,"props":928,"children":929},{},[930,932,938,940,946,948,954],{"type":42,"value":931},"In server-side code, prefer ",{"type":36,"tag":63,"props":933,"children":935},{"className":934},[],[936],{"type":42,"value":937},"Netlify.env.get(\"VAR\")",{"type":42,"value":939}," to read environment variables. ",{"type":36,"tag":63,"props":941,"children":943},{"className":942},[],[944],{"type":42,"value":945},"process.env.VAR",{"type":42,"value":947}," also works inside Netlify Functions, but Edge Functions expose only ",{"type":36,"tag":63,"props":949,"children":951},{"className":950},[],[952],{"type":42,"value":953},"Netlify.env.get",{"type":42,"value":955}," — the portable form keeps server code working in both.",{"type":36,"tag":45,"props":957,"children":958},{},[959,989],{"type":36,"tag":246,"props":960,"children":961},{},[962,964,969,970,975,976,981,982,987],{"type":42,"value":963},"Never use a client prefix (",{"type":36,"tag":63,"props":965,"children":967},{"className":966},[],[968],{"type":42,"value":842},{"type":42,"value":490},{"type":36,"tag":63,"props":971,"children":973},{"className":972},[],[974],{"type":42,"value":867},{"type":42,"value":490},{"type":36,"tag":63,"props":977,"children":979},{"className":978},[],[980],{"type":42,"value":892},{"type":42,"value":490},{"type":36,"tag":63,"props":983,"children":985},{"className":984},[],[986],{"type":42,"value":917},{"type":42,"value":988},") for secrets.",{"type":42,"value":990}," Client-prefixed variables are inlined into the client bundle and exposed to the browser.",{"type":36,"tag":336,"props":992,"children":994},{"id":993},"environment-variable-changes-require-a-redeploy",[995],{"type":42,"value":996},"Environment Variable Changes Require a Redeploy",{"type":36,"tag":45,"props":998,"children":999},{},[1000,1002,1007,1008,1013,1014,1019,1020,1025,1027,1032,1034,1039],{"type":42,"value":1001},"Client-prefixed vars (",{"type":36,"tag":63,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":42,"value":842},{"type":42,"value":490},{"type":36,"tag":63,"props":1009,"children":1011},{"className":1010},[],[1012],{"type":42,"value":892},{"type":42,"value":490},{"type":36,"tag":63,"props":1015,"children":1017},{"className":1016},[],[1018],{"type":42,"value":867},{"type":42,"value":490},{"type":36,"tag":63,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":42,"value":917},{"type":42,"value":1026},") are ",{"type":36,"tag":246,"props":1028,"children":1029},{},[1030],{"type":42,"value":1031},"inlined into the client bundle at build time",{"type":42,"value":1033}," — their values are compiled into the JavaScript shipped to the browser. Editing one in the Netlify UI or CLI has no effect on the live site until a new build runs. The same applies server-side: Netlify injects environment variables at build time, so changing a value in the dashboard does ",{"type":36,"tag":246,"props":1035,"children":1036},{},[1037],{"type":42,"value":1038},"not",{"type":42,"value":1040}," propagate to already-deployed functions on the next request. Any env var change — client- or server-side — requires a redeploy to take effect. If a value looks stale after you changed it, trigger a new deploy.",{"type":36,"tag":336,"props":1042,"children":1044},{"id":1043},"runtime-file-reads-in-adapter-generated-functions",[1045],{"type":42,"value":1046},"Runtime File Reads in Adapter-Generated Functions",{"type":36,"tag":45,"props":1048,"children":1049},{},[1050,1052,1058,1060,1064,1066,1071,1073,1079,1081,1087,1089,1095,1097,1103,1105,1111],{"type":42,"value":1051},"When an adapter turns your server code into a Netlify Function, only traced module dependencies are bundled. Arbitrary files you read from disk at runtime — a local JSON\u002FMarkdown data file, an email template, an ",{"type":36,"tag":63,"props":1053,"children":1055},{"className":1054},[],[1056],{"type":42,"value":1057},"fs.readFile()",{"type":42,"value":1059}," target — are ",{"type":36,"tag":246,"props":1061,"children":1062},{},[1063],{"type":42,"value":1038},{"type":42,"value":1065}," uploaded with the function unless you declare them. Such a read succeeds under ",{"type":36,"tag":63,"props":1067,"children":1069},{"className":1068},[],[1070],{"type":42,"value":414},{"type":42,"value":1072}," (the whole project is on disk) but throws ",{"type":36,"tag":63,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":42,"value":1078},"ENOENT",{"type":42,"value":1080}," in production. Declare the files so they ship with the function: in Next.js set ",{"type":36,"tag":63,"props":1082,"children":1084},{"className":1083},[],[1085],{"type":42,"value":1086},"outputFileTracingIncludes",{"type":42,"value":1088}," in ",{"type":36,"tag":63,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":42,"value":1094},"next.config",{"type":42,"value":1096},"; for a hand-written Netlify Function use ",{"type":36,"tag":63,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":42,"value":1102},"included_files",{"type":42,"value":1104}," in its ",{"type":36,"tag":63,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":42,"value":1110},"config",{"type":42,"value":1112},". Never assume the project filesystem is present at function runtime.",{"type":36,"tag":1114,"props":1115,"children":1116},"style",{},[1117],{"type":42,"value":1118},"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":1120,"total":1296},[1121,1140,1152,1169,1184,1199,1216,1231,1240,1255,1266,1281],{"slug":1122,"name":1122,"fn":1123,"description":1124,"org":1125,"tags":1126,"stars":1137,"repoUrl":1138,"updatedAt":1139},"configure-axis","configure AXIS agent evaluation scenarios","Author AXIS (Agent Experience Index Score) scenarios and axis.config.json for a project. Use when the user asks to set up AXIS, add a scenario, write or edit axis.config.json, or evaluate an AI agent with AXIS.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1127,1130,1133,1136],{"name":1128,"slug":1129,"type":13},"Agents","agents",{"name":1131,"slug":1132,"type":13},"Configuration","configuration",{"name":1134,"slug":1135,"type":13},"Evals","evals",{"name":9,"slug":8,"type":13},32,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Faxis","2026-07-20T05:59:47.468757",{"slug":1141,"name":1141,"fn":1142,"description":1143,"org":1144,"tags":1145,"stars":1137,"repoUrl":1138,"updatedAt":1151},"using-axis","run and interpret AXIS reports","Run AXIS, read its reports, navigate its project layout, and interpret scores. Use when the user asks to run AXIS, invoke the CLI, compare runs, explain a score, find a regression, manage baselines, or understand where AXIS writes its files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1146,1149,1150],{"name":1147,"slug":1148,"type":13},"CLI","cli",{"name":1134,"slug":1135,"type":13},{"name":9,"slug":8,"type":13},"2026-07-14T05:40:13.443461",{"slug":1153,"name":1153,"fn":1154,"description":1155,"org":1156,"tags":1157,"stars":20,"repoUrl":21,"updatedAt":1168},"netlify-access-control","manage Netlify site access control","Use when the task involves controlling who can reach a Netlify site, or telling Netlify Identity apart from Secure Access. Trigger whenever the user wants to lock a site or deploy to their company\u002Fteam, restrict access to employees only, build an internal or employees-only app, set up password protection, SSO, or SAML, asks \"who can access my site\", or is confused about Netlify Identity vs Secure Access vs team login vs OAuth providers. Routes the request to the right layer — app-level Identity, site-visitor Password Protection, the Auth0 extension, or Team\u002FOrg SAML SSO — and explains the two-layer (perimeter + in-app identity) pattern and its double-login tradeoff. For building the app-level auth itself, use the netlify-identity skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1158,1161,1162,1165],{"name":1159,"slug":1160,"type":13},"Access Control","access-control",{"name":9,"slug":8,"type":13},{"name":1163,"slug":1164,"type":13},"Permissions","permissions",{"name":1166,"slug":1167,"type":13},"Security","security","2026-07-14T05:40:29.082149",{"slug":1170,"name":1170,"fn":1171,"description":1172,"org":1173,"tags":1174,"stars":20,"repoUrl":21,"updatedAt":1183},"netlify-agent-runner","run AI agent tasks on Netlify","Run AI agent tasks remotely on Netlify using Claude, Codex, or Gemini. Use when the user wants to run an AI agent on their site, get a second opinion from another model, or delegate development tasks to run remotely against their repo.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1175,1176,1179,1182],{"name":1128,"slug":1129,"type":13},{"name":1177,"slug":1178,"type":13},"Automation","automation",{"name":1180,"slug":1181,"type":13},"LLM","llm",{"name":9,"slug":8,"type":13},"2026-07-17T05:30:19.462913",{"slug":1185,"name":1185,"fn":1186,"description":1187,"org":1188,"tags":1189,"stars":20,"repoUrl":21,"updatedAt":1198},"netlify-ai-gateway","route AI requests via Netlify AI Gateway","Reference for Netlify AI Gateway — the managed proxy that routes calls to OpenAI, Anthropic, and Google Gemini SDKs without provider API keys. Use this skill any time the user wants to add AI on a Netlify site (chat, completion, reasoning, image generation, image-to-image edit\u002Fstylize), choose or change a model, wire up the OpenAI \u002F Anthropic \u002F @google\u002Fgenai SDK, decide which provider to use for an image-gen feature (it's Gemini-only on the gateway), or debug \"model not found\" \u002F \"API key missing\" against the gateway. Required reading before pinning a model — the gateway exposes a curated subset, not every provider model.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1190,1193,1196,1197],{"name":1191,"slug":1192,"type":13},"AI Infrastructure","ai-infrastructure",{"name":1194,"slug":1195,"type":13},"API Development","api-development",{"name":1180,"slug":1181,"type":13},{"name":9,"slug":8,"type":13},"2026-07-17T05:30:13.14555",{"slug":1200,"name":1200,"fn":1201,"description":1202,"org":1203,"tags":1204,"stars":20,"repoUrl":21,"updatedAt":1215},"netlify-blobs","manage file storage with Netlify Blobs","Guide for using Netlify Blobs for file and asset storage — images, documents, uploads, exports, cached binary artifacts. Covers getStore(), CRUD operations, metadata, listing, deploy-scoped vs site-scoped stores, and local development. Do NOT use Blobs as a dynamic data store — use Netlify Database for that.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1205,1208,1211,1212],{"name":1206,"slug":1207,"type":13},"Backend","backend",{"name":1209,"slug":1210,"type":13},"File Storage","file-storage",{"name":9,"slug":8,"type":13},{"name":1213,"slug":1214,"type":13},"Storage","storage","2026-07-17T05:30:16.503306",{"slug":1217,"name":1217,"fn":1218,"description":1219,"org":1220,"tags":1221,"stars":20,"repoUrl":21,"updatedAt":1230},"netlify-caching","configure CDN caching on Netlify","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.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1222,1225,1226,1227],{"name":1223,"slug":1224,"type":13},"Caching","caching",{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":1228,"slug":1229,"type":13},"Performance","performance","2026-07-14T05:40:20.066717",{"slug":474,"name":474,"fn":1232,"description":1233,"org":1234,"tags":1235,"stars":20,"repoUrl":21,"updatedAt":1239},"configure Netlify site settings","Reference for netlify.toml configuration and site environment variables. Use when configuring build settings, redirects, rewrites, headers, deploy contexts, the `[dev]` block that controls `netlify dev` (command, port, targetPort, framework), or any site-level configuration — and when managing environment variables or secrets with the Netlify CLI, including scoping values to specific deploy contexts. Covers the complete netlify.toml syntax including redirects with splats\u002Fconditions, headers, deploy contexts, functions config, edge functions config, and the `[dev]` block (including when `framework` must be `\"#custom\"` — required when both a custom `command` and `targetPort` are set).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1236,1237,1238],{"name":1131,"slug":1132,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},"2026-07-17T05:30:21.284801",{"slug":1241,"name":1241,"fn":1242,"description":1243,"org":1244,"tags":1245,"stars":20,"repoUrl":21,"updatedAt":1254},"netlify-database","provision and manage Netlify Database","Guide for using Netlify Database — the GA managed Postgres product built into Netlify. Use when a project needs any kind of dynamic, structured, or relational data. Covers provisioning via @netlify\u002Fdatabase, Drizzle ORM (@beta) setup, migrations, preview branching, and safe production data handling. Blobs is only for file\u002Fasset storage — any dynamic data belongs in the database.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1246,1247,1250,1251],{"name":1206,"slug":1207,"type":13},{"name":1248,"slug":1249,"type":13},"Database","database",{"name":9,"slug":8,"type":13},{"name":1252,"slug":1253,"type":13},"PostgreSQL","postgresql","2026-07-20T05:58:58.934045",{"slug":1256,"name":1256,"fn":1257,"description":1258,"org":1259,"tags":1260,"stars":20,"repoUrl":21,"updatedAt":1265},"netlify-deploy","deploy and host projects on Netlify","Deploy, host, and publish web projects on Netlify with the Netlify CLI. Use when the user wants to deploy a site or repository to Netlify, link a local project to a Netlify site, ship a production or preview\u002Fdraft deploy, set up Git-based continuous deployment, run a manual or local deploy, configure CI deploys, or troubleshoot a failed or misconfigured deploy. Also use to view or tail a deployed site's runtime logs — function and edge-function output, deploy logs — via `netlify logs` when debugging what a live site is doing (recent errors, recent activity, streaming output).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1261,1262,1263,1264],{"name":1147,"slug":1148,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13},"2026-07-17T05:30:14.218977",{"slug":1267,"name":1267,"fn":1268,"description":1269,"org":1270,"tags":1271,"stars":20,"repoUrl":21,"updatedAt":1280},"netlify-edge-functions","write Netlify Edge Functions","Guide for writing Netlify Edge Functions. Use when building middleware, geolocation-based logic, request\u002Fresponse manipulation, authentication checks, A\u002FB testing, or any low-latency edge compute. Covers Deno runtime, context.next() middleware pattern, geolocation, and when to choose edge vs serverless.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1272,1275,1278,1279],{"name":1273,"slug":1274,"type":13},"Edge Functions","edge-functions",{"name":1276,"slug":1277,"type":13},"Middleware","middleware",{"name":9,"slug":8,"type":13},{"name":1228,"slug":1229,"type":13},"2026-07-14T05:40:34.147865",{"slug":1282,"name":1282,"fn":1283,"description":1284,"org":1285,"tags":1286,"stars":20,"repoUrl":21,"updatedAt":1295},"netlify-forms","handle HTML forms with Netlify","Guide for using Netlify Forms for HTML form handling. Use when adding contact forms, feedback forms, file upload forms, or any form that should be collected by Netlify. Covers the data-netlify attribute, spam filtering, AJAX submissions, file uploads, notifications, and the submissions API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1287,1290,1293,1294],{"name":1288,"slug":1289,"type":13},"Forms","forms",{"name":1291,"slug":1292,"type":13},"HTML","html",{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13},"2026-07-14T05:40:16.075367",17,{"items":1298,"total":1347},[1299,1306,1313,1320,1327,1334,1340],{"slug":1153,"name":1153,"fn":1154,"description":1155,"org":1300,"tags":1301,"stars":20,"repoUrl":21,"updatedAt":1168},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1302,1303,1304,1305],{"name":1159,"slug":1160,"type":13},{"name":9,"slug":8,"type":13},{"name":1163,"slug":1164,"type":13},{"name":1166,"slug":1167,"type":13},{"slug":1170,"name":1170,"fn":1171,"description":1172,"org":1307,"tags":1308,"stars":20,"repoUrl":21,"updatedAt":1183},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1309,1310,1311,1312],{"name":1128,"slug":1129,"type":13},{"name":1177,"slug":1178,"type":13},{"name":1180,"slug":1181,"type":13},{"name":9,"slug":8,"type":13},{"slug":1185,"name":1185,"fn":1186,"description":1187,"org":1314,"tags":1315,"stars":20,"repoUrl":21,"updatedAt":1198},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1316,1317,1318,1319],{"name":1191,"slug":1192,"type":13},{"name":1194,"slug":1195,"type":13},{"name":1180,"slug":1181,"type":13},{"name":9,"slug":8,"type":13},{"slug":1200,"name":1200,"fn":1201,"description":1202,"org":1321,"tags":1322,"stars":20,"repoUrl":21,"updatedAt":1215},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1323,1324,1325,1326],{"name":1206,"slug":1207,"type":13},{"name":1209,"slug":1210,"type":13},{"name":9,"slug":8,"type":13},{"name":1213,"slug":1214,"type":13},{"slug":1217,"name":1217,"fn":1218,"description":1219,"org":1328,"tags":1329,"stars":20,"repoUrl":21,"updatedAt":1230},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1330,1331,1332,1333],{"name":1223,"slug":1224,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":1228,"slug":1229,"type":13},{"slug":474,"name":474,"fn":1232,"description":1233,"org":1335,"tags":1336,"stars":20,"repoUrl":21,"updatedAt":1239},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1337,1338,1339],{"name":1131,"slug":1132,"type":13},{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"slug":1241,"name":1241,"fn":1242,"description":1243,"org":1341,"tags":1342,"stars":20,"repoUrl":21,"updatedAt":1254},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1343,1344,1345,1346],{"name":1206,"slug":1207,"type":13},{"name":1248,"slug":1249,"type":13},{"name":9,"slug":8,"type":13},{"name":1252,"slug":1253,"type":13},15]