[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-netlify-netlify-edge-functions":3,"mdc-rp9epo-key":33,"related-repo-netlify-netlify-edge-functions":2814,"related-org-netlify-netlify-edge-functions":2925},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":31,"mdContent":32},"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},"netlify","Netlify","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnetlify.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Performance","performance","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Middleware","middleware",{"name":21,"slug":22,"type":15},"Edge Functions","edge-functions",24,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools","2026-07-14T05:40:34.147865",null,5,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools\u002Ftree\u002FHEAD\u002Fskills\u002Fnetlify-edge-functions","---\nname: netlify-edge-functions\ndescription: 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.\n---\n\n# Netlify Edge Functions\n\nEdge functions run on Netlify's globally distributed edge network (Deno runtime), providing low-latency responses close to users.\n\n## Check the framework adapter first\n\nFor framework projects, check the framework reference (the **netlify-frameworks** skill) before hand-writing an edge function — framework adapters emit their own edge middleware, so the behavior you need may already be generated. A custom edge function that duplicates adapter-generated middleware causes conflicts.\n\n## Syntax\n\n```typescript\nimport type { Config, Context } from \"@netlify\u002Fedge-functions\";\n\nexport default async (req: Request, context: Context) => {\n  return new Response(\"Hello from the edge!\");\n};\n\nexport const config: Config = {\n  path: \"\u002Fhello\",\n};\n```\n\nPlace files in `netlify\u002Fedge-functions\u002F`. Uses `.ts`, `.js`, `.tsx`, or `.jsx` extensions.\n\n## Config Object\n\n```typescript\nexport const config: Config = {\n  path: \"\u002Fapi\u002F*\",                    \u002F\u002F URLPattern path(s)\n  excludedPath: \"\u002Fapi\u002Fpublic\u002F*\",     \u002F\u002F Exclusions\n  method: [\"GET\", \"POST\"],           \u002F\u002F HTTP methods\n  onError: \"bypass\",                 \u002F\u002F \"fail\" (default), \"bypass\", or \"\u002Ferror-page\"\n  cache: \"manual\",                   \u002F\u002F Enable response caching\n};\n```\n\n**Scope `path` narrowly — `path: \"\u002F*\"` intercepts every request, including static assets.** A `\u002F*` match runs the edge function on every CSS, JS, image, and font request, not just your HTML pages — adding latency to each asset and billing an edge invocation for it. Match only the routes you need (e.g. `path: \"\u002F\"`, `path: \"\u002Fapp\u002F*\"`), or keep a broad path but exclude static assets with `excludedPath` (e.g. `excludedPath: [\"\u002F*.css\", \"\u002F*.js\", \"\u002F*.png\", \"\u002F*.woff2\"]`).\n\n**Cache headers on an edge response do nothing without `cache: \"manual\"`.** Setting `Cache-Control` (or any cache header) on the `Response` an edge function returns has no effect unless the function also opts in with `config.cache = \"manual\"`. It's both or neither: without the flag the response is never cached, no matter what headers you set.\n\n## Declaring edge functions: inline config vs netlify.toml\n\nAn edge function runs only if it is bound to a path. Bind it either with an inline `export const config = { path: ... }` in the function file (shown above), or with an `[[edge_functions]]` entry in `netlify.toml` that names the file:\n\n```toml\n[[edge_functions]]\n  path = \"\u002Fadmin\u002F*\"\n  function = \"auth\"        # runs netlify\u002Fedge-functions\u002Fauth.ts\n```\n\n**A file in `netlify\u002Fedge-functions\u002F` with no path binding still deploys, but silently never runs.** There is no build error and no warning — nothing routes a request to it, so it is never invoked. If an edge function \"isn't doing anything,\" first confirm it declares a `path` inline or has a matching `[[edge_functions]]` entry.\n\n### Chaining multiple edge functions on one path\n\nWhen several edge functions match the same path, they run as a chain in this order:\n\n1. Functions declared in `netlify.toml` run first, **in the order they appear** in the file (top to bottom).\n2. Functions declared inline (via `export const config`) run next, **in alphabetical order by filename**.\n3. Functions configured for caching (`cache: \"manual\"`) always run after non-caching ones.\n\nTo guarantee a specific order (e.g. an auth gate that must run before a personalization rewrite), declare the functions in `netlify.toml` in the order you want — don't depend on inline config, whose order is alphabetical by filename and easy to get wrong. Declaring the same function both inline and in `netlify.toml` merges them into an inline declaration (inline config wins), which forfeits the deterministic `netlify.toml` ordering.\n\n## Edge functions run before redirects\n\nIn Netlify's request chain, edge functions execute **before** redirect and rewrite rules (`[[redirects]]`, `_redirects`). Two consequences bite often:\n\n- An edge function is matched against the **original** requested URL, not a redirect\u002Frewrite destination. Scope its `path` to the URL the client actually requests — an edge function declared on the *target* of a rewrite will not fire for requests that only reach that target via the rewrite.\n- If an edge function returns a `Response`, the request chain stops there and redirect rules for that path **never run**. Return `context.next()` (or `undefined`) if you want redirects to still apply.\n\n## Middleware Pattern\n\nUse `context.next()` to invoke the next handler in the chain and optionally modify the response:\n\n```typescript\nexport default async (req: Request, context: Context) => {\n  \u002F\u002F Before: modify request or short-circuit\n  if (!isAuthenticated(req)) {\n    return new Response(\"Unauthorized\", { status: 401 });\n  }\n\n  \u002F\u002F Continue to origin\u002Fnext function\n  const response = await context.next();\n\n  \u002F\u002F After: modify response\n  response.headers.set(\"x-custom-header\", \"value\");\n  return response;\n};\n```\n\nReturn `undefined` to pass through without modification:\n\n```typescript\nexport default async (req: Request, context: Context) => {\n  if (!shouldHandle(req)) return; \u002F\u002F continues to next handler\n  return new Response(\"Handled\");\n};\n```\n\n## Geolocation and IP\n\n```typescript\nexport default async (req: Request, context: Context) => {\n  const { city, country, subdivision, timezone } = context.geo;\n  const ip = context.ip;\n\n  if (country?.code === \"DE\") {\n    return Response.redirect(new URL(\"\u002Fde\", req.url));\n  }\n};\n```\n\nLocal dev with mocked geo: `netlify dev --geo=mock --country=US`\n\n## Cookies\n\nRead and write cookies through the `context.cookies` helper instead of hand-parsing the `Cookie` header or building `Set-Cookie` strings:\n\n```typescript\nexport default async (req: Request, context: Context) => {\n  const bucket = context.cookies.get(\"bucket\");            \u002F\u002F read from the request\n  context.cookies.set({ name: \"bucket\", value: \"a\" });     \u002F\u002F set on the response\n  context.cookies.delete(\"legacy_session\");                \u002F\u002F tell the client to delete it\n  return context.next();\n};\n```\n\n- `cookies.get(name)` — reads a named cookie from the incoming request.\n- `cookies.set(options)` — sets a cookie on the outgoing response (same option shape as the web `CookieStore.set` standard).\n- `cookies.delete(name)` — instructs the client to delete the cookie.\n\n## Environment Variables\n\nUse `Netlify.env` (not `process.env` or `Deno.env`):\n\n```typescript\nconst secret = Netlify.env.get(\"API_SECRET\");\n```\n\n## Module Support\n\n- **Node.js builtins**: `import { randomBytes } from \"node:crypto\";`\n- **npm packages**: Install via npm and import by name\n- **Deno modules**: URL imports (e.g., `import X from \"https:\u002F\u002Fesm.sh\u002Fpackage\"`)\n\nFor URL imports, use an import map:\n\n```json\n\u002F\u002F import_map.json\n{ \"imports\": { \"html-rewriter\": \"https:\u002F\u002Fghuc.cc\u002Fworker-tools\u002Fhtml-rewriter\u002Findex.ts\" } }\n```\n\n```toml\n# netlify.toml\n[functions]\n  deno_import_map = \".\u002Fimport_map.json\"\n```\n\n## When to Use Edge vs Serverless\n\n| Use Edge Functions for | Use Serverless Functions for |\n|---|---|\n| Low-latency responses | Long-running operations (up to 15 min) |\n| Request\u002Fresponse manipulation | Complex Node.js dependencies |\n| Geolocation-based logic | Database-heavy operations |\n| Auth checks and redirects | Background\u002Fscheduled tasks |\n| A\u002FB testing, personalization | Tasks needing > 512 MB memory |\n\n## Limits\n\n| Resource | Limit |\n|---|---|\n| CPU time | 50 ms per request |\n| Memory | 512 MB per deployed set |\n| Response header timeout | 40 seconds |\n| Code size | 20 MB compressed |\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,46,52,59,72,78,381,425,431,673,738,780,786,815,848,879,886,891,946,972,978,1005,1071,1077,1089,1447,1459,1619,1625,1943,1954,1960,1989,2307,2351,2357,2385,2457,2463,2509,2514,2598,2629,2635,2728,2734,2808],{"type":39,"tag":40,"props":41,"children":42},"element","h1",{"id":4},[43],{"type":44,"value":45},"text","Netlify Edge Functions",{"type":39,"tag":47,"props":48,"children":49},"p",{},[50],{"type":44,"value":51},"Edge functions run on Netlify's globally distributed edge network (Deno runtime), providing low-latency responses close to users.",{"type":39,"tag":53,"props":54,"children":56},"h2",{"id":55},"check-the-framework-adapter-first",[57],{"type":44,"value":58},"Check the framework adapter first",{"type":39,"tag":47,"props":60,"children":61},{},[62,64,70],{"type":44,"value":63},"For framework projects, check the framework reference (the ",{"type":39,"tag":65,"props":66,"children":67},"strong",{},[68],{"type":44,"value":69},"netlify-frameworks",{"type":44,"value":71}," skill) before hand-writing an edge function — framework adapters emit their own edge middleware, so the behavior you need may already be generated. A custom edge function that duplicates adapter-generated middleware causes conflicts.",{"type":39,"tag":53,"props":73,"children":75},{"id":74},"syntax",[76],{"type":44,"value":77},"Syntax",{"type":39,"tag":79,"props":80,"children":85},"pre",{"className":81,"code":82,"language":83,"meta":84,"style":84},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { Config, Context } from \"@netlify\u002Fedge-functions\";\n\nexport default async (req: Request, context: Context) => {\n  return new Response(\"Hello from the edge!\");\n};\n\nexport const config: Config = {\n  path: \"\u002Fhello\",\n};\n","typescript","",[86],{"type":39,"tag":87,"props":88,"children":89},"code",{"__ignoreMap":84},[90,160,170,244,291,299,307,342,373],{"type":39,"tag":91,"props":92,"children":95},"span",{"class":93,"line":94},"line",1,[96,102,107,113,119,124,129,134,139,144,150,155],{"type":39,"tag":91,"props":97,"children":99},{"style":98},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[100],{"type":44,"value":101},"import",{"type":39,"tag":91,"props":103,"children":104},{"style":98},[105],{"type":44,"value":106}," type",{"type":39,"tag":91,"props":108,"children":110},{"style":109},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[111],{"type":44,"value":112}," {",{"type":39,"tag":91,"props":114,"children":116},{"style":115},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[117],{"type":44,"value":118}," Config",{"type":39,"tag":91,"props":120,"children":121},{"style":109},[122],{"type":44,"value":123},",",{"type":39,"tag":91,"props":125,"children":126},{"style":115},[127],{"type":44,"value":128}," Context",{"type":39,"tag":91,"props":130,"children":131},{"style":109},[132],{"type":44,"value":133}," }",{"type":39,"tag":91,"props":135,"children":136},{"style":98},[137],{"type":44,"value":138}," from",{"type":39,"tag":91,"props":140,"children":141},{"style":109},[142],{"type":44,"value":143}," \"",{"type":39,"tag":91,"props":145,"children":147},{"style":146},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[148],{"type":44,"value":149},"@netlify\u002Fedge-functions",{"type":39,"tag":91,"props":151,"children":152},{"style":109},[153],{"type":44,"value":154},"\"",{"type":39,"tag":91,"props":156,"children":157},{"style":109},[158],{"type":44,"value":159},";\n",{"type":39,"tag":91,"props":161,"children":163},{"class":93,"line":162},2,[164],{"type":39,"tag":91,"props":165,"children":167},{"emptyLinePlaceholder":166},true,[168],{"type":44,"value":169},"\n",{"type":39,"tag":91,"props":171,"children":173},{"class":93,"line":172},3,[174,179,184,190,195,201,206,212,216,221,225,229,234,239],{"type":39,"tag":91,"props":175,"children":176},{"style":98},[177],{"type":44,"value":178},"export",{"type":39,"tag":91,"props":180,"children":181},{"style":98},[182],{"type":44,"value":183}," default",{"type":39,"tag":91,"props":185,"children":187},{"style":186},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[188],{"type":44,"value":189}," async",{"type":39,"tag":91,"props":191,"children":192},{"style":109},[193],{"type":44,"value":194}," (",{"type":39,"tag":91,"props":196,"children":198},{"style":197},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[199],{"type":44,"value":200},"req",{"type":39,"tag":91,"props":202,"children":203},{"style":109},[204],{"type":44,"value":205},":",{"type":39,"tag":91,"props":207,"children":209},{"style":208},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[210],{"type":44,"value":211}," Request",{"type":39,"tag":91,"props":213,"children":214},{"style":109},[215],{"type":44,"value":123},{"type":39,"tag":91,"props":217,"children":218},{"style":197},[219],{"type":44,"value":220}," context",{"type":39,"tag":91,"props":222,"children":223},{"style":109},[224],{"type":44,"value":205},{"type":39,"tag":91,"props":226,"children":227},{"style":208},[228],{"type":44,"value":128},{"type":39,"tag":91,"props":230,"children":231},{"style":109},[232],{"type":44,"value":233},")",{"type":39,"tag":91,"props":235,"children":236},{"style":186},[237],{"type":44,"value":238}," =>",{"type":39,"tag":91,"props":240,"children":241},{"style":109},[242],{"type":44,"value":243}," {\n",{"type":39,"tag":91,"props":245,"children":247},{"class":93,"line":246},4,[248,253,258,264,270,274,279,283,287],{"type":39,"tag":91,"props":249,"children":250},{"style":98},[251],{"type":44,"value":252},"  return",{"type":39,"tag":91,"props":254,"children":255},{"style":109},[256],{"type":44,"value":257}," new",{"type":39,"tag":91,"props":259,"children":261},{"style":260},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[262],{"type":44,"value":263}," Response",{"type":39,"tag":91,"props":265,"children":267},{"style":266},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[268],{"type":44,"value":269},"(",{"type":39,"tag":91,"props":271,"children":272},{"style":109},[273],{"type":44,"value":154},{"type":39,"tag":91,"props":275,"children":276},{"style":146},[277],{"type":44,"value":278},"Hello from the edge!",{"type":39,"tag":91,"props":280,"children":281},{"style":109},[282],{"type":44,"value":154},{"type":39,"tag":91,"props":284,"children":285},{"style":266},[286],{"type":44,"value":233},{"type":39,"tag":91,"props":288,"children":289},{"style":109},[290],{"type":44,"value":159},{"type":39,"tag":91,"props":292,"children":293},{"class":93,"line":27},[294],{"type":39,"tag":91,"props":295,"children":296},{"style":109},[297],{"type":44,"value":298},"};\n",{"type":39,"tag":91,"props":300,"children":302},{"class":93,"line":301},6,[303],{"type":39,"tag":91,"props":304,"children":305},{"emptyLinePlaceholder":166},[306],{"type":44,"value":169},{"type":39,"tag":91,"props":308,"children":310},{"class":93,"line":309},7,[311,315,320,325,329,333,338],{"type":39,"tag":91,"props":312,"children":313},{"style":98},[314],{"type":44,"value":178},{"type":39,"tag":91,"props":316,"children":317},{"style":186},[318],{"type":44,"value":319}," const",{"type":39,"tag":91,"props":321,"children":322},{"style":115},[323],{"type":44,"value":324}," config",{"type":39,"tag":91,"props":326,"children":327},{"style":109},[328],{"type":44,"value":205},{"type":39,"tag":91,"props":330,"children":331},{"style":208},[332],{"type":44,"value":118},{"type":39,"tag":91,"props":334,"children":335},{"style":109},[336],{"type":44,"value":337}," =",{"type":39,"tag":91,"props":339,"children":340},{"style":109},[341],{"type":44,"value":243},{"type":39,"tag":91,"props":343,"children":345},{"class":93,"line":344},8,[346,351,355,359,364,368],{"type":39,"tag":91,"props":347,"children":348},{"style":266},[349],{"type":44,"value":350},"  path",{"type":39,"tag":91,"props":352,"children":353},{"style":109},[354],{"type":44,"value":205},{"type":39,"tag":91,"props":356,"children":357},{"style":109},[358],{"type":44,"value":143},{"type":39,"tag":91,"props":360,"children":361},{"style":146},[362],{"type":44,"value":363},"\u002Fhello",{"type":39,"tag":91,"props":365,"children":366},{"style":109},[367],{"type":44,"value":154},{"type":39,"tag":91,"props":369,"children":370},{"style":109},[371],{"type":44,"value":372},",\n",{"type":39,"tag":91,"props":374,"children":376},{"class":93,"line":375},9,[377],{"type":39,"tag":91,"props":378,"children":379},{"style":109},[380],{"type":44,"value":298},{"type":39,"tag":47,"props":382,"children":383},{},[384,386,392,394,400,402,408,409,415,417,423],{"type":44,"value":385},"Place files in ",{"type":39,"tag":87,"props":387,"children":389},{"className":388},[],[390],{"type":44,"value":391},"netlify\u002Fedge-functions\u002F",{"type":44,"value":393},". Uses ",{"type":39,"tag":87,"props":395,"children":397},{"className":396},[],[398],{"type":44,"value":399},".ts",{"type":44,"value":401},", ",{"type":39,"tag":87,"props":403,"children":405},{"className":404},[],[406],{"type":44,"value":407},".js",{"type":44,"value":401},{"type":39,"tag":87,"props":410,"children":412},{"className":411},[],[413],{"type":44,"value":414},".tsx",{"type":44,"value":416},", or ",{"type":39,"tag":87,"props":418,"children":420},{"className":419},[],[421],{"type":44,"value":422},".jsx",{"type":44,"value":424}," extensions.",{"type":39,"tag":53,"props":426,"children":428},{"id":427},"config-object",[429],{"type":44,"value":430},"Config Object",{"type":39,"tag":79,"props":432,"children":434},{"className":81,"code":433,"language":83,"meta":84,"style":84},"export const config: Config = {\n  path: \"\u002Fapi\u002F*\",                    \u002F\u002F URLPattern path(s)\n  excludedPath: \"\u002Fapi\u002Fpublic\u002F*\",     \u002F\u002F Exclusions\n  method: [\"GET\", \"POST\"],           \u002F\u002F HTTP methods\n  onError: \"bypass\",                 \u002F\u002F \"fail\" (default), \"bypass\", or \"\u002Ferror-page\"\n  cache: \"manual\",                   \u002F\u002F Enable response caching\n};\n",[435],{"type":39,"tag":87,"props":436,"children":437},{"__ignoreMap":84},[438,469,503,537,598,632,666],{"type":39,"tag":91,"props":439,"children":440},{"class":93,"line":94},[441,445,449,453,457,461,465],{"type":39,"tag":91,"props":442,"children":443},{"style":98},[444],{"type":44,"value":178},{"type":39,"tag":91,"props":446,"children":447},{"style":186},[448],{"type":44,"value":319},{"type":39,"tag":91,"props":450,"children":451},{"style":115},[452],{"type":44,"value":324},{"type":39,"tag":91,"props":454,"children":455},{"style":109},[456],{"type":44,"value":205},{"type":39,"tag":91,"props":458,"children":459},{"style":208},[460],{"type":44,"value":118},{"type":39,"tag":91,"props":462,"children":463},{"style":109},[464],{"type":44,"value":337},{"type":39,"tag":91,"props":466,"children":467},{"style":109},[468],{"type":44,"value":243},{"type":39,"tag":91,"props":470,"children":471},{"class":93,"line":162},[472,476,480,484,489,493,497],{"type":39,"tag":91,"props":473,"children":474},{"style":266},[475],{"type":44,"value":350},{"type":39,"tag":91,"props":477,"children":478},{"style":109},[479],{"type":44,"value":205},{"type":39,"tag":91,"props":481,"children":482},{"style":109},[483],{"type":44,"value":143},{"type":39,"tag":91,"props":485,"children":486},{"style":146},[487],{"type":44,"value":488},"\u002Fapi\u002F*",{"type":39,"tag":91,"props":490,"children":491},{"style":109},[492],{"type":44,"value":154},{"type":39,"tag":91,"props":494,"children":495},{"style":109},[496],{"type":44,"value":123},{"type":39,"tag":91,"props":498,"children":500},{"style":499},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[501],{"type":44,"value":502},"                    \u002F\u002F URLPattern path(s)\n",{"type":39,"tag":91,"props":504,"children":505},{"class":93,"line":172},[506,511,515,519,524,528,532],{"type":39,"tag":91,"props":507,"children":508},{"style":266},[509],{"type":44,"value":510},"  excludedPath",{"type":39,"tag":91,"props":512,"children":513},{"style":109},[514],{"type":44,"value":205},{"type":39,"tag":91,"props":516,"children":517},{"style":109},[518],{"type":44,"value":143},{"type":39,"tag":91,"props":520,"children":521},{"style":146},[522],{"type":44,"value":523},"\u002Fapi\u002Fpublic\u002F*",{"type":39,"tag":91,"props":525,"children":526},{"style":109},[527],{"type":44,"value":154},{"type":39,"tag":91,"props":529,"children":530},{"style":109},[531],{"type":44,"value":123},{"type":39,"tag":91,"props":533,"children":534},{"style":499},[535],{"type":44,"value":536},"     \u002F\u002F Exclusions\n",{"type":39,"tag":91,"props":538,"children":539},{"class":93,"line":246},[540,545,549,554,558,563,567,571,575,580,584,589,593],{"type":39,"tag":91,"props":541,"children":542},{"style":266},[543],{"type":44,"value":544},"  method",{"type":39,"tag":91,"props":546,"children":547},{"style":109},[548],{"type":44,"value":205},{"type":39,"tag":91,"props":550,"children":551},{"style":115},[552],{"type":44,"value":553}," [",{"type":39,"tag":91,"props":555,"children":556},{"style":109},[557],{"type":44,"value":154},{"type":39,"tag":91,"props":559,"children":560},{"style":146},[561],{"type":44,"value":562},"GET",{"type":39,"tag":91,"props":564,"children":565},{"style":109},[566],{"type":44,"value":154},{"type":39,"tag":91,"props":568,"children":569},{"style":109},[570],{"type":44,"value":123},{"type":39,"tag":91,"props":572,"children":573},{"style":109},[574],{"type":44,"value":143},{"type":39,"tag":91,"props":576,"children":577},{"style":146},[578],{"type":44,"value":579},"POST",{"type":39,"tag":91,"props":581,"children":582},{"style":109},[583],{"type":44,"value":154},{"type":39,"tag":91,"props":585,"children":586},{"style":115},[587],{"type":44,"value":588},"]",{"type":39,"tag":91,"props":590,"children":591},{"style":109},[592],{"type":44,"value":123},{"type":39,"tag":91,"props":594,"children":595},{"style":499},[596],{"type":44,"value":597},"           \u002F\u002F HTTP methods\n",{"type":39,"tag":91,"props":599,"children":600},{"class":93,"line":27},[601,606,610,614,619,623,627],{"type":39,"tag":91,"props":602,"children":603},{"style":266},[604],{"type":44,"value":605},"  onError",{"type":39,"tag":91,"props":607,"children":608},{"style":109},[609],{"type":44,"value":205},{"type":39,"tag":91,"props":611,"children":612},{"style":109},[613],{"type":44,"value":143},{"type":39,"tag":91,"props":615,"children":616},{"style":146},[617],{"type":44,"value":618},"bypass",{"type":39,"tag":91,"props":620,"children":621},{"style":109},[622],{"type":44,"value":154},{"type":39,"tag":91,"props":624,"children":625},{"style":109},[626],{"type":44,"value":123},{"type":39,"tag":91,"props":628,"children":629},{"style":499},[630],{"type":44,"value":631},"                 \u002F\u002F \"fail\" (default), \"bypass\", or \"\u002Ferror-page\"\n",{"type":39,"tag":91,"props":633,"children":634},{"class":93,"line":301},[635,640,644,648,653,657,661],{"type":39,"tag":91,"props":636,"children":637},{"style":266},[638],{"type":44,"value":639},"  cache",{"type":39,"tag":91,"props":641,"children":642},{"style":109},[643],{"type":44,"value":205},{"type":39,"tag":91,"props":645,"children":646},{"style":109},[647],{"type":44,"value":143},{"type":39,"tag":91,"props":649,"children":650},{"style":146},[651],{"type":44,"value":652},"manual",{"type":39,"tag":91,"props":654,"children":655},{"style":109},[656],{"type":44,"value":154},{"type":39,"tag":91,"props":658,"children":659},{"style":109},[660],{"type":44,"value":123},{"type":39,"tag":91,"props":662,"children":663},{"style":499},[664],{"type":44,"value":665},"                   \u002F\u002F Enable response caching\n",{"type":39,"tag":91,"props":667,"children":668},{"class":93,"line":309},[669],{"type":39,"tag":91,"props":670,"children":671},{"style":109},[672],{"type":44,"value":298},{"type":39,"tag":47,"props":674,"children":675},{},[676,697,699,705,707,713,714,720,722,728,730,736],{"type":39,"tag":65,"props":677,"children":678},{},[679,681,687,689,695],{"type":44,"value":680},"Scope ",{"type":39,"tag":87,"props":682,"children":684},{"className":683},[],[685],{"type":44,"value":686},"path",{"type":44,"value":688}," narrowly — ",{"type":39,"tag":87,"props":690,"children":692},{"className":691},[],[693],{"type":44,"value":694},"path: \"\u002F*\"",{"type":44,"value":696}," intercepts every request, including static assets.",{"type":44,"value":698}," A ",{"type":39,"tag":87,"props":700,"children":702},{"className":701},[],[703],{"type":44,"value":704},"\u002F*",{"type":44,"value":706}," match runs the edge function on every CSS, JS, image, and font request, not just your HTML pages — adding latency to each asset and billing an edge invocation for it. Match only the routes you need (e.g. ",{"type":39,"tag":87,"props":708,"children":710},{"className":709},[],[711],{"type":44,"value":712},"path: \"\u002F\"",{"type":44,"value":401},{"type":39,"tag":87,"props":715,"children":717},{"className":716},[],[718],{"type":44,"value":719},"path: \"\u002Fapp\u002F*\"",{"type":44,"value":721},"), or keep a broad path but exclude static assets with ",{"type":39,"tag":87,"props":723,"children":725},{"className":724},[],[726],{"type":44,"value":727},"excludedPath",{"type":44,"value":729}," (e.g. ",{"type":39,"tag":87,"props":731,"children":733},{"className":732},[],[734],{"type":44,"value":735},"excludedPath: [\"\u002F*.css\", \"\u002F*.js\", \"\u002F*.png\", \"\u002F*.woff2\"]",{"type":44,"value":737},").",{"type":39,"tag":47,"props":739,"children":740},{},[741,754,756,762,764,770,772,778],{"type":39,"tag":65,"props":742,"children":743},{},[744,746,752],{"type":44,"value":745},"Cache headers on an edge response do nothing without ",{"type":39,"tag":87,"props":747,"children":749},{"className":748},[],[750],{"type":44,"value":751},"cache: \"manual\"",{"type":44,"value":753},".",{"type":44,"value":755}," Setting ",{"type":39,"tag":87,"props":757,"children":759},{"className":758},[],[760],{"type":44,"value":761},"Cache-Control",{"type":44,"value":763}," (or any cache header) on the ",{"type":39,"tag":87,"props":765,"children":767},{"className":766},[],[768],{"type":44,"value":769},"Response",{"type":44,"value":771}," an edge function returns has no effect unless the function also opts in with ",{"type":39,"tag":87,"props":773,"children":775},{"className":774},[],[776],{"type":44,"value":777},"config.cache = \"manual\"",{"type":44,"value":779},". It's both or neither: without the flag the response is never cached, no matter what headers you set.",{"type":39,"tag":53,"props":781,"children":783},{"id":782},"declaring-edge-functions-inline-config-vs-netlifytoml",[784],{"type":44,"value":785},"Declaring edge functions: inline config vs netlify.toml",{"type":39,"tag":47,"props":787,"children":788},{},[789,791,797,799,805,807,813],{"type":44,"value":790},"An edge function runs only if it is bound to a path. Bind it either with an inline ",{"type":39,"tag":87,"props":792,"children":794},{"className":793},[],[795],{"type":44,"value":796},"export const config = { path: ... }",{"type":44,"value":798}," in the function file (shown above), or with an ",{"type":39,"tag":87,"props":800,"children":802},{"className":801},[],[803],{"type":44,"value":804},"[[edge_functions]]",{"type":44,"value":806}," entry in ",{"type":39,"tag":87,"props":808,"children":810},{"className":809},[],[811],{"type":44,"value":812},"netlify.toml",{"type":44,"value":814}," that names the file:",{"type":39,"tag":79,"props":816,"children":820},{"className":817,"code":818,"language":819,"meta":84,"style":84},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[[edge_functions]]\n  path = \"\u002Fadmin\u002F*\"\n  function = \"auth\"        # runs netlify\u002Fedge-functions\u002Fauth.ts\n","toml",[821],{"type":39,"tag":87,"props":822,"children":823},{"__ignoreMap":84},[824,832,840],{"type":39,"tag":91,"props":825,"children":826},{"class":93,"line":94},[827],{"type":39,"tag":91,"props":828,"children":829},{},[830],{"type":44,"value":831},"[[edge_functions]]\n",{"type":39,"tag":91,"props":833,"children":834},{"class":93,"line":162},[835],{"type":39,"tag":91,"props":836,"children":837},{},[838],{"type":44,"value":839},"  path = \"\u002Fadmin\u002F*\"\n",{"type":39,"tag":91,"props":841,"children":842},{"class":93,"line":172},[843],{"type":39,"tag":91,"props":844,"children":845},{},[846],{"type":44,"value":847},"  function = \"auth\"        # runs netlify\u002Fedge-functions\u002Fauth.ts\n",{"type":39,"tag":47,"props":849,"children":850},{},[851,863,865,870,872,877],{"type":39,"tag":65,"props":852,"children":853},{},[854,856,861],{"type":44,"value":855},"A file in ",{"type":39,"tag":87,"props":857,"children":859},{"className":858},[],[860],{"type":44,"value":391},{"type":44,"value":862}," with no path binding still deploys, but silently never runs.",{"type":44,"value":864}," There is no build error and no warning — nothing routes a request to it, so it is never invoked. If an edge function \"isn't doing anything,\" first confirm it declares a ",{"type":39,"tag":87,"props":866,"children":868},{"className":867},[],[869],{"type":44,"value":686},{"type":44,"value":871}," inline or has a matching ",{"type":39,"tag":87,"props":873,"children":875},{"className":874},[],[876],{"type":44,"value":804},{"type":44,"value":878}," entry.",{"type":39,"tag":880,"props":881,"children":883},"h3",{"id":882},"chaining-multiple-edge-functions-on-one-path",[884],{"type":44,"value":885},"Chaining multiple edge functions on one path",{"type":39,"tag":47,"props":887,"children":888},{},[889],{"type":44,"value":890},"When several edge functions match the same path, they run as a chain in this order:",{"type":39,"tag":892,"props":893,"children":894},"ol",{},[895,915,934],{"type":39,"tag":896,"props":897,"children":898},"li",{},[899,901,906,908,913],{"type":44,"value":900},"Functions declared in ",{"type":39,"tag":87,"props":902,"children":904},{"className":903},[],[905],{"type":44,"value":812},{"type":44,"value":907}," run first, ",{"type":39,"tag":65,"props":909,"children":910},{},[911],{"type":44,"value":912},"in the order they appear",{"type":44,"value":914}," in the file (top to bottom).",{"type":39,"tag":896,"props":916,"children":917},{},[918,920,926,928,933],{"type":44,"value":919},"Functions declared inline (via ",{"type":39,"tag":87,"props":921,"children":923},{"className":922},[],[924],{"type":44,"value":925},"export const config",{"type":44,"value":927},") run next, ",{"type":39,"tag":65,"props":929,"children":930},{},[931],{"type":44,"value":932},"in alphabetical order by filename",{"type":44,"value":753},{"type":39,"tag":896,"props":935,"children":936},{},[937,939,944],{"type":44,"value":938},"Functions configured for caching (",{"type":39,"tag":87,"props":940,"children":942},{"className":941},[],[943],{"type":44,"value":751},{"type":44,"value":945},") always run after non-caching ones.",{"type":39,"tag":47,"props":947,"children":948},{},[949,951,956,958,963,965,970],{"type":44,"value":950},"To guarantee a specific order (e.g. an auth gate that must run before a personalization rewrite), declare the functions in ",{"type":39,"tag":87,"props":952,"children":954},{"className":953},[],[955],{"type":44,"value":812},{"type":44,"value":957}," in the order you want — don't depend on inline config, whose order is alphabetical by filename and easy to get wrong. Declaring the same function both inline and in ",{"type":39,"tag":87,"props":959,"children":961},{"className":960},[],[962],{"type":44,"value":812},{"type":44,"value":964}," merges them into an inline declaration (inline config wins), which forfeits the deterministic ",{"type":39,"tag":87,"props":966,"children":968},{"className":967},[],[969],{"type":44,"value":812},{"type":44,"value":971}," ordering.",{"type":39,"tag":53,"props":973,"children":975},{"id":974},"edge-functions-run-before-redirects",[976],{"type":44,"value":977},"Edge functions run before redirects",{"type":39,"tag":47,"props":979,"children":980},{},[981,983,988,990,996,997,1003],{"type":44,"value":982},"In Netlify's request chain, edge functions execute ",{"type":39,"tag":65,"props":984,"children":985},{},[986],{"type":44,"value":987},"before",{"type":44,"value":989}," redirect and rewrite rules (",{"type":39,"tag":87,"props":991,"children":993},{"className":992},[],[994],{"type":44,"value":995},"[[redirects]]",{"type":44,"value":401},{"type":39,"tag":87,"props":998,"children":1000},{"className":999},[],[1001],{"type":44,"value":1002},"_redirects",{"type":44,"value":1004},"). Two consequences bite often:",{"type":39,"tag":1006,"props":1007,"children":1008},"ul",{},[1009,1036],{"type":39,"tag":896,"props":1010,"children":1011},{},[1012,1014,1019,1021,1026,1028,1034],{"type":44,"value":1013},"An edge function is matched against the ",{"type":39,"tag":65,"props":1015,"children":1016},{},[1017],{"type":44,"value":1018},"original",{"type":44,"value":1020}," requested URL, not a redirect\u002Frewrite destination. Scope its ",{"type":39,"tag":87,"props":1022,"children":1024},{"className":1023},[],[1025],{"type":44,"value":686},{"type":44,"value":1027}," to the URL the client actually requests — an edge function declared on the ",{"type":39,"tag":1029,"props":1030,"children":1031},"em",{},[1032],{"type":44,"value":1033},"target",{"type":44,"value":1035}," of a rewrite will not fire for requests that only reach that target via the rewrite.",{"type":39,"tag":896,"props":1037,"children":1038},{},[1039,1041,1046,1048,1053,1055,1061,1063,1069],{"type":44,"value":1040},"If an edge function returns a ",{"type":39,"tag":87,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":44,"value":769},{"type":44,"value":1047},", the request chain stops there and redirect rules for that path ",{"type":39,"tag":65,"props":1049,"children":1050},{},[1051],{"type":44,"value":1052},"never run",{"type":44,"value":1054},". Return ",{"type":39,"tag":87,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":44,"value":1060},"context.next()",{"type":44,"value":1062}," (or ",{"type":39,"tag":87,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":44,"value":1068},"undefined",{"type":44,"value":1070},") if you want redirects to still apply.",{"type":39,"tag":53,"props":1072,"children":1074},{"id":1073},"middleware-pattern",[1075],{"type":44,"value":1076},"Middleware Pattern",{"type":39,"tag":47,"props":1078,"children":1079},{},[1080,1082,1087],{"type":44,"value":1081},"Use ",{"type":39,"tag":87,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":44,"value":1060},{"type":44,"value":1088}," to invoke the next handler in the chain and optionally modify the response:",{"type":39,"tag":79,"props":1090,"children":1092},{"className":81,"code":1091,"language":83,"meta":84,"style":84},"export default async (req: Request, context: Context) => {\n  \u002F\u002F Before: modify request or short-circuit\n  if (!isAuthenticated(req)) {\n    return new Response(\"Unauthorized\", { status: 401 });\n  }\n\n  \u002F\u002F Continue to origin\u002Fnext function\n  const response = await context.next();\n\n  \u002F\u002F After: modify response\n  response.headers.set(\"x-custom-header\", \"value\");\n  return response;\n};\n",[1093],{"type":39,"tag":87,"props":1094,"children":1095},{"__ignoreMap":84},[1096,1155,1163,1203,1271,1279,1286,1294,1338,1345,1354,1423,1439],{"type":39,"tag":91,"props":1097,"children":1098},{"class":93,"line":94},[1099,1103,1107,1111,1115,1119,1123,1127,1131,1135,1139,1143,1147,1151],{"type":39,"tag":91,"props":1100,"children":1101},{"style":98},[1102],{"type":44,"value":178},{"type":39,"tag":91,"props":1104,"children":1105},{"style":98},[1106],{"type":44,"value":183},{"type":39,"tag":91,"props":1108,"children":1109},{"style":186},[1110],{"type":44,"value":189},{"type":39,"tag":91,"props":1112,"children":1113},{"style":109},[1114],{"type":44,"value":194},{"type":39,"tag":91,"props":1116,"children":1117},{"style":197},[1118],{"type":44,"value":200},{"type":39,"tag":91,"props":1120,"children":1121},{"style":109},[1122],{"type":44,"value":205},{"type":39,"tag":91,"props":1124,"children":1125},{"style":208},[1126],{"type":44,"value":211},{"type":39,"tag":91,"props":1128,"children":1129},{"style":109},[1130],{"type":44,"value":123},{"type":39,"tag":91,"props":1132,"children":1133},{"style":197},[1134],{"type":44,"value":220},{"type":39,"tag":91,"props":1136,"children":1137},{"style":109},[1138],{"type":44,"value":205},{"type":39,"tag":91,"props":1140,"children":1141},{"style":208},[1142],{"type":44,"value":128},{"type":39,"tag":91,"props":1144,"children":1145},{"style":109},[1146],{"type":44,"value":233},{"type":39,"tag":91,"props":1148,"children":1149},{"style":186},[1150],{"type":44,"value":238},{"type":39,"tag":91,"props":1152,"children":1153},{"style":109},[1154],{"type":44,"value":243},{"type":39,"tag":91,"props":1156,"children":1157},{"class":93,"line":162},[1158],{"type":39,"tag":91,"props":1159,"children":1160},{"style":499},[1161],{"type":44,"value":1162},"  \u002F\u002F Before: modify request or short-circuit\n",{"type":39,"tag":91,"props":1164,"children":1165},{"class":93,"line":172},[1166,1171,1175,1180,1185,1189,1193,1198],{"type":39,"tag":91,"props":1167,"children":1168},{"style":98},[1169],{"type":44,"value":1170},"  if",{"type":39,"tag":91,"props":1172,"children":1173},{"style":266},[1174],{"type":44,"value":194},{"type":39,"tag":91,"props":1176,"children":1177},{"style":109},[1178],{"type":44,"value":1179},"!",{"type":39,"tag":91,"props":1181,"children":1182},{"style":260},[1183],{"type":44,"value":1184},"isAuthenticated",{"type":39,"tag":91,"props":1186,"children":1187},{"style":266},[1188],{"type":44,"value":269},{"type":39,"tag":91,"props":1190,"children":1191},{"style":115},[1192],{"type":44,"value":200},{"type":39,"tag":91,"props":1194,"children":1195},{"style":266},[1196],{"type":44,"value":1197},")) ",{"type":39,"tag":91,"props":1199,"children":1200},{"style":109},[1201],{"type":44,"value":1202},"{\n",{"type":39,"tag":91,"props":1204,"children":1205},{"class":93,"line":246},[1206,1211,1215,1219,1223,1227,1232,1236,1240,1244,1249,1253,1259,1263,1267],{"type":39,"tag":91,"props":1207,"children":1208},{"style":98},[1209],{"type":44,"value":1210},"    return",{"type":39,"tag":91,"props":1212,"children":1213},{"style":109},[1214],{"type":44,"value":257},{"type":39,"tag":91,"props":1216,"children":1217},{"style":260},[1218],{"type":44,"value":263},{"type":39,"tag":91,"props":1220,"children":1221},{"style":266},[1222],{"type":44,"value":269},{"type":39,"tag":91,"props":1224,"children":1225},{"style":109},[1226],{"type":44,"value":154},{"type":39,"tag":91,"props":1228,"children":1229},{"style":146},[1230],{"type":44,"value":1231},"Unauthorized",{"type":39,"tag":91,"props":1233,"children":1234},{"style":109},[1235],{"type":44,"value":154},{"type":39,"tag":91,"props":1237,"children":1238},{"style":109},[1239],{"type":44,"value":123},{"type":39,"tag":91,"props":1241,"children":1242},{"style":109},[1243],{"type":44,"value":112},{"type":39,"tag":91,"props":1245,"children":1246},{"style":266},[1247],{"type":44,"value":1248}," status",{"type":39,"tag":91,"props":1250,"children":1251},{"style":109},[1252],{"type":44,"value":205},{"type":39,"tag":91,"props":1254,"children":1256},{"style":1255},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1257],{"type":44,"value":1258}," 401",{"type":39,"tag":91,"props":1260,"children":1261},{"style":109},[1262],{"type":44,"value":133},{"type":39,"tag":91,"props":1264,"children":1265},{"style":266},[1266],{"type":44,"value":233},{"type":39,"tag":91,"props":1268,"children":1269},{"style":109},[1270],{"type":44,"value":159},{"type":39,"tag":91,"props":1272,"children":1273},{"class":93,"line":27},[1274],{"type":39,"tag":91,"props":1275,"children":1276},{"style":109},[1277],{"type":44,"value":1278},"  }\n",{"type":39,"tag":91,"props":1280,"children":1281},{"class":93,"line":301},[1282],{"type":39,"tag":91,"props":1283,"children":1284},{"emptyLinePlaceholder":166},[1285],{"type":44,"value":169},{"type":39,"tag":91,"props":1287,"children":1288},{"class":93,"line":309},[1289],{"type":39,"tag":91,"props":1290,"children":1291},{"style":499},[1292],{"type":44,"value":1293},"  \u002F\u002F Continue to origin\u002Fnext function\n",{"type":39,"tag":91,"props":1295,"children":1296},{"class":93,"line":344},[1297,1302,1307,1311,1316,1320,1324,1329,1334],{"type":39,"tag":91,"props":1298,"children":1299},{"style":186},[1300],{"type":44,"value":1301},"  const",{"type":39,"tag":91,"props":1303,"children":1304},{"style":115},[1305],{"type":44,"value":1306}," response",{"type":39,"tag":91,"props":1308,"children":1309},{"style":109},[1310],{"type":44,"value":337},{"type":39,"tag":91,"props":1312,"children":1313},{"style":98},[1314],{"type":44,"value":1315}," await",{"type":39,"tag":91,"props":1317,"children":1318},{"style":115},[1319],{"type":44,"value":220},{"type":39,"tag":91,"props":1321,"children":1322},{"style":109},[1323],{"type":44,"value":753},{"type":39,"tag":91,"props":1325,"children":1326},{"style":260},[1327],{"type":44,"value":1328},"next",{"type":39,"tag":91,"props":1330,"children":1331},{"style":266},[1332],{"type":44,"value":1333},"()",{"type":39,"tag":91,"props":1335,"children":1336},{"style":109},[1337],{"type":44,"value":159},{"type":39,"tag":91,"props":1339,"children":1340},{"class":93,"line":375},[1341],{"type":39,"tag":91,"props":1342,"children":1343},{"emptyLinePlaceholder":166},[1344],{"type":44,"value":169},{"type":39,"tag":91,"props":1346,"children":1348},{"class":93,"line":1347},10,[1349],{"type":39,"tag":91,"props":1350,"children":1351},{"style":499},[1352],{"type":44,"value":1353},"  \u002F\u002F After: modify response\n",{"type":39,"tag":91,"props":1355,"children":1357},{"class":93,"line":1356},11,[1358,1363,1367,1372,1376,1381,1385,1389,1394,1398,1402,1406,1411,1415,1419],{"type":39,"tag":91,"props":1359,"children":1360},{"style":115},[1361],{"type":44,"value":1362},"  response",{"type":39,"tag":91,"props":1364,"children":1365},{"style":109},[1366],{"type":44,"value":753},{"type":39,"tag":91,"props":1368,"children":1369},{"style":115},[1370],{"type":44,"value":1371},"headers",{"type":39,"tag":91,"props":1373,"children":1374},{"style":109},[1375],{"type":44,"value":753},{"type":39,"tag":91,"props":1377,"children":1378},{"style":260},[1379],{"type":44,"value":1380},"set",{"type":39,"tag":91,"props":1382,"children":1383},{"style":266},[1384],{"type":44,"value":269},{"type":39,"tag":91,"props":1386,"children":1387},{"style":109},[1388],{"type":44,"value":154},{"type":39,"tag":91,"props":1390,"children":1391},{"style":146},[1392],{"type":44,"value":1393},"x-custom-header",{"type":39,"tag":91,"props":1395,"children":1396},{"style":109},[1397],{"type":44,"value":154},{"type":39,"tag":91,"props":1399,"children":1400},{"style":109},[1401],{"type":44,"value":123},{"type":39,"tag":91,"props":1403,"children":1404},{"style":109},[1405],{"type":44,"value":143},{"type":39,"tag":91,"props":1407,"children":1408},{"style":146},[1409],{"type":44,"value":1410},"value",{"type":39,"tag":91,"props":1412,"children":1413},{"style":109},[1414],{"type":44,"value":154},{"type":39,"tag":91,"props":1416,"children":1417},{"style":266},[1418],{"type":44,"value":233},{"type":39,"tag":91,"props":1420,"children":1421},{"style":109},[1422],{"type":44,"value":159},{"type":39,"tag":91,"props":1424,"children":1426},{"class":93,"line":1425},12,[1427,1431,1435],{"type":39,"tag":91,"props":1428,"children":1429},{"style":98},[1430],{"type":44,"value":252},{"type":39,"tag":91,"props":1432,"children":1433},{"style":115},[1434],{"type":44,"value":1306},{"type":39,"tag":91,"props":1436,"children":1437},{"style":109},[1438],{"type":44,"value":159},{"type":39,"tag":91,"props":1440,"children":1442},{"class":93,"line":1441},13,[1443],{"type":39,"tag":91,"props":1444,"children":1445},{"style":109},[1446],{"type":44,"value":298},{"type":39,"tag":47,"props":1448,"children":1449},{},[1450,1452,1457],{"type":44,"value":1451},"Return ",{"type":39,"tag":87,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":44,"value":1068},{"type":44,"value":1458}," to pass through without modification:",{"type":39,"tag":79,"props":1460,"children":1462},{"className":81,"code":1461,"language":83,"meta":84,"style":84},"export default async (req: Request, context: Context) => {\n  if (!shouldHandle(req)) return; \u002F\u002F continues to next handler\n  return new Response(\"Handled\");\n};\n",[1463],{"type":39,"tag":87,"props":1464,"children":1465},{"__ignoreMap":84},[1466,1525,1572,1612],{"type":39,"tag":91,"props":1467,"children":1468},{"class":93,"line":94},[1469,1473,1477,1481,1485,1489,1493,1497,1501,1505,1509,1513,1517,1521],{"type":39,"tag":91,"props":1470,"children":1471},{"style":98},[1472],{"type":44,"value":178},{"type":39,"tag":91,"props":1474,"children":1475},{"style":98},[1476],{"type":44,"value":183},{"type":39,"tag":91,"props":1478,"children":1479},{"style":186},[1480],{"type":44,"value":189},{"type":39,"tag":91,"props":1482,"children":1483},{"style":109},[1484],{"type":44,"value":194},{"type":39,"tag":91,"props":1486,"children":1487},{"style":197},[1488],{"type":44,"value":200},{"type":39,"tag":91,"props":1490,"children":1491},{"style":109},[1492],{"type":44,"value":205},{"type":39,"tag":91,"props":1494,"children":1495},{"style":208},[1496],{"type":44,"value":211},{"type":39,"tag":91,"props":1498,"children":1499},{"style":109},[1500],{"type":44,"value":123},{"type":39,"tag":91,"props":1502,"children":1503},{"style":197},[1504],{"type":44,"value":220},{"type":39,"tag":91,"props":1506,"children":1507},{"style":109},[1508],{"type":44,"value":205},{"type":39,"tag":91,"props":1510,"children":1511},{"style":208},[1512],{"type":44,"value":128},{"type":39,"tag":91,"props":1514,"children":1515},{"style":109},[1516],{"type":44,"value":233},{"type":39,"tag":91,"props":1518,"children":1519},{"style":186},[1520],{"type":44,"value":238},{"type":39,"tag":91,"props":1522,"children":1523},{"style":109},[1524],{"type":44,"value":243},{"type":39,"tag":91,"props":1526,"children":1527},{"class":93,"line":162},[1528,1532,1536,1540,1545,1549,1553,1557,1562,1567],{"type":39,"tag":91,"props":1529,"children":1530},{"style":98},[1531],{"type":44,"value":1170},{"type":39,"tag":91,"props":1533,"children":1534},{"style":266},[1535],{"type":44,"value":194},{"type":39,"tag":91,"props":1537,"children":1538},{"style":109},[1539],{"type":44,"value":1179},{"type":39,"tag":91,"props":1541,"children":1542},{"style":260},[1543],{"type":44,"value":1544},"shouldHandle",{"type":39,"tag":91,"props":1546,"children":1547},{"style":266},[1548],{"type":44,"value":269},{"type":39,"tag":91,"props":1550,"children":1551},{"style":115},[1552],{"type":44,"value":200},{"type":39,"tag":91,"props":1554,"children":1555},{"style":266},[1556],{"type":44,"value":1197},{"type":39,"tag":91,"props":1558,"children":1559},{"style":98},[1560],{"type":44,"value":1561},"return",{"type":39,"tag":91,"props":1563,"children":1564},{"style":109},[1565],{"type":44,"value":1566},";",{"type":39,"tag":91,"props":1568,"children":1569},{"style":499},[1570],{"type":44,"value":1571}," \u002F\u002F continues to next handler\n",{"type":39,"tag":91,"props":1573,"children":1574},{"class":93,"line":172},[1575,1579,1583,1587,1591,1595,1600,1604,1608],{"type":39,"tag":91,"props":1576,"children":1577},{"style":98},[1578],{"type":44,"value":252},{"type":39,"tag":91,"props":1580,"children":1581},{"style":109},[1582],{"type":44,"value":257},{"type":39,"tag":91,"props":1584,"children":1585},{"style":260},[1586],{"type":44,"value":263},{"type":39,"tag":91,"props":1588,"children":1589},{"style":266},[1590],{"type":44,"value":269},{"type":39,"tag":91,"props":1592,"children":1593},{"style":109},[1594],{"type":44,"value":154},{"type":39,"tag":91,"props":1596,"children":1597},{"style":146},[1598],{"type":44,"value":1599},"Handled",{"type":39,"tag":91,"props":1601,"children":1602},{"style":109},[1603],{"type":44,"value":154},{"type":39,"tag":91,"props":1605,"children":1606},{"style":266},[1607],{"type":44,"value":233},{"type":39,"tag":91,"props":1609,"children":1610},{"style":109},[1611],{"type":44,"value":159},{"type":39,"tag":91,"props":1613,"children":1614},{"class":93,"line":246},[1615],{"type":39,"tag":91,"props":1616,"children":1617},{"style":109},[1618],{"type":44,"value":298},{"type":39,"tag":53,"props":1620,"children":1622},{"id":1621},"geolocation-and-ip",[1623],{"type":44,"value":1624},"Geolocation and IP",{"type":39,"tag":79,"props":1626,"children":1628},{"className":81,"code":1627,"language":83,"meta":84,"style":84},"export default async (req: Request, context: Context) => {\n  const { city, country, subdivision, timezone } = context.geo;\n  const ip = context.ip;\n\n  if (country?.code === \"DE\") {\n    return Response.redirect(new URL(\"\u002Fde\", req.url));\n  }\n};\n",[1629],{"type":39,"tag":87,"props":1630,"children":1631},{"__ignoreMap":84},[1632,1691,1759,1792,1799,1851,1929,1936],{"type":39,"tag":91,"props":1633,"children":1634},{"class":93,"line":94},[1635,1639,1643,1647,1651,1655,1659,1663,1667,1671,1675,1679,1683,1687],{"type":39,"tag":91,"props":1636,"children":1637},{"style":98},[1638],{"type":44,"value":178},{"type":39,"tag":91,"props":1640,"children":1641},{"style":98},[1642],{"type":44,"value":183},{"type":39,"tag":91,"props":1644,"children":1645},{"style":186},[1646],{"type":44,"value":189},{"type":39,"tag":91,"props":1648,"children":1649},{"style":109},[1650],{"type":44,"value":194},{"type":39,"tag":91,"props":1652,"children":1653},{"style":197},[1654],{"type":44,"value":200},{"type":39,"tag":91,"props":1656,"children":1657},{"style":109},[1658],{"type":44,"value":205},{"type":39,"tag":91,"props":1660,"children":1661},{"style":208},[1662],{"type":44,"value":211},{"type":39,"tag":91,"props":1664,"children":1665},{"style":109},[1666],{"type":44,"value":123},{"type":39,"tag":91,"props":1668,"children":1669},{"style":197},[1670],{"type":44,"value":220},{"type":39,"tag":91,"props":1672,"children":1673},{"style":109},[1674],{"type":44,"value":205},{"type":39,"tag":91,"props":1676,"children":1677},{"style":208},[1678],{"type":44,"value":128},{"type":39,"tag":91,"props":1680,"children":1681},{"style":109},[1682],{"type":44,"value":233},{"type":39,"tag":91,"props":1684,"children":1685},{"style":186},[1686],{"type":44,"value":238},{"type":39,"tag":91,"props":1688,"children":1689},{"style":109},[1690],{"type":44,"value":243},{"type":39,"tag":91,"props":1692,"children":1693},{"class":93,"line":162},[1694,1698,1702,1707,1711,1716,1720,1725,1729,1734,1738,1742,1746,1750,1755],{"type":39,"tag":91,"props":1695,"children":1696},{"style":186},[1697],{"type":44,"value":1301},{"type":39,"tag":91,"props":1699,"children":1700},{"style":109},[1701],{"type":44,"value":112},{"type":39,"tag":91,"props":1703,"children":1704},{"style":115},[1705],{"type":44,"value":1706}," city",{"type":39,"tag":91,"props":1708,"children":1709},{"style":109},[1710],{"type":44,"value":123},{"type":39,"tag":91,"props":1712,"children":1713},{"style":115},[1714],{"type":44,"value":1715}," country",{"type":39,"tag":91,"props":1717,"children":1718},{"style":109},[1719],{"type":44,"value":123},{"type":39,"tag":91,"props":1721,"children":1722},{"style":115},[1723],{"type":44,"value":1724}," subdivision",{"type":39,"tag":91,"props":1726,"children":1727},{"style":109},[1728],{"type":44,"value":123},{"type":39,"tag":91,"props":1730,"children":1731},{"style":115},[1732],{"type":44,"value":1733}," timezone",{"type":39,"tag":91,"props":1735,"children":1736},{"style":109},[1737],{"type":44,"value":133},{"type":39,"tag":91,"props":1739,"children":1740},{"style":109},[1741],{"type":44,"value":337},{"type":39,"tag":91,"props":1743,"children":1744},{"style":115},[1745],{"type":44,"value":220},{"type":39,"tag":91,"props":1747,"children":1748},{"style":109},[1749],{"type":44,"value":753},{"type":39,"tag":91,"props":1751,"children":1752},{"style":115},[1753],{"type":44,"value":1754},"geo",{"type":39,"tag":91,"props":1756,"children":1757},{"style":109},[1758],{"type":44,"value":159},{"type":39,"tag":91,"props":1760,"children":1761},{"class":93,"line":172},[1762,1766,1771,1775,1779,1783,1788],{"type":39,"tag":91,"props":1763,"children":1764},{"style":186},[1765],{"type":44,"value":1301},{"type":39,"tag":91,"props":1767,"children":1768},{"style":115},[1769],{"type":44,"value":1770}," ip",{"type":39,"tag":91,"props":1772,"children":1773},{"style":109},[1774],{"type":44,"value":337},{"type":39,"tag":91,"props":1776,"children":1777},{"style":115},[1778],{"type":44,"value":220},{"type":39,"tag":91,"props":1780,"children":1781},{"style":109},[1782],{"type":44,"value":753},{"type":39,"tag":91,"props":1784,"children":1785},{"style":115},[1786],{"type":44,"value":1787},"ip",{"type":39,"tag":91,"props":1789,"children":1790},{"style":109},[1791],{"type":44,"value":159},{"type":39,"tag":91,"props":1793,"children":1794},{"class":93,"line":246},[1795],{"type":39,"tag":91,"props":1796,"children":1797},{"emptyLinePlaceholder":166},[1798],{"type":44,"value":169},{"type":39,"tag":91,"props":1800,"children":1801},{"class":93,"line":27},[1802,1806,1810,1815,1820,1824,1829,1833,1838,1842,1847],{"type":39,"tag":91,"props":1803,"children":1804},{"style":98},[1805],{"type":44,"value":1170},{"type":39,"tag":91,"props":1807,"children":1808},{"style":266},[1809],{"type":44,"value":194},{"type":39,"tag":91,"props":1811,"children":1812},{"style":115},[1813],{"type":44,"value":1814},"country",{"type":39,"tag":91,"props":1816,"children":1817},{"style":109},[1818],{"type":44,"value":1819},"?.",{"type":39,"tag":91,"props":1821,"children":1822},{"style":115},[1823],{"type":44,"value":87},{"type":39,"tag":91,"props":1825,"children":1826},{"style":109},[1827],{"type":44,"value":1828}," ===",{"type":39,"tag":91,"props":1830,"children":1831},{"style":109},[1832],{"type":44,"value":143},{"type":39,"tag":91,"props":1834,"children":1835},{"style":146},[1836],{"type":44,"value":1837},"DE",{"type":39,"tag":91,"props":1839,"children":1840},{"style":109},[1841],{"type":44,"value":154},{"type":39,"tag":91,"props":1843,"children":1844},{"style":266},[1845],{"type":44,"value":1846},") ",{"type":39,"tag":91,"props":1848,"children":1849},{"style":109},[1850],{"type":44,"value":1202},{"type":39,"tag":91,"props":1852,"children":1853},{"class":93,"line":301},[1854,1858,1862,1866,1871,1875,1880,1885,1889,1893,1898,1902,1906,1911,1915,1920,1925],{"type":39,"tag":91,"props":1855,"children":1856},{"style":98},[1857],{"type":44,"value":1210},{"type":39,"tag":91,"props":1859,"children":1860},{"style":115},[1861],{"type":44,"value":263},{"type":39,"tag":91,"props":1863,"children":1864},{"style":109},[1865],{"type":44,"value":753},{"type":39,"tag":91,"props":1867,"children":1868},{"style":260},[1869],{"type":44,"value":1870},"redirect",{"type":39,"tag":91,"props":1872,"children":1873},{"style":266},[1874],{"type":44,"value":269},{"type":39,"tag":91,"props":1876,"children":1877},{"style":109},[1878],{"type":44,"value":1879},"new",{"type":39,"tag":91,"props":1881,"children":1882},{"style":260},[1883],{"type":44,"value":1884}," URL",{"type":39,"tag":91,"props":1886,"children":1887},{"style":266},[1888],{"type":44,"value":269},{"type":39,"tag":91,"props":1890,"children":1891},{"style":109},[1892],{"type":44,"value":154},{"type":39,"tag":91,"props":1894,"children":1895},{"style":146},[1896],{"type":44,"value":1897},"\u002Fde",{"type":39,"tag":91,"props":1899,"children":1900},{"style":109},[1901],{"type":44,"value":154},{"type":39,"tag":91,"props":1903,"children":1904},{"style":109},[1905],{"type":44,"value":123},{"type":39,"tag":91,"props":1907,"children":1908},{"style":115},[1909],{"type":44,"value":1910}," req",{"type":39,"tag":91,"props":1912,"children":1913},{"style":109},[1914],{"type":44,"value":753},{"type":39,"tag":91,"props":1916,"children":1917},{"style":115},[1918],{"type":44,"value":1919},"url",{"type":39,"tag":91,"props":1921,"children":1922},{"style":266},[1923],{"type":44,"value":1924},"))",{"type":39,"tag":91,"props":1926,"children":1927},{"style":109},[1928],{"type":44,"value":159},{"type":39,"tag":91,"props":1930,"children":1931},{"class":93,"line":309},[1932],{"type":39,"tag":91,"props":1933,"children":1934},{"style":109},[1935],{"type":44,"value":1278},{"type":39,"tag":91,"props":1937,"children":1938},{"class":93,"line":344},[1939],{"type":39,"tag":91,"props":1940,"children":1941},{"style":109},[1942],{"type":44,"value":298},{"type":39,"tag":47,"props":1944,"children":1945},{},[1946,1948],{"type":44,"value":1947},"Local dev with mocked geo: ",{"type":39,"tag":87,"props":1949,"children":1951},{"className":1950},[],[1952],{"type":44,"value":1953},"netlify dev --geo=mock --country=US",{"type":39,"tag":53,"props":1955,"children":1957},{"id":1956},"cookies",[1958],{"type":44,"value":1959},"Cookies",{"type":39,"tag":47,"props":1961,"children":1962},{},[1963,1965,1971,1973,1979,1981,1987],{"type":44,"value":1964},"Read and write cookies through the ",{"type":39,"tag":87,"props":1966,"children":1968},{"className":1967},[],[1969],{"type":44,"value":1970},"context.cookies",{"type":44,"value":1972}," helper instead of hand-parsing the ",{"type":39,"tag":87,"props":1974,"children":1976},{"className":1975},[],[1977],{"type":44,"value":1978},"Cookie",{"type":44,"value":1980}," header or building ",{"type":39,"tag":87,"props":1982,"children":1984},{"className":1983},[],[1985],{"type":44,"value":1986},"Set-Cookie",{"type":44,"value":1988}," strings:",{"type":39,"tag":79,"props":1990,"children":1992},{"className":81,"code":1991,"language":83,"meta":84,"style":84},"export default async (req: Request, context: Context) => {\n  const bucket = context.cookies.get(\"bucket\");            \u002F\u002F read from the request\n  context.cookies.set({ name: \"bucket\", value: \"a\" });     \u002F\u002F set on the response\n  context.cookies.delete(\"legacy_session\");                \u002F\u002F tell the client to delete it\n  return context.next();\n};\n",[1993],{"type":39,"tag":87,"props":1994,"children":1995},{"__ignoreMap":84},[1996,2055,2122,2219,2273,2300],{"type":39,"tag":91,"props":1997,"children":1998},{"class":93,"line":94},[1999,2003,2007,2011,2015,2019,2023,2027,2031,2035,2039,2043,2047,2051],{"type":39,"tag":91,"props":2000,"children":2001},{"style":98},[2002],{"type":44,"value":178},{"type":39,"tag":91,"props":2004,"children":2005},{"style":98},[2006],{"type":44,"value":183},{"type":39,"tag":91,"props":2008,"children":2009},{"style":186},[2010],{"type":44,"value":189},{"type":39,"tag":91,"props":2012,"children":2013},{"style":109},[2014],{"type":44,"value":194},{"type":39,"tag":91,"props":2016,"children":2017},{"style":197},[2018],{"type":44,"value":200},{"type":39,"tag":91,"props":2020,"children":2021},{"style":109},[2022],{"type":44,"value":205},{"type":39,"tag":91,"props":2024,"children":2025},{"style":208},[2026],{"type":44,"value":211},{"type":39,"tag":91,"props":2028,"children":2029},{"style":109},[2030],{"type":44,"value":123},{"type":39,"tag":91,"props":2032,"children":2033},{"style":197},[2034],{"type":44,"value":220},{"type":39,"tag":91,"props":2036,"children":2037},{"style":109},[2038],{"type":44,"value":205},{"type":39,"tag":91,"props":2040,"children":2041},{"style":208},[2042],{"type":44,"value":128},{"type":39,"tag":91,"props":2044,"children":2045},{"style":109},[2046],{"type":44,"value":233},{"type":39,"tag":91,"props":2048,"children":2049},{"style":186},[2050],{"type":44,"value":238},{"type":39,"tag":91,"props":2052,"children":2053},{"style":109},[2054],{"type":44,"value":243},{"type":39,"tag":91,"props":2056,"children":2057},{"class":93,"line":162},[2058,2062,2067,2071,2075,2079,2083,2087,2092,2096,2100,2105,2109,2113,2117],{"type":39,"tag":91,"props":2059,"children":2060},{"style":186},[2061],{"type":44,"value":1301},{"type":39,"tag":91,"props":2063,"children":2064},{"style":115},[2065],{"type":44,"value":2066}," bucket",{"type":39,"tag":91,"props":2068,"children":2069},{"style":109},[2070],{"type":44,"value":337},{"type":39,"tag":91,"props":2072,"children":2073},{"style":115},[2074],{"type":44,"value":220},{"type":39,"tag":91,"props":2076,"children":2077},{"style":109},[2078],{"type":44,"value":753},{"type":39,"tag":91,"props":2080,"children":2081},{"style":115},[2082],{"type":44,"value":1956},{"type":39,"tag":91,"props":2084,"children":2085},{"style":109},[2086],{"type":44,"value":753},{"type":39,"tag":91,"props":2088,"children":2089},{"style":260},[2090],{"type":44,"value":2091},"get",{"type":39,"tag":91,"props":2093,"children":2094},{"style":266},[2095],{"type":44,"value":269},{"type":39,"tag":91,"props":2097,"children":2098},{"style":109},[2099],{"type":44,"value":154},{"type":39,"tag":91,"props":2101,"children":2102},{"style":146},[2103],{"type":44,"value":2104},"bucket",{"type":39,"tag":91,"props":2106,"children":2107},{"style":109},[2108],{"type":44,"value":154},{"type":39,"tag":91,"props":2110,"children":2111},{"style":266},[2112],{"type":44,"value":233},{"type":39,"tag":91,"props":2114,"children":2115},{"style":109},[2116],{"type":44,"value":1566},{"type":39,"tag":91,"props":2118,"children":2119},{"style":499},[2120],{"type":44,"value":2121},"            \u002F\u002F read from the request\n",{"type":39,"tag":91,"props":2123,"children":2124},{"class":93,"line":172},[2125,2130,2134,2138,2142,2146,2150,2155,2160,2164,2168,2172,2176,2180,2185,2189,2193,2198,2202,2206,2210,2214],{"type":39,"tag":91,"props":2126,"children":2127},{"style":115},[2128],{"type":44,"value":2129},"  context",{"type":39,"tag":91,"props":2131,"children":2132},{"style":109},[2133],{"type":44,"value":753},{"type":39,"tag":91,"props":2135,"children":2136},{"style":115},[2137],{"type":44,"value":1956},{"type":39,"tag":91,"props":2139,"children":2140},{"style":109},[2141],{"type":44,"value":753},{"type":39,"tag":91,"props":2143,"children":2144},{"style":260},[2145],{"type":44,"value":1380},{"type":39,"tag":91,"props":2147,"children":2148},{"style":266},[2149],{"type":44,"value":269},{"type":39,"tag":91,"props":2151,"children":2152},{"style":109},[2153],{"type":44,"value":2154},"{",{"type":39,"tag":91,"props":2156,"children":2157},{"style":266},[2158],{"type":44,"value":2159}," name",{"type":39,"tag":91,"props":2161,"children":2162},{"style":109},[2163],{"type":44,"value":205},{"type":39,"tag":91,"props":2165,"children":2166},{"style":109},[2167],{"type":44,"value":143},{"type":39,"tag":91,"props":2169,"children":2170},{"style":146},[2171],{"type":44,"value":2104},{"type":39,"tag":91,"props":2173,"children":2174},{"style":109},[2175],{"type":44,"value":154},{"type":39,"tag":91,"props":2177,"children":2178},{"style":109},[2179],{"type":44,"value":123},{"type":39,"tag":91,"props":2181,"children":2182},{"style":266},[2183],{"type":44,"value":2184}," value",{"type":39,"tag":91,"props":2186,"children":2187},{"style":109},[2188],{"type":44,"value":205},{"type":39,"tag":91,"props":2190,"children":2191},{"style":109},[2192],{"type":44,"value":143},{"type":39,"tag":91,"props":2194,"children":2195},{"style":146},[2196],{"type":44,"value":2197},"a",{"type":39,"tag":91,"props":2199,"children":2200},{"style":109},[2201],{"type":44,"value":154},{"type":39,"tag":91,"props":2203,"children":2204},{"style":109},[2205],{"type":44,"value":133},{"type":39,"tag":91,"props":2207,"children":2208},{"style":266},[2209],{"type":44,"value":233},{"type":39,"tag":91,"props":2211,"children":2212},{"style":109},[2213],{"type":44,"value":1566},{"type":39,"tag":91,"props":2215,"children":2216},{"style":499},[2217],{"type":44,"value":2218},"     \u002F\u002F set on the response\n",{"type":39,"tag":91,"props":2220,"children":2221},{"class":93,"line":246},[2222,2226,2230,2234,2238,2243,2247,2251,2256,2260,2264,2268],{"type":39,"tag":91,"props":2223,"children":2224},{"style":115},[2225],{"type":44,"value":2129},{"type":39,"tag":91,"props":2227,"children":2228},{"style":109},[2229],{"type":44,"value":753},{"type":39,"tag":91,"props":2231,"children":2232},{"style":115},[2233],{"type":44,"value":1956},{"type":39,"tag":91,"props":2235,"children":2236},{"style":109},[2237],{"type":44,"value":753},{"type":39,"tag":91,"props":2239,"children":2240},{"style":260},[2241],{"type":44,"value":2242},"delete",{"type":39,"tag":91,"props":2244,"children":2245},{"style":266},[2246],{"type":44,"value":269},{"type":39,"tag":91,"props":2248,"children":2249},{"style":109},[2250],{"type":44,"value":154},{"type":39,"tag":91,"props":2252,"children":2253},{"style":146},[2254],{"type":44,"value":2255},"legacy_session",{"type":39,"tag":91,"props":2257,"children":2258},{"style":109},[2259],{"type":44,"value":154},{"type":39,"tag":91,"props":2261,"children":2262},{"style":266},[2263],{"type":44,"value":233},{"type":39,"tag":91,"props":2265,"children":2266},{"style":109},[2267],{"type":44,"value":1566},{"type":39,"tag":91,"props":2269,"children":2270},{"style":499},[2271],{"type":44,"value":2272},"                \u002F\u002F tell the client to delete it\n",{"type":39,"tag":91,"props":2274,"children":2275},{"class":93,"line":27},[2276,2280,2284,2288,2292,2296],{"type":39,"tag":91,"props":2277,"children":2278},{"style":98},[2279],{"type":44,"value":252},{"type":39,"tag":91,"props":2281,"children":2282},{"style":115},[2283],{"type":44,"value":220},{"type":39,"tag":91,"props":2285,"children":2286},{"style":109},[2287],{"type":44,"value":753},{"type":39,"tag":91,"props":2289,"children":2290},{"style":260},[2291],{"type":44,"value":1328},{"type":39,"tag":91,"props":2293,"children":2294},{"style":266},[2295],{"type":44,"value":1333},{"type":39,"tag":91,"props":2297,"children":2298},{"style":109},[2299],{"type":44,"value":159},{"type":39,"tag":91,"props":2301,"children":2302},{"class":93,"line":301},[2303],{"type":39,"tag":91,"props":2304,"children":2305},{"style":109},[2306],{"type":44,"value":298},{"type":39,"tag":1006,"props":2308,"children":2309},{},[2310,2321,2340],{"type":39,"tag":896,"props":2311,"children":2312},{},[2313,2319],{"type":39,"tag":87,"props":2314,"children":2316},{"className":2315},[],[2317],{"type":44,"value":2318},"cookies.get(name)",{"type":44,"value":2320}," — reads a named cookie from the incoming request.",{"type":39,"tag":896,"props":2322,"children":2323},{},[2324,2330,2332,2338],{"type":39,"tag":87,"props":2325,"children":2327},{"className":2326},[],[2328],{"type":44,"value":2329},"cookies.set(options)",{"type":44,"value":2331}," — sets a cookie on the outgoing response (same option shape as the web ",{"type":39,"tag":87,"props":2333,"children":2335},{"className":2334},[],[2336],{"type":44,"value":2337},"CookieStore.set",{"type":44,"value":2339}," standard).",{"type":39,"tag":896,"props":2341,"children":2342},{},[2343,2349],{"type":39,"tag":87,"props":2344,"children":2346},{"className":2345},[],[2347],{"type":44,"value":2348},"cookies.delete(name)",{"type":44,"value":2350}," — instructs the client to delete the cookie.",{"type":39,"tag":53,"props":2352,"children":2354},{"id":2353},"environment-variables",[2355],{"type":44,"value":2356},"Environment Variables",{"type":39,"tag":47,"props":2358,"children":2359},{},[2360,2361,2367,2369,2375,2377,2383],{"type":44,"value":1081},{"type":39,"tag":87,"props":2362,"children":2364},{"className":2363},[],[2365],{"type":44,"value":2366},"Netlify.env",{"type":44,"value":2368}," (not ",{"type":39,"tag":87,"props":2370,"children":2372},{"className":2371},[],[2373],{"type":44,"value":2374},"process.env",{"type":44,"value":2376}," or ",{"type":39,"tag":87,"props":2378,"children":2380},{"className":2379},[],[2381],{"type":44,"value":2382},"Deno.env",{"type":44,"value":2384},"):",{"type":39,"tag":79,"props":2386,"children":2388},{"className":81,"code":2387,"language":83,"meta":84,"style":84},"const secret = Netlify.env.get(\"API_SECRET\");\n",[2389],{"type":39,"tag":87,"props":2390,"children":2391},{"__ignoreMap":84},[2392],{"type":39,"tag":91,"props":2393,"children":2394},{"class":93,"line":94},[2395,2400,2405,2410,2415,2419,2424,2428,2432,2436,2440,2445,2449,2453],{"type":39,"tag":91,"props":2396,"children":2397},{"style":186},[2398],{"type":44,"value":2399},"const",{"type":39,"tag":91,"props":2401,"children":2402},{"style":115},[2403],{"type":44,"value":2404}," secret ",{"type":39,"tag":91,"props":2406,"children":2407},{"style":109},[2408],{"type":44,"value":2409},"=",{"type":39,"tag":91,"props":2411,"children":2412},{"style":115},[2413],{"type":44,"value":2414}," Netlify",{"type":39,"tag":91,"props":2416,"children":2417},{"style":109},[2418],{"type":44,"value":753},{"type":39,"tag":91,"props":2420,"children":2421},{"style":115},[2422],{"type":44,"value":2423},"env",{"type":39,"tag":91,"props":2425,"children":2426},{"style":109},[2427],{"type":44,"value":753},{"type":39,"tag":91,"props":2429,"children":2430},{"style":260},[2431],{"type":44,"value":2091},{"type":39,"tag":91,"props":2433,"children":2434},{"style":115},[2435],{"type":44,"value":269},{"type":39,"tag":91,"props":2437,"children":2438},{"style":109},[2439],{"type":44,"value":154},{"type":39,"tag":91,"props":2441,"children":2442},{"style":146},[2443],{"type":44,"value":2444},"API_SECRET",{"type":39,"tag":91,"props":2446,"children":2447},{"style":109},[2448],{"type":44,"value":154},{"type":39,"tag":91,"props":2450,"children":2451},{"style":115},[2452],{"type":44,"value":233},{"type":39,"tag":91,"props":2454,"children":2455},{"style":109},[2456],{"type":44,"value":159},{"type":39,"tag":53,"props":2458,"children":2460},{"id":2459},"module-support",[2461],{"type":44,"value":2462},"Module Support",{"type":39,"tag":1006,"props":2464,"children":2465},{},[2466,2482,2492],{"type":39,"tag":896,"props":2467,"children":2468},{},[2469,2474,2476],{"type":39,"tag":65,"props":2470,"children":2471},{},[2472],{"type":44,"value":2473},"Node.js builtins",{"type":44,"value":2475},": ",{"type":39,"tag":87,"props":2477,"children":2479},{"className":2478},[],[2480],{"type":44,"value":2481},"import { randomBytes } from \"node:crypto\";",{"type":39,"tag":896,"props":2483,"children":2484},{},[2485,2490],{"type":39,"tag":65,"props":2486,"children":2487},{},[2488],{"type":44,"value":2489},"npm packages",{"type":44,"value":2491},": Install via npm and import by name",{"type":39,"tag":896,"props":2493,"children":2494},{},[2495,2500,2502,2508],{"type":39,"tag":65,"props":2496,"children":2497},{},[2498],{"type":44,"value":2499},"Deno modules",{"type":44,"value":2501},": URL imports (e.g., ",{"type":39,"tag":87,"props":2503,"children":2505},{"className":2504},[],[2506],{"type":44,"value":2507},"import X from \"https:\u002F\u002Fesm.sh\u002Fpackage\"",{"type":44,"value":233},{"type":39,"tag":47,"props":2510,"children":2511},{},[2512],{"type":44,"value":2513},"For URL imports, use an import map:",{"type":39,"tag":79,"props":2515,"children":2519},{"className":2516,"code":2517,"language":2518,"meta":84,"style":84},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F import_map.json\n{ \"imports\": { \"html-rewriter\": \"https:\u002F\u002Fghuc.cc\u002Fworker-tools\u002Fhtml-rewriter\u002Findex.ts\" } }\n","json",[2520],{"type":39,"tag":87,"props":2521,"children":2522},{"__ignoreMap":84},[2523,2531],{"type":39,"tag":91,"props":2524,"children":2525},{"class":93,"line":94},[2526],{"type":39,"tag":91,"props":2527,"children":2528},{"style":499},[2529],{"type":44,"value":2530},"\u002F\u002F import_map.json\n",{"type":39,"tag":91,"props":2532,"children":2533},{"class":93,"line":162},[2534,2538,2542,2547,2551,2555,2559,2563,2568,2572,2576,2580,2585,2589,2593],{"type":39,"tag":91,"props":2535,"children":2536},{"style":109},[2537],{"type":44,"value":2154},{"type":39,"tag":91,"props":2539,"children":2540},{"style":109},[2541],{"type":44,"value":143},{"type":39,"tag":91,"props":2543,"children":2544},{"style":186},[2545],{"type":44,"value":2546},"imports",{"type":39,"tag":91,"props":2548,"children":2549},{"style":109},[2550],{"type":44,"value":154},{"type":39,"tag":91,"props":2552,"children":2553},{"style":109},[2554],{"type":44,"value":205},{"type":39,"tag":91,"props":2556,"children":2557},{"style":109},[2558],{"type":44,"value":112},{"type":39,"tag":91,"props":2560,"children":2561},{"style":109},[2562],{"type":44,"value":143},{"type":39,"tag":91,"props":2564,"children":2565},{"style":208},[2566],{"type":44,"value":2567},"html-rewriter",{"type":39,"tag":91,"props":2569,"children":2570},{"style":109},[2571],{"type":44,"value":154},{"type":39,"tag":91,"props":2573,"children":2574},{"style":109},[2575],{"type":44,"value":205},{"type":39,"tag":91,"props":2577,"children":2578},{"style":109},[2579],{"type":44,"value":143},{"type":39,"tag":91,"props":2581,"children":2582},{"style":146},[2583],{"type":44,"value":2584},"https:\u002F\u002Fghuc.cc\u002Fworker-tools\u002Fhtml-rewriter\u002Findex.ts",{"type":39,"tag":91,"props":2586,"children":2587},{"style":109},[2588],{"type":44,"value":154},{"type":39,"tag":91,"props":2590,"children":2591},{"style":109},[2592],{"type":44,"value":133},{"type":39,"tag":91,"props":2594,"children":2595},{"style":109},[2596],{"type":44,"value":2597}," }\n",{"type":39,"tag":79,"props":2599,"children":2601},{"className":817,"code":2600,"language":819,"meta":84,"style":84},"# netlify.toml\n[functions]\n  deno_import_map = \".\u002Fimport_map.json\"\n",[2602],{"type":39,"tag":87,"props":2603,"children":2604},{"__ignoreMap":84},[2605,2613,2621],{"type":39,"tag":91,"props":2606,"children":2607},{"class":93,"line":94},[2608],{"type":39,"tag":91,"props":2609,"children":2610},{},[2611],{"type":44,"value":2612},"# netlify.toml\n",{"type":39,"tag":91,"props":2614,"children":2615},{"class":93,"line":162},[2616],{"type":39,"tag":91,"props":2617,"children":2618},{},[2619],{"type":44,"value":2620},"[functions]\n",{"type":39,"tag":91,"props":2622,"children":2623},{"class":93,"line":172},[2624],{"type":39,"tag":91,"props":2625,"children":2626},{},[2627],{"type":44,"value":2628},"  deno_import_map = \".\u002Fimport_map.json\"\n",{"type":39,"tag":53,"props":2630,"children":2632},{"id":2631},"when-to-use-edge-vs-serverless",[2633],{"type":44,"value":2634},"When to Use Edge vs Serverless",{"type":39,"tag":2636,"props":2637,"children":2638},"table",{},[2639,2658],{"type":39,"tag":2640,"props":2641,"children":2642},"thead",{},[2643],{"type":39,"tag":2644,"props":2645,"children":2646},"tr",{},[2647,2653],{"type":39,"tag":2648,"props":2649,"children":2650},"th",{},[2651],{"type":44,"value":2652},"Use Edge Functions for",{"type":39,"tag":2648,"props":2654,"children":2655},{},[2656],{"type":44,"value":2657},"Use Serverless Functions for",{"type":39,"tag":2659,"props":2660,"children":2661},"tbody",{},[2662,2676,2689,2702,2715],{"type":39,"tag":2644,"props":2663,"children":2664},{},[2665,2671],{"type":39,"tag":2666,"props":2667,"children":2668},"td",{},[2669],{"type":44,"value":2670},"Low-latency responses",{"type":39,"tag":2666,"props":2672,"children":2673},{},[2674],{"type":44,"value":2675},"Long-running operations (up to 15 min)",{"type":39,"tag":2644,"props":2677,"children":2678},{},[2679,2684],{"type":39,"tag":2666,"props":2680,"children":2681},{},[2682],{"type":44,"value":2683},"Request\u002Fresponse manipulation",{"type":39,"tag":2666,"props":2685,"children":2686},{},[2687],{"type":44,"value":2688},"Complex Node.js dependencies",{"type":39,"tag":2644,"props":2690,"children":2691},{},[2692,2697],{"type":39,"tag":2666,"props":2693,"children":2694},{},[2695],{"type":44,"value":2696},"Geolocation-based logic",{"type":39,"tag":2666,"props":2698,"children":2699},{},[2700],{"type":44,"value":2701},"Database-heavy operations",{"type":39,"tag":2644,"props":2703,"children":2704},{},[2705,2710],{"type":39,"tag":2666,"props":2706,"children":2707},{},[2708],{"type":44,"value":2709},"Auth checks and redirects",{"type":39,"tag":2666,"props":2711,"children":2712},{},[2713],{"type":44,"value":2714},"Background\u002Fscheduled tasks",{"type":39,"tag":2644,"props":2716,"children":2717},{},[2718,2723],{"type":39,"tag":2666,"props":2719,"children":2720},{},[2721],{"type":44,"value":2722},"A\u002FB testing, personalization",{"type":39,"tag":2666,"props":2724,"children":2725},{},[2726],{"type":44,"value":2727},"Tasks needing > 512 MB memory",{"type":39,"tag":53,"props":2729,"children":2731},{"id":2730},"limits",[2732],{"type":44,"value":2733},"Limits",{"type":39,"tag":2636,"props":2735,"children":2736},{},[2737,2753],{"type":39,"tag":2640,"props":2738,"children":2739},{},[2740],{"type":39,"tag":2644,"props":2741,"children":2742},{},[2743,2748],{"type":39,"tag":2648,"props":2744,"children":2745},{},[2746],{"type":44,"value":2747},"Resource",{"type":39,"tag":2648,"props":2749,"children":2750},{},[2751],{"type":44,"value":2752},"Limit",{"type":39,"tag":2659,"props":2754,"children":2755},{},[2756,2769,2782,2795],{"type":39,"tag":2644,"props":2757,"children":2758},{},[2759,2764],{"type":39,"tag":2666,"props":2760,"children":2761},{},[2762],{"type":44,"value":2763},"CPU time",{"type":39,"tag":2666,"props":2765,"children":2766},{},[2767],{"type":44,"value":2768},"50 ms per request",{"type":39,"tag":2644,"props":2770,"children":2771},{},[2772,2777],{"type":39,"tag":2666,"props":2773,"children":2774},{},[2775],{"type":44,"value":2776},"Memory",{"type":39,"tag":2666,"props":2778,"children":2779},{},[2780],{"type":44,"value":2781},"512 MB per deployed set",{"type":39,"tag":2644,"props":2783,"children":2784},{},[2785,2790],{"type":39,"tag":2666,"props":2786,"children":2787},{},[2788],{"type":44,"value":2789},"Response header timeout",{"type":39,"tag":2666,"props":2791,"children":2792},{},[2793],{"type":44,"value":2794},"40 seconds",{"type":39,"tag":2644,"props":2796,"children":2797},{},[2798,2803],{"type":39,"tag":2666,"props":2799,"children":2800},{},[2801],{"type":44,"value":2802},"Code size",{"type":39,"tag":2666,"props":2804,"children":2805},{},[2806],{"type":44,"value":2807},"20 MB compressed",{"type":39,"tag":2809,"props":2810,"children":2811},"style",{},[2812],{"type":44,"value":2813},"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":2815,"total":2924},[2816,2833,2850,2865,2882,2897,2909],{"slug":2817,"name":2817,"fn":2818,"description":2819,"org":2820,"tags":2821,"stars":23,"repoUrl":24,"updatedAt":2832},"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},[2822,2825,2826,2829],{"name":2823,"slug":2824,"type":15},"Access Control","access-control",{"name":9,"slug":8,"type":15},{"name":2827,"slug":2828,"type":15},"Permissions","permissions",{"name":2830,"slug":2831,"type":15},"Security","security","2026-07-14T05:40:29.082149",{"slug":2834,"name":2834,"fn":2835,"description":2836,"org":2837,"tags":2838,"stars":23,"repoUrl":24,"updatedAt":2849},"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},[2839,2842,2845,2848],{"name":2840,"slug":2841,"type":15},"Agents","agents",{"name":2843,"slug":2844,"type":15},"Automation","automation",{"name":2846,"slug":2847,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},"2026-07-17T05:30:19.462913",{"slug":2851,"name":2851,"fn":2852,"description":2853,"org":2854,"tags":2855,"stars":23,"repoUrl":24,"updatedAt":2864},"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},[2856,2859,2862,2863],{"name":2857,"slug":2858,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2860,"slug":2861,"type":15},"API Development","api-development",{"name":2846,"slug":2847,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:13.14555",{"slug":2866,"name":2866,"fn":2867,"description":2868,"org":2869,"tags":2870,"stars":23,"repoUrl":24,"updatedAt":2881},"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},[2871,2874,2877,2878],{"name":2872,"slug":2873,"type":15},"Backend","backend",{"name":2875,"slug":2876,"type":15},"File Storage","file-storage",{"name":9,"slug":8,"type":15},{"name":2879,"slug":2880,"type":15},"Storage","storage","2026-07-17T05:30:16.503306",{"slug":2883,"name":2883,"fn":2884,"description":2885,"org":2886,"tags":2887,"stars":23,"repoUrl":24,"updatedAt":2896},"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},[2888,2891,2894,2895],{"name":2889,"slug":2890,"type":15},"Caching","caching",{"name":2892,"slug":2893,"type":15},"Deployment","deployment",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},"2026-07-14T05:40:20.066717",{"slug":2898,"name":2898,"fn":2899,"description":2900,"org":2901,"tags":2902,"stars":23,"repoUrl":24,"updatedAt":2908},"netlify-config","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},[2903,2906,2907],{"name":2904,"slug":2905,"type":15},"Configuration","configuration",{"name":2892,"slug":2893,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:21.284801",{"slug":2910,"name":2910,"fn":2911,"description":2912,"org":2913,"tags":2914,"stars":23,"repoUrl":24,"updatedAt":2923},"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},[2915,2916,2919,2920],{"name":2872,"slug":2873,"type":15},{"name":2917,"slug":2918,"type":15},"Database","database",{"name":9,"slug":8,"type":15},{"name":2921,"slug":2922,"type":15},"PostgreSQL","postgresql","2026-07-20T05:58:58.934045",15,{"items":2926,"total":3037},[2927,2942,2954,2961,2968,2975,2982,2989,2995,3002,3015,3022],{"slug":2928,"name":2928,"fn":2929,"description":2930,"org":2931,"tags":2932,"stars":2939,"repoUrl":2940,"updatedAt":2941},"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},[2933,2934,2935,2938],{"name":2840,"slug":2841,"type":15},{"name":2904,"slug":2905,"type":15},{"name":2936,"slug":2937,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},32,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Faxis","2026-07-20T05:59:47.468757",{"slug":2943,"name":2943,"fn":2944,"description":2945,"org":2946,"tags":2947,"stars":2939,"repoUrl":2940,"updatedAt":2953},"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},[2948,2951,2952],{"name":2949,"slug":2950,"type":15},"CLI","cli",{"name":2936,"slug":2937,"type":15},{"name":9,"slug":8,"type":15},"2026-07-14T05:40:13.443461",{"slug":2817,"name":2817,"fn":2818,"description":2819,"org":2955,"tags":2956,"stars":23,"repoUrl":24,"updatedAt":2832},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2957,2958,2959,2960],{"name":2823,"slug":2824,"type":15},{"name":9,"slug":8,"type":15},{"name":2827,"slug":2828,"type":15},{"name":2830,"slug":2831,"type":15},{"slug":2834,"name":2834,"fn":2835,"description":2836,"org":2962,"tags":2963,"stars":23,"repoUrl":24,"updatedAt":2849},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2964,2965,2966,2967],{"name":2840,"slug":2841,"type":15},{"name":2843,"slug":2844,"type":15},{"name":2846,"slug":2847,"type":15},{"name":9,"slug":8,"type":15},{"slug":2851,"name":2851,"fn":2852,"description":2853,"org":2969,"tags":2970,"stars":23,"repoUrl":24,"updatedAt":2864},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2971,2972,2973,2974],{"name":2857,"slug":2858,"type":15},{"name":2860,"slug":2861,"type":15},{"name":2846,"slug":2847,"type":15},{"name":9,"slug":8,"type":15},{"slug":2866,"name":2866,"fn":2867,"description":2868,"org":2976,"tags":2977,"stars":23,"repoUrl":24,"updatedAt":2881},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2978,2979,2980,2981],{"name":2872,"slug":2873,"type":15},{"name":2875,"slug":2876,"type":15},{"name":9,"slug":8,"type":15},{"name":2879,"slug":2880,"type":15},{"slug":2883,"name":2883,"fn":2884,"description":2885,"org":2983,"tags":2984,"stars":23,"repoUrl":24,"updatedAt":2896},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2985,2986,2987,2988],{"name":2889,"slug":2890,"type":15},{"name":2892,"slug":2893,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"slug":2898,"name":2898,"fn":2899,"description":2900,"org":2990,"tags":2991,"stars":23,"repoUrl":24,"updatedAt":2908},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2992,2993,2994],{"name":2904,"slug":2905,"type":15},{"name":2892,"slug":2893,"type":15},{"name":9,"slug":8,"type":15},{"slug":2910,"name":2910,"fn":2911,"description":2912,"org":2996,"tags":2997,"stars":23,"repoUrl":24,"updatedAt":2923},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2998,2999,3000,3001],{"name":2872,"slug":2873,"type":15},{"name":2917,"slug":2918,"type":15},{"name":9,"slug":8,"type":15},{"name":2921,"slug":2922,"type":15},{"slug":3003,"name":3003,"fn":3004,"description":3005,"org":3006,"tags":3007,"stars":23,"repoUrl":24,"updatedAt":3014},"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},[3008,3009,3010,3011],{"name":2949,"slug":2950,"type":15},{"name":2892,"slug":2893,"type":15},{"name":9,"slug":8,"type":15},{"name":3012,"slug":3013,"type":15},"Web Development","web-development","2026-07-17T05:30:14.218977",{"slug":4,"name":4,"fn":5,"description":6,"org":3016,"tags":3017,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3018,3019,3020,3021],{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"slug":3023,"name":3023,"fn":3024,"description":3025,"org":3026,"tags":3027,"stars":23,"repoUrl":24,"updatedAt":3036},"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},[3028,3031,3034,3035],{"name":3029,"slug":3030,"type":15},"Forms","forms",{"name":3032,"slug":3033,"type":15},"HTML","html",{"name":9,"slug":8,"type":15},{"name":3012,"slug":3013,"type":15},"2026-07-14T05:40:16.075367",17]