[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-netlify-netlify-config":3,"mdc--37rbpq-key":30,"related-repo-netlify-netlify-config":2137,"related-org-netlify-netlify-config":2241},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":26,"sourceUrl":28,"mdContent":29},"netlify-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},"netlify","Netlify","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnetlify.png",[12,16,17],{"name":13,"slug":14,"type":15},"Configuration","configuration","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Deployment","deployment",24,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools","2026-07-17T05:30:21.284801",null,5,[],{"repoUrl":21,"stars":20,"forks":24,"topics":27,"description":23},[],"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools\u002Ftree\u002FHEAD\u002Fskills\u002Fnetlify-config","---\nname: netlify-config\ndescription: 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).\n---\n\n# Netlify Configuration (netlify.toml)\n\nPlace `netlify.toml` at the repository root. In a monorepo, Netlify searches for the config and uses the **first** one it finds: the package directory (the subdirectory containing the site), then the base directory, then the repository root — so put a site-specific `netlify.toml` in the package directory to take precedence over root-level config (see the **netlify-deploy** skill's monorepo notes).\n\n**`netlify.toml` takes precedence over the Netlify UI.** When the same property (build command, publish directory, an environment variable, a redirect, a header) is configured in both places, the value in `netlify.toml` wins and silently overrides the corresponding Netlify UI setting — the dashboard field still shows its old value but is inert. Once a `netlify.toml` is present, treat it as the source of truth and change settings there, not in the UI.\n\n## Build Settings\n\n```toml\n[build]\n  base = \"project\u002F\"          # Base directory (default: root)\n  command = \"npm run build\"  # Build command\n  publish = \"dist\u002F\"          # Output directory\n```\n\n## Redirects\n\n```toml\n# Basic redirect\n[[redirects]]\nfrom = \"\u002Fold\"\nto = \"\u002Fnew\"\nstatus = 301              # 301 (default), 302, 200 (rewrite), 404\n\n# SPA catch-all\n[[redirects]]\nfrom = \"\u002F*\"\nto = \"\u002Findex.html\"\nstatus = 200\n\n# Splat (wildcard)\n[[redirects]]\nfrom = \"\u002Fblog\u002F*\"\nto = \"\u002Fnews\u002F:splat\"\n\n# Path parameters\n[[redirects]]\nfrom = \"\u002Fusers\u002F:id\"\nto = \"\u002Fapi\u002Fusers\u002F:id\"\nstatus = 200\n\n# Force (override existing files)\n[[redirects]]\nfrom = \"\u002Fapp\u002F*\"\nto = \"\u002Findex.html\"\nstatus = 200\nforce = true\n\n# Proxy to external service\n[[redirects]]\nfrom = \"\u002Fapi\u002F*\"\nto = \"https:\u002F\u002Fapi.example.com\u002F:splat\"\nstatus = 200\n[redirects.headers]\n  X-Custom = \"value\"\n\n# Country\u002Flanguage conditions\n[[redirects]]\nfrom = \"\u002F*\"\nto = \"\u002Ffr\u002F:splat\"\nstatus = 200\nconditions = { Country = [\"FR\"], Language = [\"fr\"] }\n```\n\n**Rule order matters** — Netlify processes the first matching rule. Place specific rules before general ones.\n\nRedirect rules can also live in a plain-text `_redirects` file in the publish directory. If both a `_redirects` file and `[[redirects]]` in `netlify.toml` exist, the `_redirects` file rules are processed **first**, then the `netlify.toml` rules, reading top to bottom — and the first matching rule wins. The same ordering applies to a `_headers` file versus `[[headers]]`. Because a `_redirects` rule can silently shadow a `netlify.toml` rule for the same path, keep overlapping rules in a single source.\n\n## Headers\n\n```toml\n[[headers]]\nfor = \"\u002F*\"\n[headers.values]\n  X-Frame-Options = \"DENY\"\n  X-Content-Type-Options = \"nosniff\"\n\n[[headers]]\nfor = \"\u002Fassets\u002F*\"\n[headers.values]\n  Cache-Control = \"public, max-age=31536000, immutable\"\n```\n\nHeaders apply only to files served from Netlify's CDN (not to function or edge function responses — set those in code).\n\n## Deploy Contexts\n\nOverride settings per deploy context:\n\n```toml\n[context.production]\ncommand = \"npm run build\"\nenvironment = { NODE_ENV = \"production\" }\n\n[context.deploy-preview]\ncommand = \"npm run build:preview\"\n\n[context.branch-deploy]\ncommand = \"npm run build:staging\"\n\n[context.dev]\nenvironment = { NODE_ENV = \"development\" }\n\n# Specific branch\n[context.\"staging\"]\ncommand = \"npm run build:staging\"\n```\n\n**`[[redirects]]` and `[[headers]]` are global — they cannot be scoped to a deploy context.** Context tables like `[context.production]` work for keys such as `[build]`, `[build.environment]`, and `[[plugins]]`, but redirect and header rules apply to every context no matter where you place them in the file; there is no `[context.production.redirects]` or context-nested `[[redirects]]`. For context-specific redirects or headers, use the per-deploy escape hatch: generate a `_redirects` or `_headers` file during that context's build (those files ship per deploy), or gate the behavior on a runtime signal in an edge function.\n\n## Environment Variables\n\n```toml\n[build.environment]\nNODE_VERSION = \"20\"\n\n[context.production.environment]\nAPI_URL = \"https:\u002F\u002Fapi.prod.com\"\n\n[context.deploy-preview.environment]\nAPI_URL = \"https:\u002F\u002Fapi.staging.com\"\n```\n\n**Do not put secrets in netlify.toml** (it's committed to source control). Use the Netlify UI or CLI for sensitive values — see CLI Management below.\n\n**Variables declared in `netlify.toml` are build-scoped only.** Values under `[build.environment]` or `[context.*.environment]` are available to the build (and snippet injection) but are **not** injected into the Functions or Edge Functions runtime — reading them with `Netlify.env.get(\"VAR\")` or `process.env.VAR` inside a function returns `undefined`. To make a variable available at function runtime, set it in the Netlify UI or with `netlify env:set` (those are available to both builds and runtime), not in `netlify.toml`.\n\n### CLI Management\n\n```bash\n# Set\nnetlify env:set API_KEY \"value\"\nnetlify env:set API_KEY \"value\" --secret              # Hidden from logs\nnetlify env:set API_KEY \"value\" --context production   # Context-specific\n\n# Get\nnetlify env:get API_KEY\n\n# List\nnetlify env:list\nnetlify env:list --plain > .env   # Local snapshot only — keep .env gitignored, never commit it\n\n# Import from file\nnetlify env:import .env\n\n# Delete\nnetlify env:unset API_KEY\n```\n\n**Never put secrets in client-prefixed variables** (`VITE_`, `PUBLIC_`, `NEXT_PUBLIC_`, `NUXT_PUBLIC_`) — these are inlined into the client bundle and exposed to the browser. `--secret` only hides a value from logs and the UI; it does not protect a client-prefixed variable.\n\n### Context Scoping\n\nVariables set via the CLI can also be scoped to deploy contexts:\n\n```bash\nnetlify env:set API_URL \"https:\u002F\u002Fapi.prod.com\" --context production\nnetlify env:set API_URL \"https:\u002F\u002Fapi.staging.com\" --context deploy-preview\nnetlify env:set DEBUG \"true\" --context branch:feature-x\n```\n\nThis is the CLI equivalent of the `[context.*.environment]` tables above, but the resulting variables are available at both build and runtime (unlike `netlify.toml`-declared ones).\n\nWhen reading these variables in server code, prefer `Netlify.env.get(\"VAR\")`. `process.env.VAR` also works inside Functions, but Edge Functions expose only `Netlify.env.get` — the portable form keeps the same code working in both runtimes.\n\nFor the client-side rules (`VITE_`\u002F`PUBLIC_` prefixes and framework specifics), see the **netlify-frameworks** skill; for function-side details, see **netlify-functions**.\n\n## Functions Configuration\n\n```toml\n[functions]\ndirectory = \"netlify\u002Ffunctions\"   # Default\nnode_bundler = \"esbuild\"\n\n# Scheduled function\n[functions.\"cleanup\"]\nschedule = \"@daily\"\n```\n\nUse the single-table `[functions]` form for global settings and `[functions.\"name-or-glob\"]` for per-function overrides. There is **no** `[[functions]]` array-of-tables and no path-based function routing table in `netlify.toml` — functions are routed by file (served at `\u002F.netlify\u002Ffunctions\u002F{name}`) or by an in-code `path`\u002F`config` export, not by config.\n\n## Edge Functions Configuration\n\n```toml\n[[edge_functions]]\npath = \"\u002Fadmin\u002F*\"\nfunction = \"auth\"\nexcludedPath = \"\u002Fadmin\u002Fpublic\u002F*\"   # Carve exceptions out of `path` (string or array of globs)\n\n# Import map for Deno URL imports\n[functions]\ndeno_import_map = \".\u002Fimport_map.json\"\n```\n\n## Dev Server\n\n```toml\n[dev]\ncommand = \"npm start\"       # Dev server command\nport = 8888                 # Netlify Dev port\ntargetPort = 3000           # Your app's dev server port\nframework = \"#auto\"         # \"#auto\", \"#static\", \"#custom\"\n```\n\n**If you set both a custom `command` and a `targetPort`, `framework` must be `\"#custom\"`.** With `framework = \"#auto\"` (the default) Netlify Dev runs its own detector and ignores your custom `command`; `\"#custom\"` tells it to run your `command` as the app server and connect to `targetPort`. Setting `command` + `targetPort` while leaving `framework` at `#auto` (or omitting it) is a silent misconfiguration.\n\n## Plugins\n\n```toml\n[[plugins]]\npackage = \"@netlify\u002Fplugin-lighthouse\"\n[plugins.inputs]\n  audits = [\"performance\", \"accessibility\"]\n```\n\n## Image CDN\n\n```toml\n[images]\nremote_images = [\"https:\u002F\u002Fexample\\\\.com\u002F.*\"]\n```\n\nSee the **netlify-image-cdn** skill for full Image CDN usage.\n",{"data":31,"body":32},{"name":4,"description":6},{"type":33,"children":34},"root",[35,44,81,110,117,166,172,553,563,648,654,738,743,749,754,884,967,973,1042,1052,1128,1135,1422,1469,1475,1480,1600,1619,1646,1678,1684,1746,1812,1818,1887,1893,1940,2045,2051,2090,2096,2119,2131],{"type":36,"tag":37,"props":38,"children":40},"element","h1",{"id":39},"netlify-configuration-netlifytoml",[41],{"type":42,"value":43},"text","Netlify Configuration (netlify.toml)",{"type":36,"tag":45,"props":46,"children":47},"p",{},[48,50,57,59,65,67,72,74,79],{"type":42,"value":49},"Place ",{"type":36,"tag":51,"props":52,"children":54},"code",{"className":53},[],[55],{"type":42,"value":56},"netlify.toml",{"type":42,"value":58}," at the repository root. In a monorepo, Netlify searches for the config and uses the ",{"type":36,"tag":60,"props":61,"children":62},"strong",{},[63],{"type":42,"value":64},"first",{"type":42,"value":66}," one it finds: the package directory (the subdirectory containing the site), then the base directory, then the repository root — so put a site-specific ",{"type":36,"tag":51,"props":68,"children":70},{"className":69},[],[71],{"type":42,"value":56},{"type":42,"value":73}," in the package directory to take precedence over root-level config (see the ",{"type":36,"tag":60,"props":75,"children":76},{},[77],{"type":42,"value":78},"netlify-deploy",{"type":42,"value":80}," skill's monorepo notes).",{"type":36,"tag":45,"props":82,"children":83},{},[84,94,96,101,103,108],{"type":36,"tag":60,"props":85,"children":86},{},[87,92],{"type":36,"tag":51,"props":88,"children":90},{"className":89},[],[91],{"type":42,"value":56},{"type":42,"value":93}," takes precedence over the Netlify UI.",{"type":42,"value":95}," When the same property (build command, publish directory, an environment variable, a redirect, a header) is configured in both places, the value in ",{"type":36,"tag":51,"props":97,"children":99},{"className":98},[],[100],{"type":42,"value":56},{"type":42,"value":102}," wins and silently overrides the corresponding Netlify UI setting — the dashboard field still shows its old value but is inert. Once a ",{"type":36,"tag":51,"props":104,"children":106},{"className":105},[],[107],{"type":42,"value":56},{"type":42,"value":109}," is present, treat it as the source of truth and change settings there, not in the UI.",{"type":36,"tag":111,"props":112,"children":114},"h2",{"id":113},"build-settings",[115],{"type":42,"value":116},"Build Settings",{"type":36,"tag":118,"props":119,"children":124},"pre",{"className":120,"code":121,"language":122,"meta":123,"style":123},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[build]\n  base = \"project\u002F\"          # Base directory (default: root)\n  command = \"npm run build\"  # Build command\n  publish = \"dist\u002F\"          # Output directory\n","toml","",[125],{"type":36,"tag":51,"props":126,"children":127},{"__ignoreMap":123},[128,139,148,157],{"type":36,"tag":129,"props":130,"children":133},"span",{"class":131,"line":132},"line",1,[134],{"type":36,"tag":129,"props":135,"children":136},{},[137],{"type":42,"value":138},"[build]\n",{"type":36,"tag":129,"props":140,"children":142},{"class":131,"line":141},2,[143],{"type":36,"tag":129,"props":144,"children":145},{},[146],{"type":42,"value":147},"  base = \"project\u002F\"          # Base directory (default: root)\n",{"type":36,"tag":129,"props":149,"children":151},{"class":131,"line":150},3,[152],{"type":36,"tag":129,"props":153,"children":154},{},[155],{"type":42,"value":156},"  command = \"npm run build\"  # Build command\n",{"type":36,"tag":129,"props":158,"children":160},{"class":131,"line":159},4,[161],{"type":36,"tag":129,"props":162,"children":163},{},[164],{"type":42,"value":165},"  publish = \"dist\u002F\"          # Output directory\n",{"type":36,"tag":111,"props":167,"children":169},{"id":168},"redirects",[170],{"type":42,"value":171},"Redirects",{"type":36,"tag":118,"props":173,"children":175},{"className":120,"code":174,"language":122,"meta":123,"style":123},"# Basic redirect\n[[redirects]]\nfrom = \"\u002Fold\"\nto = \"\u002Fnew\"\nstatus = 301              # 301 (default), 302, 200 (rewrite), 404\n\n# SPA catch-all\n[[redirects]]\nfrom = \"\u002F*\"\nto = \"\u002Findex.html\"\nstatus = 200\n\n# Splat (wildcard)\n[[redirects]]\nfrom = \"\u002Fblog\u002F*\"\nto = \"\u002Fnews\u002F:splat\"\n\n# Path parameters\n[[redirects]]\nfrom = \"\u002Fusers\u002F:id\"\nto = \"\u002Fapi\u002Fusers\u002F:id\"\nstatus = 200\n\n# Force (override existing files)\n[[redirects]]\nfrom = \"\u002Fapp\u002F*\"\nto = \"\u002Findex.html\"\nstatus = 200\nforce = true\n\n# Proxy to external service\n[[redirects]]\nfrom = \"\u002Fapi\u002F*\"\nto = \"https:\u002F\u002Fapi.example.com\u002F:splat\"\nstatus = 200\n[redirects.headers]\n  X-Custom = \"value\"\n\n# Country\u002Flanguage conditions\n[[redirects]]\nfrom = \"\u002F*\"\nto = \"\u002Ffr\u002F:splat\"\nstatus = 200\nconditions = { Country = [\"FR\"], Language = [\"fr\"] }\n",[176],{"type":36,"tag":51,"props":177,"children":178},{"__ignoreMap":123},[179,187,195,203,211,219,229,238,246,255,264,273,281,290,298,307,316,324,333,341,350,359,367,375,383,391,400,408,416,425,433,442,450,459,468,476,485,494,502,511,519,527,536,544],{"type":36,"tag":129,"props":180,"children":181},{"class":131,"line":132},[182],{"type":36,"tag":129,"props":183,"children":184},{},[185],{"type":42,"value":186},"# Basic redirect\n",{"type":36,"tag":129,"props":188,"children":189},{"class":131,"line":141},[190],{"type":36,"tag":129,"props":191,"children":192},{},[193],{"type":42,"value":194},"[[redirects]]\n",{"type":36,"tag":129,"props":196,"children":197},{"class":131,"line":150},[198],{"type":36,"tag":129,"props":199,"children":200},{},[201],{"type":42,"value":202},"from = \"\u002Fold\"\n",{"type":36,"tag":129,"props":204,"children":205},{"class":131,"line":159},[206],{"type":36,"tag":129,"props":207,"children":208},{},[209],{"type":42,"value":210},"to = \"\u002Fnew\"\n",{"type":36,"tag":129,"props":212,"children":213},{"class":131,"line":24},[214],{"type":36,"tag":129,"props":215,"children":216},{},[217],{"type":42,"value":218},"status = 301              # 301 (default), 302, 200 (rewrite), 404\n",{"type":36,"tag":129,"props":220,"children":222},{"class":131,"line":221},6,[223],{"type":36,"tag":129,"props":224,"children":226},{"emptyLinePlaceholder":225},true,[227],{"type":42,"value":228},"\n",{"type":36,"tag":129,"props":230,"children":232},{"class":131,"line":231},7,[233],{"type":36,"tag":129,"props":234,"children":235},{},[236],{"type":42,"value":237},"# SPA catch-all\n",{"type":36,"tag":129,"props":239,"children":241},{"class":131,"line":240},8,[242],{"type":36,"tag":129,"props":243,"children":244},{},[245],{"type":42,"value":194},{"type":36,"tag":129,"props":247,"children":249},{"class":131,"line":248},9,[250],{"type":36,"tag":129,"props":251,"children":252},{},[253],{"type":42,"value":254},"from = \"\u002F*\"\n",{"type":36,"tag":129,"props":256,"children":258},{"class":131,"line":257},10,[259],{"type":36,"tag":129,"props":260,"children":261},{},[262],{"type":42,"value":263},"to = \"\u002Findex.html\"\n",{"type":36,"tag":129,"props":265,"children":267},{"class":131,"line":266},11,[268],{"type":36,"tag":129,"props":269,"children":270},{},[271],{"type":42,"value":272},"status = 200\n",{"type":36,"tag":129,"props":274,"children":276},{"class":131,"line":275},12,[277],{"type":36,"tag":129,"props":278,"children":279},{"emptyLinePlaceholder":225},[280],{"type":42,"value":228},{"type":36,"tag":129,"props":282,"children":284},{"class":131,"line":283},13,[285],{"type":36,"tag":129,"props":286,"children":287},{},[288],{"type":42,"value":289},"# Splat (wildcard)\n",{"type":36,"tag":129,"props":291,"children":293},{"class":131,"line":292},14,[294],{"type":36,"tag":129,"props":295,"children":296},{},[297],{"type":42,"value":194},{"type":36,"tag":129,"props":299,"children":301},{"class":131,"line":300},15,[302],{"type":36,"tag":129,"props":303,"children":304},{},[305],{"type":42,"value":306},"from = \"\u002Fblog\u002F*\"\n",{"type":36,"tag":129,"props":308,"children":310},{"class":131,"line":309},16,[311],{"type":36,"tag":129,"props":312,"children":313},{},[314],{"type":42,"value":315},"to = \"\u002Fnews\u002F:splat\"\n",{"type":36,"tag":129,"props":317,"children":319},{"class":131,"line":318},17,[320],{"type":36,"tag":129,"props":321,"children":322},{"emptyLinePlaceholder":225},[323],{"type":42,"value":228},{"type":36,"tag":129,"props":325,"children":327},{"class":131,"line":326},18,[328],{"type":36,"tag":129,"props":329,"children":330},{},[331],{"type":42,"value":332},"# Path parameters\n",{"type":36,"tag":129,"props":334,"children":336},{"class":131,"line":335},19,[337],{"type":36,"tag":129,"props":338,"children":339},{},[340],{"type":42,"value":194},{"type":36,"tag":129,"props":342,"children":344},{"class":131,"line":343},20,[345],{"type":36,"tag":129,"props":346,"children":347},{},[348],{"type":42,"value":349},"from = \"\u002Fusers\u002F:id\"\n",{"type":36,"tag":129,"props":351,"children":353},{"class":131,"line":352},21,[354],{"type":36,"tag":129,"props":355,"children":356},{},[357],{"type":42,"value":358},"to = \"\u002Fapi\u002Fusers\u002F:id\"\n",{"type":36,"tag":129,"props":360,"children":362},{"class":131,"line":361},22,[363],{"type":36,"tag":129,"props":364,"children":365},{},[366],{"type":42,"value":272},{"type":36,"tag":129,"props":368,"children":370},{"class":131,"line":369},23,[371],{"type":36,"tag":129,"props":372,"children":373},{"emptyLinePlaceholder":225},[374],{"type":42,"value":228},{"type":36,"tag":129,"props":376,"children":377},{"class":131,"line":20},[378],{"type":36,"tag":129,"props":379,"children":380},{},[381],{"type":42,"value":382},"# Force (override existing files)\n",{"type":36,"tag":129,"props":384,"children":386},{"class":131,"line":385},25,[387],{"type":36,"tag":129,"props":388,"children":389},{},[390],{"type":42,"value":194},{"type":36,"tag":129,"props":392,"children":394},{"class":131,"line":393},26,[395],{"type":36,"tag":129,"props":396,"children":397},{},[398],{"type":42,"value":399},"from = \"\u002Fapp\u002F*\"\n",{"type":36,"tag":129,"props":401,"children":403},{"class":131,"line":402},27,[404],{"type":36,"tag":129,"props":405,"children":406},{},[407],{"type":42,"value":263},{"type":36,"tag":129,"props":409,"children":411},{"class":131,"line":410},28,[412],{"type":36,"tag":129,"props":413,"children":414},{},[415],{"type":42,"value":272},{"type":36,"tag":129,"props":417,"children":419},{"class":131,"line":418},29,[420],{"type":36,"tag":129,"props":421,"children":422},{},[423],{"type":42,"value":424},"force = true\n",{"type":36,"tag":129,"props":426,"children":428},{"class":131,"line":427},30,[429],{"type":36,"tag":129,"props":430,"children":431},{"emptyLinePlaceholder":225},[432],{"type":42,"value":228},{"type":36,"tag":129,"props":434,"children":436},{"class":131,"line":435},31,[437],{"type":36,"tag":129,"props":438,"children":439},{},[440],{"type":42,"value":441},"# Proxy to external service\n",{"type":36,"tag":129,"props":443,"children":445},{"class":131,"line":444},32,[446],{"type":36,"tag":129,"props":447,"children":448},{},[449],{"type":42,"value":194},{"type":36,"tag":129,"props":451,"children":453},{"class":131,"line":452},33,[454],{"type":36,"tag":129,"props":455,"children":456},{},[457],{"type":42,"value":458},"from = \"\u002Fapi\u002F*\"\n",{"type":36,"tag":129,"props":460,"children":462},{"class":131,"line":461},34,[463],{"type":36,"tag":129,"props":464,"children":465},{},[466],{"type":42,"value":467},"to = \"https:\u002F\u002Fapi.example.com\u002F:splat\"\n",{"type":36,"tag":129,"props":469,"children":471},{"class":131,"line":470},35,[472],{"type":36,"tag":129,"props":473,"children":474},{},[475],{"type":42,"value":272},{"type":36,"tag":129,"props":477,"children":479},{"class":131,"line":478},36,[480],{"type":36,"tag":129,"props":481,"children":482},{},[483],{"type":42,"value":484},"[redirects.headers]\n",{"type":36,"tag":129,"props":486,"children":488},{"class":131,"line":487},37,[489],{"type":36,"tag":129,"props":490,"children":491},{},[492],{"type":42,"value":493},"  X-Custom = \"value\"\n",{"type":36,"tag":129,"props":495,"children":497},{"class":131,"line":496},38,[498],{"type":36,"tag":129,"props":499,"children":500},{"emptyLinePlaceholder":225},[501],{"type":42,"value":228},{"type":36,"tag":129,"props":503,"children":505},{"class":131,"line":504},39,[506],{"type":36,"tag":129,"props":507,"children":508},{},[509],{"type":42,"value":510},"# Country\u002Flanguage conditions\n",{"type":36,"tag":129,"props":512,"children":514},{"class":131,"line":513},40,[515],{"type":36,"tag":129,"props":516,"children":517},{},[518],{"type":42,"value":194},{"type":36,"tag":129,"props":520,"children":522},{"class":131,"line":521},41,[523],{"type":36,"tag":129,"props":524,"children":525},{},[526],{"type":42,"value":254},{"type":36,"tag":129,"props":528,"children":530},{"class":131,"line":529},42,[531],{"type":36,"tag":129,"props":532,"children":533},{},[534],{"type":42,"value":535},"to = \"\u002Ffr\u002F:splat\"\n",{"type":36,"tag":129,"props":537,"children":539},{"class":131,"line":538},43,[540],{"type":36,"tag":129,"props":541,"children":542},{},[543],{"type":42,"value":272},{"type":36,"tag":129,"props":545,"children":547},{"class":131,"line":546},44,[548],{"type":36,"tag":129,"props":549,"children":550},{},[551],{"type":42,"value":552},"conditions = { Country = [\"FR\"], Language = [\"fr\"] }\n",{"type":36,"tag":45,"props":554,"children":555},{},[556,561],{"type":36,"tag":60,"props":557,"children":558},{},[559],{"type":42,"value":560},"Rule order matters",{"type":42,"value":562}," — Netlify processes the first matching rule. Place specific rules before general ones.",{"type":36,"tag":45,"props":564,"children":565},{},[566,568,574,576,581,583,589,591,596,598,603,605,609,611,616,618,624,626,632,634,639,641,646],{"type":42,"value":567},"Redirect rules can also live in a plain-text ",{"type":36,"tag":51,"props":569,"children":571},{"className":570},[],[572],{"type":42,"value":573},"_redirects",{"type":42,"value":575}," file in the publish directory. If both a ",{"type":36,"tag":51,"props":577,"children":579},{"className":578},[],[580],{"type":42,"value":573},{"type":42,"value":582}," file and ",{"type":36,"tag":51,"props":584,"children":586},{"className":585},[],[587],{"type":42,"value":588},"[[redirects]]",{"type":42,"value":590}," in ",{"type":36,"tag":51,"props":592,"children":594},{"className":593},[],[595],{"type":42,"value":56},{"type":42,"value":597}," exist, the ",{"type":36,"tag":51,"props":599,"children":601},{"className":600},[],[602],{"type":42,"value":573},{"type":42,"value":604}," file rules are processed ",{"type":36,"tag":60,"props":606,"children":607},{},[608],{"type":42,"value":64},{"type":42,"value":610},", then the ",{"type":36,"tag":51,"props":612,"children":614},{"className":613},[],[615],{"type":42,"value":56},{"type":42,"value":617}," rules, reading top to bottom — and the first matching rule wins. The same ordering applies to a ",{"type":36,"tag":51,"props":619,"children":621},{"className":620},[],[622],{"type":42,"value":623},"_headers",{"type":42,"value":625}," file versus ",{"type":36,"tag":51,"props":627,"children":629},{"className":628},[],[630],{"type":42,"value":631},"[[headers]]",{"type":42,"value":633},". Because a ",{"type":36,"tag":51,"props":635,"children":637},{"className":636},[],[638],{"type":42,"value":573},{"type":42,"value":640}," rule can silently shadow a ",{"type":36,"tag":51,"props":642,"children":644},{"className":643},[],[645],{"type":42,"value":56},{"type":42,"value":647}," rule for the same path, keep overlapping rules in a single source.",{"type":36,"tag":111,"props":649,"children":651},{"id":650},"headers",[652],{"type":42,"value":653},"Headers",{"type":36,"tag":118,"props":655,"children":657},{"className":120,"code":656,"language":122,"meta":123,"style":123},"[[headers]]\nfor = \"\u002F*\"\n[headers.values]\n  X-Frame-Options = \"DENY\"\n  X-Content-Type-Options = \"nosniff\"\n\n[[headers]]\nfor = \"\u002Fassets\u002F*\"\n[headers.values]\n  Cache-Control = \"public, max-age=31536000, immutable\"\n",[658],{"type":36,"tag":51,"props":659,"children":660},{"__ignoreMap":123},[661,669,677,685,693,701,708,715,723,730],{"type":36,"tag":129,"props":662,"children":663},{"class":131,"line":132},[664],{"type":36,"tag":129,"props":665,"children":666},{},[667],{"type":42,"value":668},"[[headers]]\n",{"type":36,"tag":129,"props":670,"children":671},{"class":131,"line":141},[672],{"type":36,"tag":129,"props":673,"children":674},{},[675],{"type":42,"value":676},"for = \"\u002F*\"\n",{"type":36,"tag":129,"props":678,"children":679},{"class":131,"line":150},[680],{"type":36,"tag":129,"props":681,"children":682},{},[683],{"type":42,"value":684},"[headers.values]\n",{"type":36,"tag":129,"props":686,"children":687},{"class":131,"line":159},[688],{"type":36,"tag":129,"props":689,"children":690},{},[691],{"type":42,"value":692},"  X-Frame-Options = \"DENY\"\n",{"type":36,"tag":129,"props":694,"children":695},{"class":131,"line":24},[696],{"type":36,"tag":129,"props":697,"children":698},{},[699],{"type":42,"value":700},"  X-Content-Type-Options = \"nosniff\"\n",{"type":36,"tag":129,"props":702,"children":703},{"class":131,"line":221},[704],{"type":36,"tag":129,"props":705,"children":706},{"emptyLinePlaceholder":225},[707],{"type":42,"value":228},{"type":36,"tag":129,"props":709,"children":710},{"class":131,"line":231},[711],{"type":36,"tag":129,"props":712,"children":713},{},[714],{"type":42,"value":668},{"type":36,"tag":129,"props":716,"children":717},{"class":131,"line":240},[718],{"type":36,"tag":129,"props":719,"children":720},{},[721],{"type":42,"value":722},"for = \"\u002Fassets\u002F*\"\n",{"type":36,"tag":129,"props":724,"children":725},{"class":131,"line":248},[726],{"type":36,"tag":129,"props":727,"children":728},{},[729],{"type":42,"value":684},{"type":36,"tag":129,"props":731,"children":732},{"class":131,"line":257},[733],{"type":36,"tag":129,"props":734,"children":735},{},[736],{"type":42,"value":737},"  Cache-Control = \"public, max-age=31536000, immutable\"\n",{"type":36,"tag":45,"props":739,"children":740},{},[741],{"type":42,"value":742},"Headers apply only to files served from Netlify's CDN (not to function or edge function responses — set those in code).",{"type":36,"tag":111,"props":744,"children":746},{"id":745},"deploy-contexts",[747],{"type":42,"value":748},"Deploy Contexts",{"type":36,"tag":45,"props":750,"children":751},{},[752],{"type":42,"value":753},"Override settings per deploy context:",{"type":36,"tag":118,"props":755,"children":757},{"className":120,"code":756,"language":122,"meta":123,"style":123},"[context.production]\ncommand = \"npm run build\"\nenvironment = { NODE_ENV = \"production\" }\n\n[context.deploy-preview]\ncommand = \"npm run build:preview\"\n\n[context.branch-deploy]\ncommand = \"npm run build:staging\"\n\n[context.dev]\nenvironment = { NODE_ENV = \"development\" }\n\n# Specific branch\n[context.\"staging\"]\ncommand = \"npm run build:staging\"\n",[758],{"type":36,"tag":51,"props":759,"children":760},{"__ignoreMap":123},[761,769,777,785,792,800,808,815,823,831,838,846,854,861,869,877],{"type":36,"tag":129,"props":762,"children":763},{"class":131,"line":132},[764],{"type":36,"tag":129,"props":765,"children":766},{},[767],{"type":42,"value":768},"[context.production]\n",{"type":36,"tag":129,"props":770,"children":771},{"class":131,"line":141},[772],{"type":36,"tag":129,"props":773,"children":774},{},[775],{"type":42,"value":776},"command = \"npm run build\"\n",{"type":36,"tag":129,"props":778,"children":779},{"class":131,"line":150},[780],{"type":36,"tag":129,"props":781,"children":782},{},[783],{"type":42,"value":784},"environment = { NODE_ENV = \"production\" }\n",{"type":36,"tag":129,"props":786,"children":787},{"class":131,"line":159},[788],{"type":36,"tag":129,"props":789,"children":790},{"emptyLinePlaceholder":225},[791],{"type":42,"value":228},{"type":36,"tag":129,"props":793,"children":794},{"class":131,"line":24},[795],{"type":36,"tag":129,"props":796,"children":797},{},[798],{"type":42,"value":799},"[context.deploy-preview]\n",{"type":36,"tag":129,"props":801,"children":802},{"class":131,"line":221},[803],{"type":36,"tag":129,"props":804,"children":805},{},[806],{"type":42,"value":807},"command = \"npm run build:preview\"\n",{"type":36,"tag":129,"props":809,"children":810},{"class":131,"line":231},[811],{"type":36,"tag":129,"props":812,"children":813},{"emptyLinePlaceholder":225},[814],{"type":42,"value":228},{"type":36,"tag":129,"props":816,"children":817},{"class":131,"line":240},[818],{"type":36,"tag":129,"props":819,"children":820},{},[821],{"type":42,"value":822},"[context.branch-deploy]\n",{"type":36,"tag":129,"props":824,"children":825},{"class":131,"line":248},[826],{"type":36,"tag":129,"props":827,"children":828},{},[829],{"type":42,"value":830},"command = \"npm run build:staging\"\n",{"type":36,"tag":129,"props":832,"children":833},{"class":131,"line":257},[834],{"type":36,"tag":129,"props":835,"children":836},{"emptyLinePlaceholder":225},[837],{"type":42,"value":228},{"type":36,"tag":129,"props":839,"children":840},{"class":131,"line":266},[841],{"type":36,"tag":129,"props":842,"children":843},{},[844],{"type":42,"value":845},"[context.dev]\n",{"type":36,"tag":129,"props":847,"children":848},{"class":131,"line":275},[849],{"type":36,"tag":129,"props":850,"children":851},{},[852],{"type":42,"value":853},"environment = { NODE_ENV = \"development\" }\n",{"type":36,"tag":129,"props":855,"children":856},{"class":131,"line":283},[857],{"type":36,"tag":129,"props":858,"children":859},{"emptyLinePlaceholder":225},[860],{"type":42,"value":228},{"type":36,"tag":129,"props":862,"children":863},{"class":131,"line":292},[864],{"type":36,"tag":129,"props":865,"children":866},{},[867],{"type":42,"value":868},"# Specific branch\n",{"type":36,"tag":129,"props":870,"children":871},{"class":131,"line":300},[872],{"type":36,"tag":129,"props":873,"children":874},{},[875],{"type":42,"value":876},"[context.\"staging\"]\n",{"type":36,"tag":129,"props":878,"children":879},{"class":131,"line":309},[880],{"type":36,"tag":129,"props":881,"children":882},{},[883],{"type":42,"value":830},{"type":36,"tag":45,"props":885,"children":886},{},[887,904,906,912,914,920,922,928,930,936,938,944,946,951,953,958,960,965],{"type":36,"tag":60,"props":888,"children":889},{},[890,895,897,902],{"type":36,"tag":51,"props":891,"children":893},{"className":892},[],[894],{"type":42,"value":588},{"type":42,"value":896}," and ",{"type":36,"tag":51,"props":898,"children":900},{"className":899},[],[901],{"type":42,"value":631},{"type":42,"value":903}," are global — they cannot be scoped to a deploy context.",{"type":42,"value":905}," Context tables like ",{"type":36,"tag":51,"props":907,"children":909},{"className":908},[],[910],{"type":42,"value":911},"[context.production]",{"type":42,"value":913}," work for keys such as ",{"type":36,"tag":51,"props":915,"children":917},{"className":916},[],[918],{"type":42,"value":919},"[build]",{"type":42,"value":921},", ",{"type":36,"tag":51,"props":923,"children":925},{"className":924},[],[926],{"type":42,"value":927},"[build.environment]",{"type":42,"value":929},", and ",{"type":36,"tag":51,"props":931,"children":933},{"className":932},[],[934],{"type":42,"value":935},"[[plugins]]",{"type":42,"value":937},", but redirect and header rules apply to every context no matter where you place them in the file; there is no ",{"type":36,"tag":51,"props":939,"children":941},{"className":940},[],[942],{"type":42,"value":943},"[context.production.redirects]",{"type":42,"value":945}," or context-nested ",{"type":36,"tag":51,"props":947,"children":949},{"className":948},[],[950],{"type":42,"value":588},{"type":42,"value":952},". For context-specific redirects or headers, use the per-deploy escape hatch: generate a ",{"type":36,"tag":51,"props":954,"children":956},{"className":955},[],[957],{"type":42,"value":573},{"type":42,"value":959}," or ",{"type":36,"tag":51,"props":961,"children":963},{"className":962},[],[964],{"type":42,"value":623},{"type":42,"value":966}," file during that context's build (those files ship per deploy), or gate the behavior on a runtime signal in an edge function.",{"type":36,"tag":111,"props":968,"children":970},{"id":969},"environment-variables",[971],{"type":42,"value":972},"Environment Variables",{"type":36,"tag":118,"props":974,"children":976},{"className":120,"code":975,"language":122,"meta":123,"style":123},"[build.environment]\nNODE_VERSION = \"20\"\n\n[context.production.environment]\nAPI_URL = \"https:\u002F\u002Fapi.prod.com\"\n\n[context.deploy-preview.environment]\nAPI_URL = \"https:\u002F\u002Fapi.staging.com\"\n",[977],{"type":36,"tag":51,"props":978,"children":979},{"__ignoreMap":123},[980,988,996,1003,1011,1019,1026,1034],{"type":36,"tag":129,"props":981,"children":982},{"class":131,"line":132},[983],{"type":36,"tag":129,"props":984,"children":985},{},[986],{"type":42,"value":987},"[build.environment]\n",{"type":36,"tag":129,"props":989,"children":990},{"class":131,"line":141},[991],{"type":36,"tag":129,"props":992,"children":993},{},[994],{"type":42,"value":995},"NODE_VERSION = \"20\"\n",{"type":36,"tag":129,"props":997,"children":998},{"class":131,"line":150},[999],{"type":36,"tag":129,"props":1000,"children":1001},{"emptyLinePlaceholder":225},[1002],{"type":42,"value":228},{"type":36,"tag":129,"props":1004,"children":1005},{"class":131,"line":159},[1006],{"type":36,"tag":129,"props":1007,"children":1008},{},[1009],{"type":42,"value":1010},"[context.production.environment]\n",{"type":36,"tag":129,"props":1012,"children":1013},{"class":131,"line":24},[1014],{"type":36,"tag":129,"props":1015,"children":1016},{},[1017],{"type":42,"value":1018},"API_URL = \"https:\u002F\u002Fapi.prod.com\"\n",{"type":36,"tag":129,"props":1020,"children":1021},{"class":131,"line":221},[1022],{"type":36,"tag":129,"props":1023,"children":1024},{"emptyLinePlaceholder":225},[1025],{"type":42,"value":228},{"type":36,"tag":129,"props":1027,"children":1028},{"class":131,"line":231},[1029],{"type":36,"tag":129,"props":1030,"children":1031},{},[1032],{"type":42,"value":1033},"[context.deploy-preview.environment]\n",{"type":36,"tag":129,"props":1035,"children":1036},{"class":131,"line":240},[1037],{"type":36,"tag":129,"props":1038,"children":1039},{},[1040],{"type":42,"value":1041},"API_URL = \"https:\u002F\u002Fapi.staging.com\"\n",{"type":36,"tag":45,"props":1043,"children":1044},{},[1045,1050],{"type":36,"tag":60,"props":1046,"children":1047},{},[1048],{"type":42,"value":1049},"Do not put secrets in netlify.toml",{"type":42,"value":1051}," (it's committed to source control). Use the Netlify UI or CLI for sensitive values — see CLI Management below.",{"type":36,"tag":45,"props":1053,"children":1054},{},[1055,1067,1069,1074,1075,1081,1083,1088,1090,1096,1097,1103,1105,1111,1113,1119,1121,1126],{"type":36,"tag":60,"props":1056,"children":1057},{},[1058,1060,1065],{"type":42,"value":1059},"Variables declared in ",{"type":36,"tag":51,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":42,"value":56},{"type":42,"value":1066}," are build-scoped only.",{"type":42,"value":1068}," Values under ",{"type":36,"tag":51,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":42,"value":927},{"type":42,"value":959},{"type":36,"tag":51,"props":1076,"children":1078},{"className":1077},[],[1079],{"type":42,"value":1080},"[context.*.environment]",{"type":42,"value":1082}," are available to the build (and snippet injection) but are ",{"type":36,"tag":60,"props":1084,"children":1085},{},[1086],{"type":42,"value":1087},"not",{"type":42,"value":1089}," injected into the Functions or Edge Functions runtime — reading them with ",{"type":36,"tag":51,"props":1091,"children":1093},{"className":1092},[],[1094],{"type":42,"value":1095},"Netlify.env.get(\"VAR\")",{"type":42,"value":959},{"type":36,"tag":51,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":42,"value":1102},"process.env.VAR",{"type":42,"value":1104}," inside a function returns ",{"type":36,"tag":51,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":42,"value":1110},"undefined",{"type":42,"value":1112},". To make a variable available at function runtime, set it in the Netlify UI or with ",{"type":36,"tag":51,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":42,"value":1118},"netlify env:set",{"type":42,"value":1120}," (those are available to both builds and runtime), not in ",{"type":36,"tag":51,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":42,"value":56},{"type":42,"value":1127},".",{"type":36,"tag":1129,"props":1130,"children":1132},"h3",{"id":1131},"cli-management",[1133],{"type":42,"value":1134},"CLI Management",{"type":36,"tag":118,"props":1136,"children":1140},{"className":1137,"code":1138,"language":1139,"meta":123,"style":123},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Set\nnetlify env:set API_KEY \"value\"\nnetlify env:set API_KEY \"value\" --secret              # Hidden from logs\nnetlify env:set API_KEY \"value\" --context production   # Context-specific\n\n# Get\nnetlify env:get API_KEY\n\n# List\nnetlify env:list\nnetlify env:list --plain > .env   # Local snapshot only — keep .env gitignored, never commit it\n\n# Import from file\nnetlify env:import .env\n\n# Delete\nnetlify env:unset API_KEY\n","bash",[1141],{"type":36,"tag":51,"props":1142,"children":1143},{"__ignoreMap":123},[1144,1153,1188,1226,1268,1275,1283,1300,1307,1315,1327,1359,1366,1374,1391,1398,1406],{"type":36,"tag":129,"props":1145,"children":1146},{"class":131,"line":132},[1147],{"type":36,"tag":129,"props":1148,"children":1150},{"style":1149},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1151],{"type":42,"value":1152},"# Set\n",{"type":36,"tag":129,"props":1154,"children":1155},{"class":131,"line":141},[1156,1161,1167,1172,1178,1183],{"type":36,"tag":129,"props":1157,"children":1159},{"style":1158},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1160],{"type":42,"value":8},{"type":36,"tag":129,"props":1162,"children":1164},{"style":1163},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1165],{"type":42,"value":1166}," env:set",{"type":36,"tag":129,"props":1168,"children":1169},{"style":1163},[1170],{"type":42,"value":1171}," API_KEY",{"type":36,"tag":129,"props":1173,"children":1175},{"style":1174},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1176],{"type":42,"value":1177}," \"",{"type":36,"tag":129,"props":1179,"children":1180},{"style":1163},[1181],{"type":42,"value":1182},"value",{"type":36,"tag":129,"props":1184,"children":1185},{"style":1174},[1186],{"type":42,"value":1187},"\"\n",{"type":36,"tag":129,"props":1189,"children":1190},{"class":131,"line":150},[1191,1195,1199,1203,1207,1211,1216,1221],{"type":36,"tag":129,"props":1192,"children":1193},{"style":1158},[1194],{"type":42,"value":8},{"type":36,"tag":129,"props":1196,"children":1197},{"style":1163},[1198],{"type":42,"value":1166},{"type":36,"tag":129,"props":1200,"children":1201},{"style":1163},[1202],{"type":42,"value":1171},{"type":36,"tag":129,"props":1204,"children":1205},{"style":1174},[1206],{"type":42,"value":1177},{"type":36,"tag":129,"props":1208,"children":1209},{"style":1163},[1210],{"type":42,"value":1182},{"type":36,"tag":129,"props":1212,"children":1213},{"style":1174},[1214],{"type":42,"value":1215},"\"",{"type":36,"tag":129,"props":1217,"children":1218},{"style":1163},[1219],{"type":42,"value":1220}," --secret",{"type":36,"tag":129,"props":1222,"children":1223},{"style":1149},[1224],{"type":42,"value":1225},"              # Hidden from logs\n",{"type":36,"tag":129,"props":1227,"children":1228},{"class":131,"line":159},[1229,1233,1237,1241,1245,1249,1253,1258,1263],{"type":36,"tag":129,"props":1230,"children":1231},{"style":1158},[1232],{"type":42,"value":8},{"type":36,"tag":129,"props":1234,"children":1235},{"style":1163},[1236],{"type":42,"value":1166},{"type":36,"tag":129,"props":1238,"children":1239},{"style":1163},[1240],{"type":42,"value":1171},{"type":36,"tag":129,"props":1242,"children":1243},{"style":1174},[1244],{"type":42,"value":1177},{"type":36,"tag":129,"props":1246,"children":1247},{"style":1163},[1248],{"type":42,"value":1182},{"type":36,"tag":129,"props":1250,"children":1251},{"style":1174},[1252],{"type":42,"value":1215},{"type":36,"tag":129,"props":1254,"children":1255},{"style":1163},[1256],{"type":42,"value":1257}," --context",{"type":36,"tag":129,"props":1259,"children":1260},{"style":1163},[1261],{"type":42,"value":1262}," production",{"type":36,"tag":129,"props":1264,"children":1265},{"style":1149},[1266],{"type":42,"value":1267},"   # Context-specific\n",{"type":36,"tag":129,"props":1269,"children":1270},{"class":131,"line":24},[1271],{"type":36,"tag":129,"props":1272,"children":1273},{"emptyLinePlaceholder":225},[1274],{"type":42,"value":228},{"type":36,"tag":129,"props":1276,"children":1277},{"class":131,"line":221},[1278],{"type":36,"tag":129,"props":1279,"children":1280},{"style":1149},[1281],{"type":42,"value":1282},"# Get\n",{"type":36,"tag":129,"props":1284,"children":1285},{"class":131,"line":231},[1286,1290,1295],{"type":36,"tag":129,"props":1287,"children":1288},{"style":1158},[1289],{"type":42,"value":8},{"type":36,"tag":129,"props":1291,"children":1292},{"style":1163},[1293],{"type":42,"value":1294}," env:get",{"type":36,"tag":129,"props":1296,"children":1297},{"style":1163},[1298],{"type":42,"value":1299}," API_KEY\n",{"type":36,"tag":129,"props":1301,"children":1302},{"class":131,"line":240},[1303],{"type":36,"tag":129,"props":1304,"children":1305},{"emptyLinePlaceholder":225},[1306],{"type":42,"value":228},{"type":36,"tag":129,"props":1308,"children":1309},{"class":131,"line":248},[1310],{"type":36,"tag":129,"props":1311,"children":1312},{"style":1149},[1313],{"type":42,"value":1314},"# List\n",{"type":36,"tag":129,"props":1316,"children":1317},{"class":131,"line":257},[1318,1322],{"type":36,"tag":129,"props":1319,"children":1320},{"style":1158},[1321],{"type":42,"value":8},{"type":36,"tag":129,"props":1323,"children":1324},{"style":1163},[1325],{"type":42,"value":1326}," env:list\n",{"type":36,"tag":129,"props":1328,"children":1329},{"class":131,"line":266},[1330,1334,1339,1344,1349,1354],{"type":36,"tag":129,"props":1331,"children":1332},{"style":1158},[1333],{"type":42,"value":8},{"type":36,"tag":129,"props":1335,"children":1336},{"style":1163},[1337],{"type":42,"value":1338}," env:list",{"type":36,"tag":129,"props":1340,"children":1341},{"style":1163},[1342],{"type":42,"value":1343}," --plain",{"type":36,"tag":129,"props":1345,"children":1346},{"style":1174},[1347],{"type":42,"value":1348}," >",{"type":36,"tag":129,"props":1350,"children":1351},{"style":1163},[1352],{"type":42,"value":1353}," .env",{"type":36,"tag":129,"props":1355,"children":1356},{"style":1149},[1357],{"type":42,"value":1358},"   # Local snapshot only — keep .env gitignored, never commit it\n",{"type":36,"tag":129,"props":1360,"children":1361},{"class":131,"line":275},[1362],{"type":36,"tag":129,"props":1363,"children":1364},{"emptyLinePlaceholder":225},[1365],{"type":42,"value":228},{"type":36,"tag":129,"props":1367,"children":1368},{"class":131,"line":283},[1369],{"type":36,"tag":129,"props":1370,"children":1371},{"style":1149},[1372],{"type":42,"value":1373},"# Import from file\n",{"type":36,"tag":129,"props":1375,"children":1376},{"class":131,"line":292},[1377,1381,1386],{"type":36,"tag":129,"props":1378,"children":1379},{"style":1158},[1380],{"type":42,"value":8},{"type":36,"tag":129,"props":1382,"children":1383},{"style":1163},[1384],{"type":42,"value":1385}," env:import",{"type":36,"tag":129,"props":1387,"children":1388},{"style":1163},[1389],{"type":42,"value":1390}," .env\n",{"type":36,"tag":129,"props":1392,"children":1393},{"class":131,"line":300},[1394],{"type":36,"tag":129,"props":1395,"children":1396},{"emptyLinePlaceholder":225},[1397],{"type":42,"value":228},{"type":36,"tag":129,"props":1399,"children":1400},{"class":131,"line":309},[1401],{"type":36,"tag":129,"props":1402,"children":1403},{"style":1149},[1404],{"type":42,"value":1405},"# Delete\n",{"type":36,"tag":129,"props":1407,"children":1408},{"class":131,"line":318},[1409,1413,1418],{"type":36,"tag":129,"props":1410,"children":1411},{"style":1158},[1412],{"type":42,"value":8},{"type":36,"tag":129,"props":1414,"children":1415},{"style":1163},[1416],{"type":42,"value":1417}," env:unset",{"type":36,"tag":129,"props":1419,"children":1420},{"style":1163},[1421],{"type":42,"value":1299},{"type":36,"tag":45,"props":1423,"children":1424},{},[1425,1430,1432,1438,1439,1445,1446,1452,1453,1459,1461,1467],{"type":36,"tag":60,"props":1426,"children":1427},{},[1428],{"type":42,"value":1429},"Never put secrets in client-prefixed variables",{"type":42,"value":1431}," (",{"type":36,"tag":51,"props":1433,"children":1435},{"className":1434},[],[1436],{"type":42,"value":1437},"VITE_",{"type":42,"value":921},{"type":36,"tag":51,"props":1440,"children":1442},{"className":1441},[],[1443],{"type":42,"value":1444},"PUBLIC_",{"type":42,"value":921},{"type":36,"tag":51,"props":1447,"children":1449},{"className":1448},[],[1450],{"type":42,"value":1451},"NEXT_PUBLIC_",{"type":42,"value":921},{"type":36,"tag":51,"props":1454,"children":1456},{"className":1455},[],[1457],{"type":42,"value":1458},"NUXT_PUBLIC_",{"type":42,"value":1460},") — these are inlined into the client bundle and exposed to the browser. ",{"type":36,"tag":51,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":42,"value":1466},"--secret",{"type":42,"value":1468}," only hides a value from logs and the UI; it does not protect a client-prefixed variable.",{"type":36,"tag":1129,"props":1470,"children":1472},{"id":1471},"context-scoping",[1473],{"type":42,"value":1474},"Context Scoping",{"type":36,"tag":45,"props":1476,"children":1477},{},[1478],{"type":42,"value":1479},"Variables set via the CLI can also be scoped to deploy contexts:",{"type":36,"tag":118,"props":1481,"children":1483},{"className":1137,"code":1482,"language":1139,"meta":123,"style":123},"netlify env:set API_URL \"https:\u002F\u002Fapi.prod.com\" --context production\nnetlify env:set API_URL \"https:\u002F\u002Fapi.staging.com\" --context deploy-preview\nnetlify env:set DEBUG \"true\" --context branch:feature-x\n",[1484],{"type":36,"tag":51,"props":1485,"children":1486},{"__ignoreMap":123},[1487,1525,1562],{"type":36,"tag":129,"props":1488,"children":1489},{"class":131,"line":132},[1490,1494,1498,1503,1507,1512,1516,1520],{"type":36,"tag":129,"props":1491,"children":1492},{"style":1158},[1493],{"type":42,"value":8},{"type":36,"tag":129,"props":1495,"children":1496},{"style":1163},[1497],{"type":42,"value":1166},{"type":36,"tag":129,"props":1499,"children":1500},{"style":1163},[1501],{"type":42,"value":1502}," API_URL",{"type":36,"tag":129,"props":1504,"children":1505},{"style":1174},[1506],{"type":42,"value":1177},{"type":36,"tag":129,"props":1508,"children":1509},{"style":1163},[1510],{"type":42,"value":1511},"https:\u002F\u002Fapi.prod.com",{"type":36,"tag":129,"props":1513,"children":1514},{"style":1174},[1515],{"type":42,"value":1215},{"type":36,"tag":129,"props":1517,"children":1518},{"style":1163},[1519],{"type":42,"value":1257},{"type":36,"tag":129,"props":1521,"children":1522},{"style":1163},[1523],{"type":42,"value":1524}," production\n",{"type":36,"tag":129,"props":1526,"children":1527},{"class":131,"line":141},[1528,1532,1536,1540,1544,1549,1553,1557],{"type":36,"tag":129,"props":1529,"children":1530},{"style":1158},[1531],{"type":42,"value":8},{"type":36,"tag":129,"props":1533,"children":1534},{"style":1163},[1535],{"type":42,"value":1166},{"type":36,"tag":129,"props":1537,"children":1538},{"style":1163},[1539],{"type":42,"value":1502},{"type":36,"tag":129,"props":1541,"children":1542},{"style":1174},[1543],{"type":42,"value":1177},{"type":36,"tag":129,"props":1545,"children":1546},{"style":1163},[1547],{"type":42,"value":1548},"https:\u002F\u002Fapi.staging.com",{"type":36,"tag":129,"props":1550,"children":1551},{"style":1174},[1552],{"type":42,"value":1215},{"type":36,"tag":129,"props":1554,"children":1555},{"style":1163},[1556],{"type":42,"value":1257},{"type":36,"tag":129,"props":1558,"children":1559},{"style":1163},[1560],{"type":42,"value":1561}," deploy-preview\n",{"type":36,"tag":129,"props":1563,"children":1564},{"class":131,"line":150},[1565,1569,1573,1578,1582,1587,1591,1595],{"type":36,"tag":129,"props":1566,"children":1567},{"style":1158},[1568],{"type":42,"value":8},{"type":36,"tag":129,"props":1570,"children":1571},{"style":1163},[1572],{"type":42,"value":1166},{"type":36,"tag":129,"props":1574,"children":1575},{"style":1163},[1576],{"type":42,"value":1577}," DEBUG",{"type":36,"tag":129,"props":1579,"children":1580},{"style":1174},[1581],{"type":42,"value":1177},{"type":36,"tag":129,"props":1583,"children":1584},{"style":1163},[1585],{"type":42,"value":1586},"true",{"type":36,"tag":129,"props":1588,"children":1589},{"style":1174},[1590],{"type":42,"value":1215},{"type":36,"tag":129,"props":1592,"children":1593},{"style":1163},[1594],{"type":42,"value":1257},{"type":36,"tag":129,"props":1596,"children":1597},{"style":1163},[1598],{"type":42,"value":1599}," branch:feature-x\n",{"type":36,"tag":45,"props":1601,"children":1602},{},[1603,1605,1610,1612,1617],{"type":42,"value":1604},"This is the CLI equivalent of the ",{"type":36,"tag":51,"props":1606,"children":1608},{"className":1607},[],[1609],{"type":42,"value":1080},{"type":42,"value":1611}," tables above, but the resulting variables are available at both build and runtime (unlike ",{"type":36,"tag":51,"props":1613,"children":1615},{"className":1614},[],[1616],{"type":42,"value":56},{"type":42,"value":1618},"-declared ones).",{"type":36,"tag":45,"props":1620,"children":1621},{},[1622,1624,1629,1631,1636,1638,1644],{"type":42,"value":1623},"When reading these variables in server code, prefer ",{"type":36,"tag":51,"props":1625,"children":1627},{"className":1626},[],[1628],{"type":42,"value":1095},{"type":42,"value":1630},". ",{"type":36,"tag":51,"props":1632,"children":1634},{"className":1633},[],[1635],{"type":42,"value":1102},{"type":42,"value":1637}," also works inside Functions, but Edge Functions expose only ",{"type":36,"tag":51,"props":1639,"children":1641},{"className":1640},[],[1642],{"type":42,"value":1643},"Netlify.env.get",{"type":42,"value":1645}," — the portable form keeps the same code working in both runtimes.",{"type":36,"tag":45,"props":1647,"children":1648},{},[1649,1651,1656,1658,1663,1665,1670,1672,1677],{"type":42,"value":1650},"For the client-side rules (",{"type":36,"tag":51,"props":1652,"children":1654},{"className":1653},[],[1655],{"type":42,"value":1437},{"type":42,"value":1657},"\u002F",{"type":36,"tag":51,"props":1659,"children":1661},{"className":1660},[],[1662],{"type":42,"value":1444},{"type":42,"value":1664}," prefixes and framework specifics), see the ",{"type":36,"tag":60,"props":1666,"children":1667},{},[1668],{"type":42,"value":1669},"netlify-frameworks",{"type":42,"value":1671}," skill; for function-side details, see ",{"type":36,"tag":60,"props":1673,"children":1674},{},[1675],{"type":42,"value":1676},"netlify-functions",{"type":42,"value":1127},{"type":36,"tag":111,"props":1679,"children":1681},{"id":1680},"functions-configuration",[1682],{"type":42,"value":1683},"Functions Configuration",{"type":36,"tag":118,"props":1685,"children":1687},{"className":120,"code":1686,"language":122,"meta":123,"style":123},"[functions]\ndirectory = \"netlify\u002Ffunctions\"   # Default\nnode_bundler = \"esbuild\"\n\n# Scheduled function\n[functions.\"cleanup\"]\nschedule = \"@daily\"\n",[1688],{"type":36,"tag":51,"props":1689,"children":1690},{"__ignoreMap":123},[1691,1699,1707,1715,1722,1730,1738],{"type":36,"tag":129,"props":1692,"children":1693},{"class":131,"line":132},[1694],{"type":36,"tag":129,"props":1695,"children":1696},{},[1697],{"type":42,"value":1698},"[functions]\n",{"type":36,"tag":129,"props":1700,"children":1701},{"class":131,"line":141},[1702],{"type":36,"tag":129,"props":1703,"children":1704},{},[1705],{"type":42,"value":1706},"directory = \"netlify\u002Ffunctions\"   # Default\n",{"type":36,"tag":129,"props":1708,"children":1709},{"class":131,"line":150},[1710],{"type":36,"tag":129,"props":1711,"children":1712},{},[1713],{"type":42,"value":1714},"node_bundler = \"esbuild\"\n",{"type":36,"tag":129,"props":1716,"children":1717},{"class":131,"line":159},[1718],{"type":36,"tag":129,"props":1719,"children":1720},{"emptyLinePlaceholder":225},[1721],{"type":42,"value":228},{"type":36,"tag":129,"props":1723,"children":1724},{"class":131,"line":24},[1725],{"type":36,"tag":129,"props":1726,"children":1727},{},[1728],{"type":42,"value":1729},"# Scheduled function\n",{"type":36,"tag":129,"props":1731,"children":1732},{"class":131,"line":221},[1733],{"type":36,"tag":129,"props":1734,"children":1735},{},[1736],{"type":42,"value":1737},"[functions.\"cleanup\"]\n",{"type":36,"tag":129,"props":1739,"children":1740},{"class":131,"line":231},[1741],{"type":36,"tag":129,"props":1742,"children":1743},{},[1744],{"type":42,"value":1745},"schedule = \"@daily\"\n",{"type":36,"tag":45,"props":1747,"children":1748},{},[1749,1751,1757,1759,1765,1767,1772,1774,1780,1782,1787,1789,1795,1797,1803,1804,1810],{"type":42,"value":1750},"Use the single-table ",{"type":36,"tag":51,"props":1752,"children":1754},{"className":1753},[],[1755],{"type":42,"value":1756},"[functions]",{"type":42,"value":1758}," form for global settings and ",{"type":36,"tag":51,"props":1760,"children":1762},{"className":1761},[],[1763],{"type":42,"value":1764},"[functions.\"name-or-glob\"]",{"type":42,"value":1766}," for per-function overrides. There is ",{"type":36,"tag":60,"props":1768,"children":1769},{},[1770],{"type":42,"value":1771},"no",{"type":42,"value":1773}," ",{"type":36,"tag":51,"props":1775,"children":1777},{"className":1776},[],[1778],{"type":42,"value":1779},"[[functions]]",{"type":42,"value":1781}," array-of-tables and no path-based function routing table in ",{"type":36,"tag":51,"props":1783,"children":1785},{"className":1784},[],[1786],{"type":42,"value":56},{"type":42,"value":1788}," — functions are routed by file (served at ",{"type":36,"tag":51,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":42,"value":1794},"\u002F.netlify\u002Ffunctions\u002F{name}",{"type":42,"value":1796},") or by an in-code ",{"type":36,"tag":51,"props":1798,"children":1800},{"className":1799},[],[1801],{"type":42,"value":1802},"path",{"type":42,"value":1657},{"type":36,"tag":51,"props":1805,"children":1807},{"className":1806},[],[1808],{"type":42,"value":1809},"config",{"type":42,"value":1811}," export, not by config.",{"type":36,"tag":111,"props":1813,"children":1815},{"id":1814},"edge-functions-configuration",[1816],{"type":42,"value":1817},"Edge Functions Configuration",{"type":36,"tag":118,"props":1819,"children":1821},{"className":120,"code":1820,"language":122,"meta":123,"style":123},"[[edge_functions]]\npath = \"\u002Fadmin\u002F*\"\nfunction = \"auth\"\nexcludedPath = \"\u002Fadmin\u002Fpublic\u002F*\"   # Carve exceptions out of `path` (string or array of globs)\n\n# Import map for Deno URL imports\n[functions]\ndeno_import_map = \".\u002Fimport_map.json\"\n",[1822],{"type":36,"tag":51,"props":1823,"children":1824},{"__ignoreMap":123},[1825,1833,1841,1849,1857,1864,1872,1879],{"type":36,"tag":129,"props":1826,"children":1827},{"class":131,"line":132},[1828],{"type":36,"tag":129,"props":1829,"children":1830},{},[1831],{"type":42,"value":1832},"[[edge_functions]]\n",{"type":36,"tag":129,"props":1834,"children":1835},{"class":131,"line":141},[1836],{"type":36,"tag":129,"props":1837,"children":1838},{},[1839],{"type":42,"value":1840},"path = \"\u002Fadmin\u002F*\"\n",{"type":36,"tag":129,"props":1842,"children":1843},{"class":131,"line":150},[1844],{"type":36,"tag":129,"props":1845,"children":1846},{},[1847],{"type":42,"value":1848},"function = \"auth\"\n",{"type":36,"tag":129,"props":1850,"children":1851},{"class":131,"line":159},[1852],{"type":36,"tag":129,"props":1853,"children":1854},{},[1855],{"type":42,"value":1856},"excludedPath = \"\u002Fadmin\u002Fpublic\u002F*\"   # Carve exceptions out of `path` (string or array of globs)\n",{"type":36,"tag":129,"props":1858,"children":1859},{"class":131,"line":24},[1860],{"type":36,"tag":129,"props":1861,"children":1862},{"emptyLinePlaceholder":225},[1863],{"type":42,"value":228},{"type":36,"tag":129,"props":1865,"children":1866},{"class":131,"line":221},[1867],{"type":36,"tag":129,"props":1868,"children":1869},{},[1870],{"type":42,"value":1871},"# Import map for Deno URL imports\n",{"type":36,"tag":129,"props":1873,"children":1874},{"class":131,"line":231},[1875],{"type":36,"tag":129,"props":1876,"children":1877},{},[1878],{"type":42,"value":1698},{"type":36,"tag":129,"props":1880,"children":1881},{"class":131,"line":240},[1882],{"type":36,"tag":129,"props":1883,"children":1884},{},[1885],{"type":42,"value":1886},"deno_import_map = \".\u002Fimport_map.json\"\n",{"type":36,"tag":111,"props":1888,"children":1890},{"id":1889},"dev-server",[1891],{"type":42,"value":1892},"Dev Server",{"type":36,"tag":118,"props":1894,"children":1896},{"className":120,"code":1895,"language":122,"meta":123,"style":123},"[dev]\ncommand = \"npm start\"       # Dev server command\nport = 8888                 # Netlify Dev port\ntargetPort = 3000           # Your app's dev server port\nframework = \"#auto\"         # \"#auto\", \"#static\", \"#custom\"\n",[1897],{"type":36,"tag":51,"props":1898,"children":1899},{"__ignoreMap":123},[1900,1908,1916,1924,1932],{"type":36,"tag":129,"props":1901,"children":1902},{"class":131,"line":132},[1903],{"type":36,"tag":129,"props":1904,"children":1905},{},[1906],{"type":42,"value":1907},"[dev]\n",{"type":36,"tag":129,"props":1909,"children":1910},{"class":131,"line":141},[1911],{"type":36,"tag":129,"props":1912,"children":1913},{},[1914],{"type":42,"value":1915},"command = \"npm start\"       # Dev server command\n",{"type":36,"tag":129,"props":1917,"children":1918},{"class":131,"line":150},[1919],{"type":36,"tag":129,"props":1920,"children":1921},{},[1922],{"type":42,"value":1923},"port = 8888                 # Netlify Dev port\n",{"type":36,"tag":129,"props":1925,"children":1926},{"class":131,"line":159},[1927],{"type":36,"tag":129,"props":1928,"children":1929},{},[1930],{"type":42,"value":1931},"targetPort = 3000           # Your app's dev server port\n",{"type":36,"tag":129,"props":1933,"children":1934},{"class":131,"line":24},[1935],{"type":36,"tag":129,"props":1936,"children":1937},{},[1938],{"type":42,"value":1939},"framework = \"#auto\"         # \"#auto\", \"#static\", \"#custom\"\n",{"type":36,"tag":45,"props":1941,"children":1942},{},[1943,1978,1980,1986,1988,1993,1995,2000,2002,2007,2009,2014,2016,2021,2023,2028,2030,2035,2037,2043],{"type":36,"tag":60,"props":1944,"children":1945},{},[1946,1948,1954,1956,1962,1963,1969,1971,1977],{"type":42,"value":1947},"If you set both a custom ",{"type":36,"tag":51,"props":1949,"children":1951},{"className":1950},[],[1952],{"type":42,"value":1953},"command",{"type":42,"value":1955}," and a ",{"type":36,"tag":51,"props":1957,"children":1959},{"className":1958},[],[1960],{"type":42,"value":1961},"targetPort",{"type":42,"value":921},{"type":36,"tag":51,"props":1964,"children":1966},{"className":1965},[],[1967],{"type":42,"value":1968},"framework",{"type":42,"value":1970}," must be ",{"type":36,"tag":51,"props":1972,"children":1974},{"className":1973},[],[1975],{"type":42,"value":1976},"\"#custom\"",{"type":42,"value":1127},{"type":42,"value":1979}," With ",{"type":36,"tag":51,"props":1981,"children":1983},{"className":1982},[],[1984],{"type":42,"value":1985},"framework = \"#auto\"",{"type":42,"value":1987}," (the default) Netlify Dev runs its own detector and ignores your custom ",{"type":36,"tag":51,"props":1989,"children":1991},{"className":1990},[],[1992],{"type":42,"value":1953},{"type":42,"value":1994},"; ",{"type":36,"tag":51,"props":1996,"children":1998},{"className":1997},[],[1999],{"type":42,"value":1976},{"type":42,"value":2001}," tells it to run your ",{"type":36,"tag":51,"props":2003,"children":2005},{"className":2004},[],[2006],{"type":42,"value":1953},{"type":42,"value":2008}," as the app server and connect to ",{"type":36,"tag":51,"props":2010,"children":2012},{"className":2011},[],[2013],{"type":42,"value":1961},{"type":42,"value":2015},". Setting ",{"type":36,"tag":51,"props":2017,"children":2019},{"className":2018},[],[2020],{"type":42,"value":1953},{"type":42,"value":2022}," + ",{"type":36,"tag":51,"props":2024,"children":2026},{"className":2025},[],[2027],{"type":42,"value":1961},{"type":42,"value":2029}," while leaving ",{"type":36,"tag":51,"props":2031,"children":2033},{"className":2032},[],[2034],{"type":42,"value":1968},{"type":42,"value":2036}," at ",{"type":36,"tag":51,"props":2038,"children":2040},{"className":2039},[],[2041],{"type":42,"value":2042},"#auto",{"type":42,"value":2044}," (or omitting it) is a silent misconfiguration.",{"type":36,"tag":111,"props":2046,"children":2048},{"id":2047},"plugins",[2049],{"type":42,"value":2050},"Plugins",{"type":36,"tag":118,"props":2052,"children":2054},{"className":120,"code":2053,"language":122,"meta":123,"style":123},"[[plugins]]\npackage = \"@netlify\u002Fplugin-lighthouse\"\n[plugins.inputs]\n  audits = [\"performance\", \"accessibility\"]\n",[2055],{"type":36,"tag":51,"props":2056,"children":2057},{"__ignoreMap":123},[2058,2066,2074,2082],{"type":36,"tag":129,"props":2059,"children":2060},{"class":131,"line":132},[2061],{"type":36,"tag":129,"props":2062,"children":2063},{},[2064],{"type":42,"value":2065},"[[plugins]]\n",{"type":36,"tag":129,"props":2067,"children":2068},{"class":131,"line":141},[2069],{"type":36,"tag":129,"props":2070,"children":2071},{},[2072],{"type":42,"value":2073},"package = \"@netlify\u002Fplugin-lighthouse\"\n",{"type":36,"tag":129,"props":2075,"children":2076},{"class":131,"line":150},[2077],{"type":36,"tag":129,"props":2078,"children":2079},{},[2080],{"type":42,"value":2081},"[plugins.inputs]\n",{"type":36,"tag":129,"props":2083,"children":2084},{"class":131,"line":159},[2085],{"type":36,"tag":129,"props":2086,"children":2087},{},[2088],{"type":42,"value":2089},"  audits = [\"performance\", \"accessibility\"]\n",{"type":36,"tag":111,"props":2091,"children":2093},{"id":2092},"image-cdn",[2094],{"type":42,"value":2095},"Image CDN",{"type":36,"tag":118,"props":2097,"children":2099},{"className":120,"code":2098,"language":122,"meta":123,"style":123},"[images]\nremote_images = [\"https:\u002F\u002Fexample\\\\.com\u002F.*\"]\n",[2100],{"type":36,"tag":51,"props":2101,"children":2102},{"__ignoreMap":123},[2103,2111],{"type":36,"tag":129,"props":2104,"children":2105},{"class":131,"line":132},[2106],{"type":36,"tag":129,"props":2107,"children":2108},{},[2109],{"type":42,"value":2110},"[images]\n",{"type":36,"tag":129,"props":2112,"children":2113},{"class":131,"line":141},[2114],{"type":36,"tag":129,"props":2115,"children":2116},{},[2117],{"type":42,"value":2118},"remote_images = [\"https:\u002F\u002Fexample\\\\.com\u002F.*\"]\n",{"type":36,"tag":45,"props":2120,"children":2121},{},[2122,2124,2129],{"type":42,"value":2123},"See the ",{"type":36,"tag":60,"props":2125,"children":2126},{},[2127],{"type":42,"value":2128},"netlify-image-cdn",{"type":42,"value":2130}," skill for full Image CDN usage.",{"type":36,"tag":2132,"props":2133,"children":2134},"style",{},[2135],{"type":42,"value":2136},"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":2138,"total":300},[2139,2156,2173,2188,2205,2220,2226],{"slug":2140,"name":2140,"fn":2141,"description":2142,"org":2143,"tags":2144,"stars":20,"repoUrl":21,"updatedAt":2155},"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},[2145,2148,2149,2152],{"name":2146,"slug":2147,"type":15},"Access Control","access-control",{"name":9,"slug":8,"type":15},{"name":2150,"slug":2151,"type":15},"Permissions","permissions",{"name":2153,"slug":2154,"type":15},"Security","security","2026-07-14T05:40:29.082149",{"slug":2157,"name":2157,"fn":2158,"description":2159,"org":2160,"tags":2161,"stars":20,"repoUrl":21,"updatedAt":2172},"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},[2162,2165,2168,2171],{"name":2163,"slug":2164,"type":15},"Agents","agents",{"name":2166,"slug":2167,"type":15},"Automation","automation",{"name":2169,"slug":2170,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},"2026-07-17T05:30:19.462913",{"slug":2174,"name":2174,"fn":2175,"description":2176,"org":2177,"tags":2178,"stars":20,"repoUrl":21,"updatedAt":2187},"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},[2179,2182,2185,2186],{"name":2180,"slug":2181,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2183,"slug":2184,"type":15},"API Development","api-development",{"name":2169,"slug":2170,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:13.14555",{"slug":2189,"name":2189,"fn":2190,"description":2191,"org":2192,"tags":2193,"stars":20,"repoUrl":21,"updatedAt":2204},"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},[2194,2197,2200,2201],{"name":2195,"slug":2196,"type":15},"Backend","backend",{"name":2198,"slug":2199,"type":15},"File Storage","file-storage",{"name":9,"slug":8,"type":15},{"name":2202,"slug":2203,"type":15},"Storage","storage","2026-07-17T05:30:16.503306",{"slug":2206,"name":2206,"fn":2207,"description":2208,"org":2209,"tags":2210,"stars":20,"repoUrl":21,"updatedAt":2219},"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},[2211,2214,2215,2216],{"name":2212,"slug":2213,"type":15},"Caching","caching",{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2217,"slug":2218,"type":15},"Performance","performance","2026-07-14T05:40:20.066717",{"slug":4,"name":4,"fn":5,"description":6,"org":2221,"tags":2222,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2223,2224,2225],{"name":13,"slug":14,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":2227,"name":2227,"fn":2228,"description":2229,"org":2230,"tags":2231,"stars":20,"repoUrl":21,"updatedAt":2240},"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},[2232,2233,2236,2237],{"name":2195,"slug":2196,"type":15},{"name":2234,"slug":2235,"type":15},"Database","database",{"name":9,"slug":8,"type":15},{"name":2238,"slug":2239,"type":15},"PostgreSQL","postgresql","2026-07-20T05:58:58.934045",{"items":2242,"total":318},[2243,2257,2269,2276,2283,2290,2297,2304,2310,2317,2329,2344],{"slug":2244,"name":2244,"fn":2245,"description":2246,"org":2247,"tags":2248,"stars":444,"repoUrl":2255,"updatedAt":2256},"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},[2249,2250,2251,2254],{"name":2163,"slug":2164,"type":15},{"name":13,"slug":14,"type":15},{"name":2252,"slug":2253,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Faxis","2026-07-20T05:59:47.468757",{"slug":2258,"name":2258,"fn":2259,"description":2260,"org":2261,"tags":2262,"stars":444,"repoUrl":2255,"updatedAt":2268},"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},[2263,2266,2267],{"name":2264,"slug":2265,"type":15},"CLI","cli",{"name":2252,"slug":2253,"type":15},{"name":9,"slug":8,"type":15},"2026-07-14T05:40:13.443461",{"slug":2140,"name":2140,"fn":2141,"description":2142,"org":2270,"tags":2271,"stars":20,"repoUrl":21,"updatedAt":2155},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2272,2273,2274,2275],{"name":2146,"slug":2147,"type":15},{"name":9,"slug":8,"type":15},{"name":2150,"slug":2151,"type":15},{"name":2153,"slug":2154,"type":15},{"slug":2157,"name":2157,"fn":2158,"description":2159,"org":2277,"tags":2278,"stars":20,"repoUrl":21,"updatedAt":2172},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2279,2280,2281,2282],{"name":2163,"slug":2164,"type":15},{"name":2166,"slug":2167,"type":15},{"name":2169,"slug":2170,"type":15},{"name":9,"slug":8,"type":15},{"slug":2174,"name":2174,"fn":2175,"description":2176,"org":2284,"tags":2285,"stars":20,"repoUrl":21,"updatedAt":2187},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2286,2287,2288,2289],{"name":2180,"slug":2181,"type":15},{"name":2183,"slug":2184,"type":15},{"name":2169,"slug":2170,"type":15},{"name":9,"slug":8,"type":15},{"slug":2189,"name":2189,"fn":2190,"description":2191,"org":2291,"tags":2292,"stars":20,"repoUrl":21,"updatedAt":2204},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2293,2294,2295,2296],{"name":2195,"slug":2196,"type":15},{"name":2198,"slug":2199,"type":15},{"name":9,"slug":8,"type":15},{"name":2202,"slug":2203,"type":15},{"slug":2206,"name":2206,"fn":2207,"description":2208,"org":2298,"tags":2299,"stars":20,"repoUrl":21,"updatedAt":2219},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2300,2301,2302,2303],{"name":2212,"slug":2213,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2217,"slug":2218,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":2305,"tags":2306,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2307,2308,2309],{"name":13,"slug":14,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":2227,"name":2227,"fn":2228,"description":2229,"org":2311,"tags":2312,"stars":20,"repoUrl":21,"updatedAt":2240},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2313,2314,2315,2316],{"name":2195,"slug":2196,"type":15},{"name":2234,"slug":2235,"type":15},{"name":9,"slug":8,"type":15},{"name":2238,"slug":2239,"type":15},{"slug":78,"name":78,"fn":2318,"description":2319,"org":2320,"tags":2321,"stars":20,"repoUrl":21,"updatedAt":2328},"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},[2322,2323,2324,2325],{"name":2264,"slug":2265,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2326,"slug":2327,"type":15},"Web Development","web-development","2026-07-17T05:30:14.218977",{"slug":2330,"name":2330,"fn":2331,"description":2332,"org":2333,"tags":2334,"stars":20,"repoUrl":21,"updatedAt":2343},"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},[2335,2338,2341,2342],{"name":2336,"slug":2337,"type":15},"Edge Functions","edge-functions",{"name":2339,"slug":2340,"type":15},"Middleware","middleware",{"name":9,"slug":8,"type":15},{"name":2217,"slug":2218,"type":15},"2026-07-14T05:40:34.147865",{"slug":2345,"name":2345,"fn":2346,"description":2347,"org":2348,"tags":2349,"stars":20,"repoUrl":21,"updatedAt":2358},"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},[2350,2353,2356,2357],{"name":2351,"slug":2352,"type":15},"Forms","forms",{"name":2354,"slug":2355,"type":15},"HTML","html",{"name":9,"slug":8,"type":15},{"name":2326,"slug":2327,"type":15},"2026-07-14T05:40:16.075367"]