[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-netlify-netlify-deploy":3,"mdc--y7n7fl-key":33,"related-repo-netlify-netlify-deploy":1669,"related-org-netlify-netlify-deploy":1778},{"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-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},"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},"CLI","cli","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Deployment","deployment",{"name":21,"slug":22,"type":15},"Web Development","web-development",24,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools","2026-07-17T05:30:14.218977",null,5,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools\u002Ftree\u002FHEAD\u002Fskills\u002Fnetlify-deploy","---\nname: netlify-deploy\ndescription: 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).\n---\n\n# Netlify Deployment\n\nInstall the CLI, link a project to a Netlify site, and deploy it — either through Git-based continuous deployment (the primary path) or a manual CLI upload (for prototypes and CI). Environment-variable management lives in the **netlify-config** skill; local development lives in the **netlify-frameworks** skill.\n\n## Installation\n\n```bash\nnpm install -g netlify-cli    # Global (for local dev)\nnpm install netlify-cli -D    # Local (for CI)\n```\n\nRequires Node.js 18.14.0+. You can also invoke the CLI without installing it using `npx netlify \u003Ccommand>`.\n\n## Authentication\n\n```bash\nnetlify login       # Opens browser for OAuth\n```\n\nFor CI, set the `NETLIFY_AUTH_TOKEN` environment variable instead of logging in interactively. Generate a token from **User settings → Applications → Personal access tokens** in the Netlify UI.\n\n**CI also needs a site to target.** `NETLIFY_AUTH_TOKEN` only authenticates you — it does **not** select which site a deploy publishes to. In CI there is no linked `.netlify\u002Fstate.json`, so also set `NETLIFY_SITE_ID` (the site's API\u002FProject ID, shown as **Project ID** in the site's configuration) as an environment variable so `netlify deploy` knows where to publish. Without it, a CI deploy has no site to target and fails or tries to prompt. Locally this is handled by `netlify link`, which writes the site ID into `.netlify\u002Fstate.json`; CI has no such file.\n\nDon't pre-check auth as a separate step. Run the real operation (`netlify deploy`, `netlify link`) directly; only if it fails with an authentication error do you surface `netlify login` (or setting `NETLIFY_AUTH_TOKEN`) as the fix.\n\n## Linking a Site\n\nLinking connects the local directory to a Netlify site and writes the site ID into `.netlify\u002Fstate.json`.\n\n```bash\n# Interactive — pick an existing site\nnetlify link\n\n# By Git remote (if the project has one)\nnetlify link --git-remote-url https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\n\n# Create a new site\nnetlify init           # With Git CI\u002FCD setup\nnetlify init --manual  # Without Git CI\u002FCD\n```\n\nRun `netlify link` directly rather than pre-checking link status. If the command reports the project isn't linked to any site (or the site can't be found), that failure is the signal to link or create one with `netlify link` \u002F `netlify init`.\n\n**Always add `.netlify` to `.gitignore`** — every linking path (`netlify link`, `netlify init`, `netlify init --manual`) writes site state to `.netlify\u002Fstate.json`, which shouldn't be committed. Mention this whenever you link or create a site.\n\n## Deploying\n\n### Git-Based Deploys (Continuous Deployment) — primary path\n\nThe standard way to deploy on Netlify is to connect the site to a Git repository (set up with `netlify init`, or in the UI). Netlify then builds and deploys automatically on every push:\n\n- **Push to the production branch → production deploy.**\n- **Open a pull request → deploy preview** with its own unique URL.\n- **Push to other branches → branch deploy**, but **only if branch deploys are enabled** — they are off by default. Turn them on (per branch or for all branches) in the site's build & deploy settings.\n\nThe build runs on Netlify's servers, not your machine. Configure build settings (command, publish directory, base directory) in `netlify.toml` — see the **netlify-config** skill for the full configuration reference.\n\n**`netlify.toml` overrides the UI.** File-based configuration in `netlify.toml` takes precedence over the equivalent build settings configured in the Netlify UI. When the same option is set in both places, the committed `netlify.toml` wins — editing that setting in the dashboard has no effect until you change the file and redeploy. This surprises people who tweak the build command, publish directory, or base directory in the UI and watch the old committed value keep applying on every deploy.\n\n**Monorepo config discovery order.** In a monorepo, Netlify searches for the `netlify.toml` in this order and uses the **first** one it finds: (1) the package directory, then (2) the base directory, then (3) the repository root. Put a site-specific `netlify.toml` in the package directory (the subdirectory that contains that site) so it takes precedence over any root-level config. A base directory set in a root-level `netlify.toml` also overrides the base directory configured in the UI.\n\n**The publish directory is resolved relative to the base directory.** When a `base` directory is configured, the publish directory is interpreted relative to that base, **not** the repository root. A top-level `publish = \"dist\"` combined with `base = \"apps\u002Fweb\"` publishes `apps\u002Fweb\u002Fdist`, not `dist` at the repo root. Set `publish` relative to the base so the built output is found.\n\n### Manual \u002F Local Deploys (No Git Required) — secondary path\n\nBuild the site, then upload the output directly with the CLI. This bypasses Netlify's build servers and is the right tool for prototypes, local-only projects with no Git remote, or a CI pipeline that builds elsewhere and uploads the artifact.\n\n```bash\nnetlify deploy             # Draft deploy (preview URL)\nnetlify deploy --prod      # Production deploy\nnetlify deploy --dir=dist  # Specify the directory to upload\n```\n\nFor sites with Git continuous deployment connected, prefer pushing to Git — a manual upload is the exception, not the default.\n\n**A manual `--prod` deploy is replaced by the next Git push.** If the same site also has Git continuous deployment connected, the next push to the production branch triggers a new build that auto-publishes and **replaces** your manually shipped `--prod` deploy — the hand-shipped build silently disappears from production. To keep a specific deploy live, **lock the published deploy** (\"Stop auto publishing\") from the site's Deploys list in the UI: while locked, new pushes still build but do not auto-publish until you unlock or manually publish. Mixing manual `--prod` deploys with Git CD on the same production branch is otherwise a race the next commit wins.\n\n### Deploy URLs are public by link\n\nDraft deploys (`netlify deploy`), Deploy Previews, branch deploys, and deploy permalinks each get a **unique URL that anyone with the link can open** — they are not private just because the URL is unguessable and unlisted. Don't treat a preview URL as a safe place for confidential or unreleased content on that basis alone. To actually restrict access, enable site protection in the UI (Password Protection, or Team\u002FSSO protection). You can scope that protection to all deploys, or to non-production deploys only (Deploy Previews and branch deploys) while leaving production open. See the **netlify-access-control** skill for the full picture.\n\n## When a command fails, surface and stop\n\nWhen a `netlify` command or a deploy fails, **report the failure to the user** with the exact error, the deploy log URL (the CLI prints one), and the affected site\u002Fbranch — and stop. Do not invent recovery commands or escalate to lower-level tools: do not curl `https:\u002F\u002Fapi.netlify.com\u002F...`, do not run `netlify api \u003Cmethod>` as a recovery hatch, and do not read auth tokens off disk to force the operation through. If the documented happy path is broken, that's a platform-state problem the user needs to see.\n\n## Error Handling\n\nCommon issues and what to do:\n\n**\"Not logged in\"**\n→ Run `netlify login` (or set `NETLIFY_AUTH_TOKEN` in CI).\n\n**\"No site linked\"**\n→ Run `netlify link` (existing site) or `netlify init` (new site).\n\n**\"Build failed\" \u002F \"Function bundling failed\" \u002F deploy marked failed**\n→ A failed deploy does **not** publish — the site keeps serving the last successful deploy, so it isn't down, and there's nothing to \"roll back.\" The only way to get the new code live is to fix the failure and redeploy.\n→ Get the exact error from the deploy log (the CLI prints a log URL; the dashboard has the full build log), then address the actual cause — the build command or publish directory in `netlify.toml`, a missing dependency, or the function that failed to bundle — and re-run the deploy.\n→ Don't route around a failed build to force the site live: no `netlify api` publish\u002Frestore, no direct `https:\u002F\u002Fapi.netlify.com\u002F...` calls, no reading auth tokens off disk, and don't ship a previous deploy in place of the failing one. If the log doesn't resolve it, report the exact error + log URL + affected site to the user and stop.\n→ Even if the user *asks* how to \"roll back\" or restore a previous deploy, correct the premise rather than complying: because the failed deploy never published, the previous deploy is still live and there is nothing to restore. Do **not** hand over `netlify api restoreSiteDeploy` \u002F `publishDeploy` (or a dashboard rollback) as the answer — the fix is to resolve the build failure and redeploy.\n\n**\"Secrets scanning found secrets\" \u002F deploy fails after a successful build**\n→ Netlify scans the build output and source for secret values (env-var values, known key formats) *after* the build succeeds and **fails the deploy** if it finds one — so an otherwise-green build can still fail here. Read the log: it names the offending key and where it appeared.\n→ If it's a real secret (an API\u002FDB key that ended up in bundled or published output), that's a genuine leak — stop writing it into client\u002Fpublished files, and rotate the key if it was committed. Silencing the scanner over a real leak just ships the secret.\n→ If the flagged value is legitimately non-secret (e.g. a value that must ship to the browser), scope the exception narrowly with build environment variables: `SECRETS_SCAN_OMIT_KEYS` to exclude specific env-var keys, or `SECRETS_SCAN_OMIT_PATHS` to exclude specific paths. Prefer these over `SECRETS_SCAN_ENABLED=false`, which disables scanning across the entire build.\n\n**\"Publish directory not found\"**\n→ Run the build yourself (`netlify build`, which mimics the Netlify build environment, or the project's own build command) and look at which directory it actually emits — don't guess the output dir from the framework name, and don't just `ls` for a folder that isn't there.\n→ If the build itself **fails**, that's the real problem — surface the build error to the user and stop; don't change the `publish` path to paper over a broken build.\n→ Once the build succeeds, set the `publish` path (in `netlify.toml`, or `--dir`) to match that real output directory — remembering it's resolved relative to any configured `base` directory (see above).\n\n## Logs\n\nThe simplest command is the right default: bare `netlify logs` shows recent logs from both the `functions` and `edge-functions` sources, covering roughly the last 10 minutes. Add flags only to scope or extend it:\n\n```bash\nnetlify logs                                       # recent functions + edge-functions logs (~last 10m)\nnetlify logs --follow                              # stream live\nnetlify logs --source functions --function my-fn   # one function's logs\nnetlify logs --source deploy --source functions    # include deploy logs (sources combine)\nnetlify logs --since 24h                           # longer historical window\n```\n\n`--source` accepts `functions`, `edge-functions`, and `deploy`. This is the documented CLI logs surface — reach for it before the dashboard, and see [CLI commands](references\u002Fcli-commands.md) for more.\n\n## Useful Commands\n\n| Command | Description |\n|---|---|\n| `netlify build` | Run the build locally (mimics the Netlify build environment) |\n| `netlify deploy` | Draft deploy (preview URL) |\n| `netlify deploy --prod` | Production deploy |\n| `netlify deploy --dir=\u003Cdir>` | Deploy a specific directory |\n| `netlify clone org\u002Frepo` | Clone, link, and set up in one step |\n| `netlify open` | Open the site in the Netlify dashboard |\n| `netlify logs` | Recent function + edge-function logs (see Logs above) |\n\n## Related skills\n\n- **netlify-config** — `netlify.toml` (build settings, redirects, headers, deploy contexts) and environment-variable management (`env:set`, `env:get`, `env:list`, context scoping).\n- **netlify-frameworks** — framework adapter\u002Fplugin setup and local development (`netlify dev`, the Netlify Vite plugin).\n- **netlify-access-control** — restricting who can reach a site or its deploys.\n\n## References\n\n- [CLI commands](references\u002Fcli-commands.md)\n- [Deployment patterns](references\u002Fdeployment-patterns.md)\n- [netlify.toml guide](references\u002Fnetlify-toml.md)\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,47,68,75,147,160,166,190,210,280,314,320,331,456,482,533,539,546,558,598,617,646,684,748,754,759,825,830,876,882,908,914,949,955,960,984,1007,1074,1122,1191,1197,1226,1365,1406,1412,1556,1562,1629,1635,1663],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"netlify-deployment",[44],{"type":45,"value":46},"text","Netlify Deployment",{"type":39,"tag":48,"props":49,"children":50},"p",{},[51,53,59,61,66],{"type":45,"value":52},"Install the CLI, link a project to a Netlify site, and deploy it — either through Git-based continuous deployment (the primary path) or a manual CLI upload (for prototypes and CI). Environment-variable management lives in the ",{"type":39,"tag":54,"props":55,"children":56},"strong",{},[57],{"type":45,"value":58},"netlify-config",{"type":45,"value":60}," skill; local development lives in the ",{"type":39,"tag":54,"props":62,"children":63},{},[64],{"type":45,"value":65},"netlify-frameworks",{"type":45,"value":67}," skill.",{"type":39,"tag":69,"props":70,"children":72},"h2",{"id":71},"installation",[73],{"type":45,"value":74},"Installation",{"type":39,"tag":76,"props":77,"children":82},"pre",{"className":78,"code":79,"language":80,"meta":81,"style":81},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install -g netlify-cli    # Global (for local dev)\nnpm install netlify-cli -D    # Local (for CI)\n","bash","",[83],{"type":39,"tag":84,"props":85,"children":86},"code",{"__ignoreMap":81},[87,121],{"type":39,"tag":88,"props":89,"children":92},"span",{"class":90,"line":91},"line",1,[93,99,105,110,115],{"type":39,"tag":88,"props":94,"children":96},{"style":95},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[97],{"type":45,"value":98},"npm",{"type":39,"tag":88,"props":100,"children":102},{"style":101},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[103],{"type":45,"value":104}," install",{"type":39,"tag":88,"props":106,"children":107},{"style":101},[108],{"type":45,"value":109}," -g",{"type":39,"tag":88,"props":111,"children":112},{"style":101},[113],{"type":45,"value":114}," netlify-cli",{"type":39,"tag":88,"props":116,"children":118},{"style":117},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[119],{"type":45,"value":120},"    # Global (for local dev)\n",{"type":39,"tag":88,"props":122,"children":124},{"class":90,"line":123},2,[125,129,133,137,142],{"type":39,"tag":88,"props":126,"children":127},{"style":95},[128],{"type":45,"value":98},{"type":39,"tag":88,"props":130,"children":131},{"style":101},[132],{"type":45,"value":104},{"type":39,"tag":88,"props":134,"children":135},{"style":101},[136],{"type":45,"value":114},{"type":39,"tag":88,"props":138,"children":139},{"style":101},[140],{"type":45,"value":141}," -D",{"type":39,"tag":88,"props":143,"children":144},{"style":117},[145],{"type":45,"value":146},"    # Local (for CI)\n",{"type":39,"tag":48,"props":148,"children":149},{},[150,152,158],{"type":45,"value":151},"Requires Node.js 18.14.0+. You can also invoke the CLI without installing it using ",{"type":39,"tag":84,"props":153,"children":155},{"className":154},[],[156],{"type":45,"value":157},"npx netlify \u003Ccommand>",{"type":45,"value":159},".",{"type":39,"tag":69,"props":161,"children":163},{"id":162},"authentication",[164],{"type":45,"value":165},"Authentication",{"type":39,"tag":76,"props":167,"children":169},{"className":78,"code":168,"language":80,"meta":81,"style":81},"netlify login       # Opens browser for OAuth\n",[170],{"type":39,"tag":84,"props":171,"children":172},{"__ignoreMap":81},[173],{"type":39,"tag":88,"props":174,"children":175},{"class":90,"line":91},[176,180,185],{"type":39,"tag":88,"props":177,"children":178},{"style":95},[179],{"type":45,"value":8},{"type":39,"tag":88,"props":181,"children":182},{"style":101},[183],{"type":45,"value":184}," login",{"type":39,"tag":88,"props":186,"children":187},{"style":117},[188],{"type":45,"value":189},"       # Opens browser for OAuth\n",{"type":39,"tag":48,"props":191,"children":192},{},[193,195,201,203,208],{"type":45,"value":194},"For CI, set the ",{"type":39,"tag":84,"props":196,"children":198},{"className":197},[],[199],{"type":45,"value":200},"NETLIFY_AUTH_TOKEN",{"type":45,"value":202}," environment variable instead of logging in interactively. Generate a token from ",{"type":39,"tag":54,"props":204,"children":205},{},[206],{"type":45,"value":207},"User settings → Applications → Personal access tokens",{"type":45,"value":209}," in the Netlify UI.",{"type":39,"tag":48,"props":211,"children":212},{},[213,218,220,225,227,232,234,240,242,248,250,255,257,263,265,271,273,278],{"type":39,"tag":54,"props":214,"children":215},{},[216],{"type":45,"value":217},"CI also needs a site to target.",{"type":45,"value":219}," ",{"type":39,"tag":84,"props":221,"children":223},{"className":222},[],[224],{"type":45,"value":200},{"type":45,"value":226}," only authenticates you — it does ",{"type":39,"tag":54,"props":228,"children":229},{},[230],{"type":45,"value":231},"not",{"type":45,"value":233}," select which site a deploy publishes to. In CI there is no linked ",{"type":39,"tag":84,"props":235,"children":237},{"className":236},[],[238],{"type":45,"value":239},".netlify\u002Fstate.json",{"type":45,"value":241},", so also set ",{"type":39,"tag":84,"props":243,"children":245},{"className":244},[],[246],{"type":45,"value":247},"NETLIFY_SITE_ID",{"type":45,"value":249}," (the site's API\u002FProject ID, shown as ",{"type":39,"tag":54,"props":251,"children":252},{},[253],{"type":45,"value":254},"Project ID",{"type":45,"value":256}," in the site's configuration) as an environment variable so ",{"type":39,"tag":84,"props":258,"children":260},{"className":259},[],[261],{"type":45,"value":262},"netlify deploy",{"type":45,"value":264}," knows where to publish. Without it, a CI deploy has no site to target and fails or tries to prompt. Locally this is handled by ",{"type":39,"tag":84,"props":266,"children":268},{"className":267},[],[269],{"type":45,"value":270},"netlify link",{"type":45,"value":272},", which writes the site ID into ",{"type":39,"tag":84,"props":274,"children":276},{"className":275},[],[277],{"type":45,"value":239},{"type":45,"value":279},"; CI has no such file.",{"type":39,"tag":48,"props":281,"children":282},{},[283,285,290,292,297,299,305,307,312],{"type":45,"value":284},"Don't pre-check auth as a separate step. Run the real operation (",{"type":39,"tag":84,"props":286,"children":288},{"className":287},[],[289],{"type":45,"value":262},{"type":45,"value":291},", ",{"type":39,"tag":84,"props":293,"children":295},{"className":294},[],[296],{"type":45,"value":270},{"type":45,"value":298},") directly; only if it fails with an authentication error do you surface ",{"type":39,"tag":84,"props":300,"children":302},{"className":301},[],[303],{"type":45,"value":304},"netlify login",{"type":45,"value":306}," (or setting ",{"type":39,"tag":84,"props":308,"children":310},{"className":309},[],[311],{"type":45,"value":200},{"type":45,"value":313},") as the fix.",{"type":39,"tag":69,"props":315,"children":317},{"id":316},"linking-a-site",[318],{"type":45,"value":319},"Linking a Site",{"type":39,"tag":48,"props":321,"children":322},{},[323,325,330],{"type":45,"value":324},"Linking connects the local directory to a Netlify site and writes the site ID into ",{"type":39,"tag":84,"props":326,"children":328},{"className":327},[],[329],{"type":45,"value":239},{"type":45,"value":159},{"type":39,"tag":76,"props":332,"children":334},{"className":78,"code":333,"language":80,"meta":81,"style":81},"# Interactive — pick an existing site\nnetlify link\n\n# By Git remote (if the project has one)\nnetlify link --git-remote-url https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\n\n# Create a new site\nnetlify init           # With Git CI\u002FCD setup\nnetlify init --manual  # Without Git CI\u002FCD\n",[335],{"type":39,"tag":84,"props":336,"children":337},{"__ignoreMap":81},[338,346,358,368,377,399,407,416,434],{"type":39,"tag":88,"props":339,"children":340},{"class":90,"line":91},[341],{"type":39,"tag":88,"props":342,"children":343},{"style":117},[344],{"type":45,"value":345},"# Interactive — pick an existing site\n",{"type":39,"tag":88,"props":347,"children":348},{"class":90,"line":123},[349,353],{"type":39,"tag":88,"props":350,"children":351},{"style":95},[352],{"type":45,"value":8},{"type":39,"tag":88,"props":354,"children":355},{"style":101},[356],{"type":45,"value":357}," link\n",{"type":39,"tag":88,"props":359,"children":361},{"class":90,"line":360},3,[362],{"type":39,"tag":88,"props":363,"children":365},{"emptyLinePlaceholder":364},true,[366],{"type":45,"value":367},"\n",{"type":39,"tag":88,"props":369,"children":371},{"class":90,"line":370},4,[372],{"type":39,"tag":88,"props":373,"children":374},{"style":117},[375],{"type":45,"value":376},"# By Git remote (if the project has one)\n",{"type":39,"tag":88,"props":378,"children":379},{"class":90,"line":27},[380,384,389,394],{"type":39,"tag":88,"props":381,"children":382},{"style":95},[383],{"type":45,"value":8},{"type":39,"tag":88,"props":385,"children":386},{"style":101},[387],{"type":45,"value":388}," link",{"type":39,"tag":88,"props":390,"children":391},{"style":101},[392],{"type":45,"value":393}," --git-remote-url",{"type":39,"tag":88,"props":395,"children":396},{"style":101},[397],{"type":45,"value":398}," https:\u002F\u002Fgithub.com\u002Forg\u002Frepo\n",{"type":39,"tag":88,"props":400,"children":402},{"class":90,"line":401},6,[403],{"type":39,"tag":88,"props":404,"children":405},{"emptyLinePlaceholder":364},[406],{"type":45,"value":367},{"type":39,"tag":88,"props":408,"children":410},{"class":90,"line":409},7,[411],{"type":39,"tag":88,"props":412,"children":413},{"style":117},[414],{"type":45,"value":415},"# Create a new site\n",{"type":39,"tag":88,"props":417,"children":419},{"class":90,"line":418},8,[420,424,429],{"type":39,"tag":88,"props":421,"children":422},{"style":95},[423],{"type":45,"value":8},{"type":39,"tag":88,"props":425,"children":426},{"style":101},[427],{"type":45,"value":428}," init",{"type":39,"tag":88,"props":430,"children":431},{"style":117},[432],{"type":45,"value":433},"           # With Git CI\u002FCD setup\n",{"type":39,"tag":88,"props":435,"children":437},{"class":90,"line":436},9,[438,442,446,451],{"type":39,"tag":88,"props":439,"children":440},{"style":95},[441],{"type":45,"value":8},{"type":39,"tag":88,"props":443,"children":444},{"style":101},[445],{"type":45,"value":428},{"type":39,"tag":88,"props":447,"children":448},{"style":101},[449],{"type":45,"value":450}," --manual",{"type":39,"tag":88,"props":452,"children":453},{"style":117},[454],{"type":45,"value":455},"  # Without Git CI\u002FCD\n",{"type":39,"tag":48,"props":457,"children":458},{},[459,461,466,468,473,475,481],{"type":45,"value":460},"Run ",{"type":39,"tag":84,"props":462,"children":464},{"className":463},[],[465],{"type":45,"value":270},{"type":45,"value":467}," directly rather than pre-checking link status. If the command reports the project isn't linked to any site (or the site can't be found), that failure is the signal to link or create one with ",{"type":39,"tag":84,"props":469,"children":471},{"className":470},[],[472],{"type":45,"value":270},{"type":45,"value":474}," \u002F ",{"type":39,"tag":84,"props":476,"children":478},{"className":477},[],[479],{"type":45,"value":480},"netlify init",{"type":45,"value":159},{"type":39,"tag":48,"props":483,"children":484},{},[485,504,506,511,512,517,518,524,526,531],{"type":39,"tag":54,"props":486,"children":487},{},[488,490,496,498],{"type":45,"value":489},"Always add ",{"type":39,"tag":84,"props":491,"children":493},{"className":492},[],[494],{"type":45,"value":495},".netlify",{"type":45,"value":497}," to ",{"type":39,"tag":84,"props":499,"children":501},{"className":500},[],[502],{"type":45,"value":503},".gitignore",{"type":45,"value":505}," — every linking path (",{"type":39,"tag":84,"props":507,"children":509},{"className":508},[],[510],{"type":45,"value":270},{"type":45,"value":291},{"type":39,"tag":84,"props":513,"children":515},{"className":514},[],[516],{"type":45,"value":480},{"type":45,"value":291},{"type":39,"tag":84,"props":519,"children":521},{"className":520},[],[522],{"type":45,"value":523},"netlify init --manual",{"type":45,"value":525},") writes site state to ",{"type":39,"tag":84,"props":527,"children":529},{"className":528},[],[530],{"type":45,"value":239},{"type":45,"value":532},", which shouldn't be committed. Mention this whenever you link or create a site.",{"type":39,"tag":69,"props":534,"children":536},{"id":535},"deploying",[537],{"type":45,"value":538},"Deploying",{"type":39,"tag":540,"props":541,"children":543},"h3",{"id":542},"git-based-deploys-continuous-deployment-primary-path",[544],{"type":45,"value":545},"Git-Based Deploys (Continuous Deployment) — primary path",{"type":39,"tag":48,"props":547,"children":548},{},[549,551,556],{"type":45,"value":550},"The standard way to deploy on Netlify is to connect the site to a Git repository (set up with ",{"type":39,"tag":84,"props":552,"children":554},{"className":553},[],[555],{"type":45,"value":480},{"type":45,"value":557},", or in the UI). Netlify then builds and deploys automatically on every push:",{"type":39,"tag":559,"props":560,"children":561},"ul",{},[562,571,581],{"type":39,"tag":563,"props":564,"children":565},"li",{},[566],{"type":39,"tag":54,"props":567,"children":568},{},[569],{"type":45,"value":570},"Push to the production branch → production deploy.",{"type":39,"tag":563,"props":572,"children":573},{},[574,579],{"type":39,"tag":54,"props":575,"children":576},{},[577],{"type":45,"value":578},"Open a pull request → deploy preview",{"type":45,"value":580}," with its own unique URL.",{"type":39,"tag":563,"props":582,"children":583},{},[584,589,591,596],{"type":39,"tag":54,"props":585,"children":586},{},[587],{"type":45,"value":588},"Push to other branches → branch deploy",{"type":45,"value":590},", but ",{"type":39,"tag":54,"props":592,"children":593},{},[594],{"type":45,"value":595},"only if branch deploys are enabled",{"type":45,"value":597}," — they are off by default. Turn them on (per branch or for all branches) in the site's build & deploy settings.",{"type":39,"tag":48,"props":599,"children":600},{},[601,603,609,611,615],{"type":45,"value":602},"The build runs on Netlify's servers, not your machine. Configure build settings (command, publish directory, base directory) in ",{"type":39,"tag":84,"props":604,"children":606},{"className":605},[],[607],{"type":45,"value":608},"netlify.toml",{"type":45,"value":610}," — see the ",{"type":39,"tag":54,"props":612,"children":613},{},[614],{"type":45,"value":58},{"type":45,"value":616}," skill for the full configuration reference.",{"type":39,"tag":48,"props":618,"children":619},{},[620,630,632,637,639,644],{"type":39,"tag":54,"props":621,"children":622},{},[623,628],{"type":39,"tag":84,"props":624,"children":626},{"className":625},[],[627],{"type":45,"value":608},{"type":45,"value":629}," overrides the UI.",{"type":45,"value":631}," File-based configuration in ",{"type":39,"tag":84,"props":633,"children":635},{"className":634},[],[636],{"type":45,"value":608},{"type":45,"value":638}," takes precedence over the equivalent build settings configured in the Netlify UI. When the same option is set in both places, the committed ",{"type":39,"tag":84,"props":640,"children":642},{"className":641},[],[643],{"type":45,"value":608},{"type":45,"value":645}," wins — editing that setting in the dashboard has no effect until you change the file and redeploy. This surprises people who tweak the build command, publish directory, or base directory in the UI and watch the old committed value keep applying on every deploy.",{"type":39,"tag":48,"props":647,"children":648},{},[649,654,656,661,663,668,670,675,677,682],{"type":39,"tag":54,"props":650,"children":651},{},[652],{"type":45,"value":653},"Monorepo config discovery order.",{"type":45,"value":655}," In a monorepo, Netlify searches for the ",{"type":39,"tag":84,"props":657,"children":659},{"className":658},[],[660],{"type":45,"value":608},{"type":45,"value":662}," in this order and uses the ",{"type":39,"tag":54,"props":664,"children":665},{},[666],{"type":45,"value":667},"first",{"type":45,"value":669}," one it finds: (1) the package directory, then (2) the base directory, then (3) the repository root. Put a site-specific ",{"type":39,"tag":84,"props":671,"children":673},{"className":672},[],[674],{"type":45,"value":608},{"type":45,"value":676}," in the package directory (the subdirectory that contains that site) so it takes precedence over any root-level config. A base directory set in a root-level ",{"type":39,"tag":84,"props":678,"children":680},{"className":679},[],[681],{"type":45,"value":608},{"type":45,"value":683}," also overrides the base directory configured in the UI.",{"type":39,"tag":48,"props":685,"children":686},{},[687,692,694,700,702,706,708,714,716,722,724,730,732,738,740,746],{"type":39,"tag":54,"props":688,"children":689},{},[690],{"type":45,"value":691},"The publish directory is resolved relative to the base directory.",{"type":45,"value":693}," When a ",{"type":39,"tag":84,"props":695,"children":697},{"className":696},[],[698],{"type":45,"value":699},"base",{"type":45,"value":701}," directory is configured, the publish directory is interpreted relative to that base, ",{"type":39,"tag":54,"props":703,"children":704},{},[705],{"type":45,"value":231},{"type":45,"value":707}," the repository root. A top-level ",{"type":39,"tag":84,"props":709,"children":711},{"className":710},[],[712],{"type":45,"value":713},"publish = \"dist\"",{"type":45,"value":715}," combined with ",{"type":39,"tag":84,"props":717,"children":719},{"className":718},[],[720],{"type":45,"value":721},"base = \"apps\u002Fweb\"",{"type":45,"value":723}," publishes ",{"type":39,"tag":84,"props":725,"children":727},{"className":726},[],[728],{"type":45,"value":729},"apps\u002Fweb\u002Fdist",{"type":45,"value":731},", not ",{"type":39,"tag":84,"props":733,"children":735},{"className":734},[],[736],{"type":45,"value":737},"dist",{"type":45,"value":739}," at the repo root. Set ",{"type":39,"tag":84,"props":741,"children":743},{"className":742},[],[744],{"type":45,"value":745},"publish",{"type":45,"value":747}," relative to the base so the built output is found.",{"type":39,"tag":540,"props":749,"children":751},{"id":750},"manual-local-deploys-no-git-required-secondary-path",[752],{"type":45,"value":753},"Manual \u002F Local Deploys (No Git Required) — secondary path",{"type":39,"tag":48,"props":755,"children":756},{},[757],{"type":45,"value":758},"Build the site, then upload the output directly with the CLI. This bypasses Netlify's build servers and is the right tool for prototypes, local-only projects with no Git remote, or a CI pipeline that builds elsewhere and uploads the artifact.",{"type":39,"tag":76,"props":760,"children":762},{"className":78,"code":761,"language":80,"meta":81,"style":81},"netlify deploy             # Draft deploy (preview URL)\nnetlify deploy --prod      # Production deploy\nnetlify deploy --dir=dist  # Specify the directory to upload\n",[763],{"type":39,"tag":84,"props":764,"children":765},{"__ignoreMap":81},[766,783,804],{"type":39,"tag":88,"props":767,"children":768},{"class":90,"line":91},[769,773,778],{"type":39,"tag":88,"props":770,"children":771},{"style":95},[772],{"type":45,"value":8},{"type":39,"tag":88,"props":774,"children":775},{"style":101},[776],{"type":45,"value":777}," deploy",{"type":39,"tag":88,"props":779,"children":780},{"style":117},[781],{"type":45,"value":782},"             # Draft deploy (preview URL)\n",{"type":39,"tag":88,"props":784,"children":785},{"class":90,"line":123},[786,790,794,799],{"type":39,"tag":88,"props":787,"children":788},{"style":95},[789],{"type":45,"value":8},{"type":39,"tag":88,"props":791,"children":792},{"style":101},[793],{"type":45,"value":777},{"type":39,"tag":88,"props":795,"children":796},{"style":101},[797],{"type":45,"value":798}," --prod",{"type":39,"tag":88,"props":800,"children":801},{"style":117},[802],{"type":45,"value":803},"      # Production deploy\n",{"type":39,"tag":88,"props":805,"children":806},{"class":90,"line":360},[807,811,815,820],{"type":39,"tag":88,"props":808,"children":809},{"style":95},[810],{"type":45,"value":8},{"type":39,"tag":88,"props":812,"children":813},{"style":101},[814],{"type":45,"value":777},{"type":39,"tag":88,"props":816,"children":817},{"style":101},[818],{"type":45,"value":819}," --dir=dist",{"type":39,"tag":88,"props":821,"children":822},{"style":117},[823],{"type":45,"value":824},"  # Specify the directory to upload\n",{"type":39,"tag":48,"props":826,"children":827},{},[828],{"type":45,"value":829},"For sites with Git continuous deployment connected, prefer pushing to Git — a manual upload is the exception, not the default.",{"type":39,"tag":48,"props":831,"children":832},{},[833,846,848,853,855,860,862,867,869,874],{"type":39,"tag":54,"props":834,"children":835},{},[836,838,844],{"type":45,"value":837},"A manual ",{"type":39,"tag":84,"props":839,"children":841},{"className":840},[],[842],{"type":45,"value":843},"--prod",{"type":45,"value":845}," deploy is replaced by the next Git push.",{"type":45,"value":847}," If the same site also has Git continuous deployment connected, the next push to the production branch triggers a new build that auto-publishes and ",{"type":39,"tag":54,"props":849,"children":850},{},[851],{"type":45,"value":852},"replaces",{"type":45,"value":854}," your manually shipped ",{"type":39,"tag":84,"props":856,"children":858},{"className":857},[],[859],{"type":45,"value":843},{"type":45,"value":861}," deploy — the hand-shipped build silently disappears from production. To keep a specific deploy live, ",{"type":39,"tag":54,"props":863,"children":864},{},[865],{"type":45,"value":866},"lock the published deploy",{"type":45,"value":868}," (\"Stop auto publishing\") from the site's Deploys list in the UI: while locked, new pushes still build but do not auto-publish until you unlock or manually publish. Mixing manual ",{"type":39,"tag":84,"props":870,"children":872},{"className":871},[],[873],{"type":45,"value":843},{"type":45,"value":875}," deploys with Git CD on the same production branch is otherwise a race the next commit wins.",{"type":39,"tag":540,"props":877,"children":879},{"id":878},"deploy-urls-are-public-by-link",[880],{"type":45,"value":881},"Deploy URLs are public by link",{"type":39,"tag":48,"props":883,"children":884},{},[885,887,892,894,899,901,906],{"type":45,"value":886},"Draft deploys (",{"type":39,"tag":84,"props":888,"children":890},{"className":889},[],[891],{"type":45,"value":262},{"type":45,"value":893},"), Deploy Previews, branch deploys, and deploy permalinks each get a ",{"type":39,"tag":54,"props":895,"children":896},{},[897],{"type":45,"value":898},"unique URL that anyone with the link can open",{"type":45,"value":900}," — they are not private just because the URL is unguessable and unlisted. Don't treat a preview URL as a safe place for confidential or unreleased content on that basis alone. To actually restrict access, enable site protection in the UI (Password Protection, or Team\u002FSSO protection). You can scope that protection to all deploys, or to non-production deploys only (Deploy Previews and branch deploys) while leaving production open. See the ",{"type":39,"tag":54,"props":902,"children":903},{},[904],{"type":45,"value":905},"netlify-access-control",{"type":45,"value":907}," skill for the full picture.",{"type":39,"tag":69,"props":909,"children":911},{"id":910},"when-a-command-fails-surface-and-stop",[912],{"type":45,"value":913},"When a command fails, surface and stop",{"type":39,"tag":48,"props":915,"children":916},{},[917,919,924,926,931,933,939,941,947],{"type":45,"value":918},"When a ",{"type":39,"tag":84,"props":920,"children":922},{"className":921},[],[923],{"type":45,"value":8},{"type":45,"value":925}," command or a deploy fails, ",{"type":39,"tag":54,"props":927,"children":928},{},[929],{"type":45,"value":930},"report the failure to the user",{"type":45,"value":932}," with the exact error, the deploy log URL (the CLI prints one), and the affected site\u002Fbranch — and stop. Do not invent recovery commands or escalate to lower-level tools: do not curl ",{"type":39,"tag":84,"props":934,"children":936},{"className":935},[],[937],{"type":45,"value":938},"https:\u002F\u002Fapi.netlify.com\u002F...",{"type":45,"value":940},", do not run ",{"type":39,"tag":84,"props":942,"children":944},{"className":943},[],[945],{"type":45,"value":946},"netlify api \u003Cmethod>",{"type":45,"value":948}," as a recovery hatch, and do not read auth tokens off disk to force the operation through. If the documented happy path is broken, that's a platform-state problem the user needs to see.",{"type":39,"tag":69,"props":950,"children":952},{"id":951},"error-handling",[953],{"type":45,"value":954},"Error Handling",{"type":39,"tag":48,"props":956,"children":957},{},[958],{"type":45,"value":959},"Common issues and what to do:",{"type":39,"tag":48,"props":961,"children":962},{},[963,968,970,975,977,982],{"type":39,"tag":54,"props":964,"children":965},{},[966],{"type":45,"value":967},"\"Not logged in\"",{"type":45,"value":969},"\n→ Run ",{"type":39,"tag":84,"props":971,"children":973},{"className":972},[],[974],{"type":45,"value":304},{"type":45,"value":976}," (or set ",{"type":39,"tag":84,"props":978,"children":980},{"className":979},[],[981],{"type":45,"value":200},{"type":45,"value":983}," in CI).",{"type":39,"tag":48,"props":985,"children":986},{},[987,992,993,998,1000,1005],{"type":39,"tag":54,"props":988,"children":989},{},[990],{"type":45,"value":991},"\"No site linked\"",{"type":45,"value":969},{"type":39,"tag":84,"props":994,"children":996},{"className":995},[],[997],{"type":45,"value":270},{"type":45,"value":999}," (existing site) or ",{"type":39,"tag":84,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":45,"value":480},{"type":45,"value":1006}," (new site).",{"type":39,"tag":48,"props":1008,"children":1009},{},[1010,1015,1017,1021,1023,1028,1030,1036,1038,1043,1045,1051,1053,1057,1059,1065,1066,1072],{"type":39,"tag":54,"props":1011,"children":1012},{},[1013],{"type":45,"value":1014},"\"Build failed\" \u002F \"Function bundling failed\" \u002F deploy marked failed",{"type":45,"value":1016},"\n→ A failed deploy does ",{"type":39,"tag":54,"props":1018,"children":1019},{},[1020],{"type":45,"value":231},{"type":45,"value":1022}," publish — the site keeps serving the last successful deploy, so it isn't down, and there's nothing to \"roll back.\" The only way to get the new code live is to fix the failure and redeploy.\n→ Get the exact error from the deploy log (the CLI prints a log URL; the dashboard has the full build log), then address the actual cause — the build command or publish directory in ",{"type":39,"tag":84,"props":1024,"children":1026},{"className":1025},[],[1027],{"type":45,"value":608},{"type":45,"value":1029},", a missing dependency, or the function that failed to bundle — and re-run the deploy.\n→ Don't route around a failed build to force the site live: no ",{"type":39,"tag":84,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":45,"value":1035},"netlify api",{"type":45,"value":1037}," publish\u002Frestore, no direct ",{"type":39,"tag":84,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":45,"value":938},{"type":45,"value":1044}," calls, no reading auth tokens off disk, and don't ship a previous deploy in place of the failing one. If the log doesn't resolve it, report the exact error + log URL + affected site to the user and stop.\n→ Even if the user ",{"type":39,"tag":1046,"props":1047,"children":1048},"em",{},[1049],{"type":45,"value":1050},"asks",{"type":45,"value":1052}," how to \"roll back\" or restore a previous deploy, correct the premise rather than complying: because the failed deploy never published, the previous deploy is still live and there is nothing to restore. Do ",{"type":39,"tag":54,"props":1054,"children":1055},{},[1056],{"type":45,"value":231},{"type":45,"value":1058}," hand over ",{"type":39,"tag":84,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":45,"value":1064},"netlify api restoreSiteDeploy",{"type":45,"value":474},{"type":39,"tag":84,"props":1067,"children":1069},{"className":1068},[],[1070],{"type":45,"value":1071},"publishDeploy",{"type":45,"value":1073}," (or a dashboard rollback) as the answer — the fix is to resolve the build failure and redeploy.",{"type":39,"tag":48,"props":1075,"children":1076},{},[1077,1082,1084,1089,1091,1096,1098,1104,1106,1112,1114,1120],{"type":39,"tag":54,"props":1078,"children":1079},{},[1080],{"type":45,"value":1081},"\"Secrets scanning found secrets\" \u002F deploy fails after a successful build",{"type":45,"value":1083},"\n→ Netlify scans the build output and source for secret values (env-var values, known key formats) ",{"type":39,"tag":1046,"props":1085,"children":1086},{},[1087],{"type":45,"value":1088},"after",{"type":45,"value":1090}," the build succeeds and ",{"type":39,"tag":54,"props":1092,"children":1093},{},[1094],{"type":45,"value":1095},"fails the deploy",{"type":45,"value":1097}," if it finds one — so an otherwise-green build can still fail here. Read the log: it names the offending key and where it appeared.\n→ If it's a real secret (an API\u002FDB key that ended up in bundled or published output), that's a genuine leak — stop writing it into client\u002Fpublished files, and rotate the key if it was committed. Silencing the scanner over a real leak just ships the secret.\n→ If the flagged value is legitimately non-secret (e.g. a value that must ship to the browser), scope the exception narrowly with build environment variables: ",{"type":39,"tag":84,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":45,"value":1103},"SECRETS_SCAN_OMIT_KEYS",{"type":45,"value":1105}," to exclude specific env-var keys, or ",{"type":39,"tag":84,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":45,"value":1111},"SECRETS_SCAN_OMIT_PATHS",{"type":45,"value":1113}," to exclude specific paths. Prefer these over ",{"type":39,"tag":84,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":45,"value":1119},"SECRETS_SCAN_ENABLED=false",{"type":45,"value":1121},", which disables scanning across the entire build.",{"type":39,"tag":48,"props":1123,"children":1124},{},[1125,1130,1132,1138,1140,1146,1148,1153,1155,1160,1162,1167,1169,1174,1176,1182,1184,1189],{"type":39,"tag":54,"props":1126,"children":1127},{},[1128],{"type":45,"value":1129},"\"Publish directory not found\"",{"type":45,"value":1131},"\n→ Run the build yourself (",{"type":39,"tag":84,"props":1133,"children":1135},{"className":1134},[],[1136],{"type":45,"value":1137},"netlify build",{"type":45,"value":1139},", which mimics the Netlify build environment, or the project's own build command) and look at which directory it actually emits — don't guess the output dir from the framework name, and don't just ",{"type":39,"tag":84,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":45,"value":1145},"ls",{"type":45,"value":1147}," for a folder that isn't there.\n→ If the build itself ",{"type":39,"tag":54,"props":1149,"children":1150},{},[1151],{"type":45,"value":1152},"fails",{"type":45,"value":1154},", that's the real problem — surface the build error to the user and stop; don't change the ",{"type":39,"tag":84,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":45,"value":745},{"type":45,"value":1161}," path to paper over a broken build.\n→ Once the build succeeds, set the ",{"type":39,"tag":84,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":45,"value":745},{"type":45,"value":1168}," path (in ",{"type":39,"tag":84,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":45,"value":608},{"type":45,"value":1175},", or ",{"type":39,"tag":84,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":45,"value":1181},"--dir",{"type":45,"value":1183},") to match that real output directory — remembering it's resolved relative to any configured ",{"type":39,"tag":84,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":45,"value":699},{"type":45,"value":1190}," directory (see above).",{"type":39,"tag":69,"props":1192,"children":1194},{"id":1193},"logs",[1195],{"type":45,"value":1196},"Logs",{"type":39,"tag":48,"props":1198,"children":1199},{},[1200,1202,1208,1210,1216,1218,1224],{"type":45,"value":1201},"The simplest command is the right default: bare ",{"type":39,"tag":84,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":45,"value":1207},"netlify logs",{"type":45,"value":1209}," shows recent logs from both the ",{"type":39,"tag":84,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":45,"value":1215},"functions",{"type":45,"value":1217}," and ",{"type":39,"tag":84,"props":1219,"children":1221},{"className":1220},[],[1222],{"type":45,"value":1223},"edge-functions",{"type":45,"value":1225}," sources, covering roughly the last 10 minutes. Add flags only to scope or extend it:",{"type":39,"tag":76,"props":1227,"children":1229},{"className":78,"code":1228,"language":80,"meta":81,"style":81},"netlify logs                                       # recent functions + edge-functions logs (~last 10m)\nnetlify logs --follow                              # stream live\nnetlify logs --source functions --function my-fn   # one function's logs\nnetlify logs --source deploy --source functions    # include deploy logs (sources combine)\nnetlify logs --since 24h                           # longer historical window\n",[1230],{"type":39,"tag":84,"props":1231,"children":1232},{"__ignoreMap":81},[1233,1250,1271,1307,1339],{"type":39,"tag":88,"props":1234,"children":1235},{"class":90,"line":91},[1236,1240,1245],{"type":39,"tag":88,"props":1237,"children":1238},{"style":95},[1239],{"type":45,"value":8},{"type":39,"tag":88,"props":1241,"children":1242},{"style":101},[1243],{"type":45,"value":1244}," logs",{"type":39,"tag":88,"props":1246,"children":1247},{"style":117},[1248],{"type":45,"value":1249},"                                       # recent functions + edge-functions logs (~last 10m)\n",{"type":39,"tag":88,"props":1251,"children":1252},{"class":90,"line":123},[1253,1257,1261,1266],{"type":39,"tag":88,"props":1254,"children":1255},{"style":95},[1256],{"type":45,"value":8},{"type":39,"tag":88,"props":1258,"children":1259},{"style":101},[1260],{"type":45,"value":1244},{"type":39,"tag":88,"props":1262,"children":1263},{"style":101},[1264],{"type":45,"value":1265}," --follow",{"type":39,"tag":88,"props":1267,"children":1268},{"style":117},[1269],{"type":45,"value":1270},"                              # stream live\n",{"type":39,"tag":88,"props":1272,"children":1273},{"class":90,"line":360},[1274,1278,1282,1287,1292,1297,1302],{"type":39,"tag":88,"props":1275,"children":1276},{"style":95},[1277],{"type":45,"value":8},{"type":39,"tag":88,"props":1279,"children":1280},{"style":101},[1281],{"type":45,"value":1244},{"type":39,"tag":88,"props":1283,"children":1284},{"style":101},[1285],{"type":45,"value":1286}," --source",{"type":39,"tag":88,"props":1288,"children":1289},{"style":101},[1290],{"type":45,"value":1291}," functions",{"type":39,"tag":88,"props":1293,"children":1294},{"style":101},[1295],{"type":45,"value":1296}," --function",{"type":39,"tag":88,"props":1298,"children":1299},{"style":101},[1300],{"type":45,"value":1301}," my-fn",{"type":39,"tag":88,"props":1303,"children":1304},{"style":117},[1305],{"type":45,"value":1306},"   # one function's logs\n",{"type":39,"tag":88,"props":1308,"children":1309},{"class":90,"line":370},[1310,1314,1318,1322,1326,1330,1334],{"type":39,"tag":88,"props":1311,"children":1312},{"style":95},[1313],{"type":45,"value":8},{"type":39,"tag":88,"props":1315,"children":1316},{"style":101},[1317],{"type":45,"value":1244},{"type":39,"tag":88,"props":1319,"children":1320},{"style":101},[1321],{"type":45,"value":1286},{"type":39,"tag":88,"props":1323,"children":1324},{"style":101},[1325],{"type":45,"value":777},{"type":39,"tag":88,"props":1327,"children":1328},{"style":101},[1329],{"type":45,"value":1286},{"type":39,"tag":88,"props":1331,"children":1332},{"style":101},[1333],{"type":45,"value":1291},{"type":39,"tag":88,"props":1335,"children":1336},{"style":117},[1337],{"type":45,"value":1338},"    # include deploy logs (sources combine)\n",{"type":39,"tag":88,"props":1340,"children":1341},{"class":90,"line":27},[1342,1346,1350,1355,1360],{"type":39,"tag":88,"props":1343,"children":1344},{"style":95},[1345],{"type":45,"value":8},{"type":39,"tag":88,"props":1347,"children":1348},{"style":101},[1349],{"type":45,"value":1244},{"type":39,"tag":88,"props":1351,"children":1352},{"style":101},[1353],{"type":45,"value":1354}," --since",{"type":39,"tag":88,"props":1356,"children":1357},{"style":101},[1358],{"type":45,"value":1359}," 24h",{"type":39,"tag":88,"props":1361,"children":1362},{"style":117},[1363],{"type":45,"value":1364},"                           # longer historical window\n",{"type":39,"tag":48,"props":1366,"children":1367},{},[1368,1374,1376,1381,1382,1387,1389,1395,1397,1404],{"type":39,"tag":84,"props":1369,"children":1371},{"className":1370},[],[1372],{"type":45,"value":1373},"--source",{"type":45,"value":1375}," accepts ",{"type":39,"tag":84,"props":1377,"children":1379},{"className":1378},[],[1380],{"type":45,"value":1215},{"type":45,"value":291},{"type":39,"tag":84,"props":1383,"children":1385},{"className":1384},[],[1386],{"type":45,"value":1223},{"type":45,"value":1388},", and ",{"type":39,"tag":84,"props":1390,"children":1392},{"className":1391},[],[1393],{"type":45,"value":1394},"deploy",{"type":45,"value":1396},". This is the documented CLI logs surface — reach for it before the dashboard, and see ",{"type":39,"tag":1398,"props":1399,"children":1401},"a",{"href":1400},"references\u002Fcli-commands.md",[1402],{"type":45,"value":1403},"CLI commands",{"type":45,"value":1405}," for more.",{"type":39,"tag":69,"props":1407,"children":1409},{"id":1408},"useful-commands",[1410],{"type":45,"value":1411},"Useful Commands",{"type":39,"tag":1413,"props":1414,"children":1415},"table",{},[1416,1435],{"type":39,"tag":1417,"props":1418,"children":1419},"thead",{},[1420],{"type":39,"tag":1421,"props":1422,"children":1423},"tr",{},[1424,1430],{"type":39,"tag":1425,"props":1426,"children":1427},"th",{},[1428],{"type":45,"value":1429},"Command",{"type":39,"tag":1425,"props":1431,"children":1432},{},[1433],{"type":45,"value":1434},"Description",{"type":39,"tag":1436,"props":1437,"children":1438},"tbody",{},[1439,1456,1472,1489,1506,1523,1540],{"type":39,"tag":1421,"props":1440,"children":1441},{},[1442,1451],{"type":39,"tag":1443,"props":1444,"children":1445},"td",{},[1446],{"type":39,"tag":84,"props":1447,"children":1449},{"className":1448},[],[1450],{"type":45,"value":1137},{"type":39,"tag":1443,"props":1452,"children":1453},{},[1454],{"type":45,"value":1455},"Run the build locally (mimics the Netlify build environment)",{"type":39,"tag":1421,"props":1457,"children":1458},{},[1459,1467],{"type":39,"tag":1443,"props":1460,"children":1461},{},[1462],{"type":39,"tag":84,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":45,"value":262},{"type":39,"tag":1443,"props":1468,"children":1469},{},[1470],{"type":45,"value":1471},"Draft deploy (preview URL)",{"type":39,"tag":1421,"props":1473,"children":1474},{},[1475,1484],{"type":39,"tag":1443,"props":1476,"children":1477},{},[1478],{"type":39,"tag":84,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":45,"value":1483},"netlify deploy --prod",{"type":39,"tag":1443,"props":1485,"children":1486},{},[1487],{"type":45,"value":1488},"Production deploy",{"type":39,"tag":1421,"props":1490,"children":1491},{},[1492,1501],{"type":39,"tag":1443,"props":1493,"children":1494},{},[1495],{"type":39,"tag":84,"props":1496,"children":1498},{"className":1497},[],[1499],{"type":45,"value":1500},"netlify deploy --dir=\u003Cdir>",{"type":39,"tag":1443,"props":1502,"children":1503},{},[1504],{"type":45,"value":1505},"Deploy a specific directory",{"type":39,"tag":1421,"props":1507,"children":1508},{},[1509,1518],{"type":39,"tag":1443,"props":1510,"children":1511},{},[1512],{"type":39,"tag":84,"props":1513,"children":1515},{"className":1514},[],[1516],{"type":45,"value":1517},"netlify clone org\u002Frepo",{"type":39,"tag":1443,"props":1519,"children":1520},{},[1521],{"type":45,"value":1522},"Clone, link, and set up in one step",{"type":39,"tag":1421,"props":1524,"children":1525},{},[1526,1535],{"type":39,"tag":1443,"props":1527,"children":1528},{},[1529],{"type":39,"tag":84,"props":1530,"children":1532},{"className":1531},[],[1533],{"type":45,"value":1534},"netlify open",{"type":39,"tag":1443,"props":1536,"children":1537},{},[1538],{"type":45,"value":1539},"Open the site in the Netlify dashboard",{"type":39,"tag":1421,"props":1541,"children":1542},{},[1543,1551],{"type":39,"tag":1443,"props":1544,"children":1545},{},[1546],{"type":39,"tag":84,"props":1547,"children":1549},{"className":1548},[],[1550],{"type":45,"value":1207},{"type":39,"tag":1443,"props":1552,"children":1553},{},[1554],{"type":45,"value":1555},"Recent function + edge-function logs (see Logs above)",{"type":39,"tag":69,"props":1557,"children":1559},{"id":1558},"related-skills",[1560],{"type":45,"value":1561},"Related skills",{"type":39,"tag":559,"props":1563,"children":1564},{},[1565,1603,1620],{"type":39,"tag":563,"props":1566,"children":1567},{},[1568,1572,1574,1579,1581,1587,1588,1594,1595,1601],{"type":39,"tag":54,"props":1569,"children":1570},{},[1571],{"type":45,"value":58},{"type":45,"value":1573}," — ",{"type":39,"tag":84,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":45,"value":608},{"type":45,"value":1580}," (build settings, redirects, headers, deploy contexts) and environment-variable management (",{"type":39,"tag":84,"props":1582,"children":1584},{"className":1583},[],[1585],{"type":45,"value":1586},"env:set",{"type":45,"value":291},{"type":39,"tag":84,"props":1589,"children":1591},{"className":1590},[],[1592],{"type":45,"value":1593},"env:get",{"type":45,"value":291},{"type":39,"tag":84,"props":1596,"children":1598},{"className":1597},[],[1599],{"type":45,"value":1600},"env:list",{"type":45,"value":1602},", context scoping).",{"type":39,"tag":563,"props":1604,"children":1605},{},[1606,1610,1612,1618],{"type":39,"tag":54,"props":1607,"children":1608},{},[1609],{"type":45,"value":65},{"type":45,"value":1611}," — framework adapter\u002Fplugin setup and local development (",{"type":39,"tag":84,"props":1613,"children":1615},{"className":1614},[],[1616],{"type":45,"value":1617},"netlify dev",{"type":45,"value":1619},", the Netlify Vite plugin).",{"type":39,"tag":563,"props":1621,"children":1622},{},[1623,1627],{"type":39,"tag":54,"props":1624,"children":1625},{},[1626],{"type":45,"value":905},{"type":45,"value":1628}," — restricting who can reach a site or its deploys.",{"type":39,"tag":69,"props":1630,"children":1632},{"id":1631},"references",[1633],{"type":45,"value":1634},"References",{"type":39,"tag":559,"props":1636,"children":1637},{},[1638,1645,1654],{"type":39,"tag":563,"props":1639,"children":1640},{},[1641],{"type":39,"tag":1398,"props":1642,"children":1643},{"href":1400},[1644],{"type":45,"value":1403},{"type":39,"tag":563,"props":1646,"children":1647},{},[1648],{"type":39,"tag":1398,"props":1649,"children":1651},{"href":1650},"references\u002Fdeployment-patterns.md",[1652],{"type":45,"value":1653},"Deployment patterns",{"type":39,"tag":563,"props":1655,"children":1656},{},[1657],{"type":39,"tag":1398,"props":1658,"children":1660},{"href":1659},"references\u002Fnetlify-toml.md",[1661],{"type":45,"value":1662},"netlify.toml guide",{"type":39,"tag":1664,"props":1665,"children":1666},"style",{},[1667],{"type":45,"value":1668},"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":1670,"total":1777},[1671,1687,1704,1719,1736,1751,1762],{"slug":905,"name":905,"fn":1672,"description":1673,"org":1674,"tags":1675,"stars":23,"repoUrl":24,"updatedAt":1686},"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},[1676,1679,1680,1683],{"name":1677,"slug":1678,"type":15},"Access Control","access-control",{"name":9,"slug":8,"type":15},{"name":1681,"slug":1682,"type":15},"Permissions","permissions",{"name":1684,"slug":1685,"type":15},"Security","security","2026-07-14T05:40:29.082149",{"slug":1688,"name":1688,"fn":1689,"description":1690,"org":1691,"tags":1692,"stars":23,"repoUrl":24,"updatedAt":1703},"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},[1693,1696,1699,1702],{"name":1694,"slug":1695,"type":15},"Agents","agents",{"name":1697,"slug":1698,"type":15},"Automation","automation",{"name":1700,"slug":1701,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},"2026-07-17T05:30:19.462913",{"slug":1705,"name":1705,"fn":1706,"description":1707,"org":1708,"tags":1709,"stars":23,"repoUrl":24,"updatedAt":1718},"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},[1710,1713,1716,1717],{"name":1711,"slug":1712,"type":15},"AI Infrastructure","ai-infrastructure",{"name":1714,"slug":1715,"type":15},"API Development","api-development",{"name":1700,"slug":1701,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:13.14555",{"slug":1720,"name":1720,"fn":1721,"description":1722,"org":1723,"tags":1724,"stars":23,"repoUrl":24,"updatedAt":1735},"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},[1725,1728,1731,1732],{"name":1726,"slug":1727,"type":15},"Backend","backend",{"name":1729,"slug":1730,"type":15},"File Storage","file-storage",{"name":9,"slug":8,"type":15},{"name":1733,"slug":1734,"type":15},"Storage","storage","2026-07-17T05:30:16.503306",{"slug":1737,"name":1737,"fn":1738,"description":1739,"org":1740,"tags":1741,"stars":23,"repoUrl":24,"updatedAt":1750},"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},[1742,1745,1746,1747],{"name":1743,"slug":1744,"type":15},"Caching","caching",{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":1748,"slug":1749,"type":15},"Performance","performance","2026-07-14T05:40:20.066717",{"slug":58,"name":58,"fn":1752,"description":1753,"org":1754,"tags":1755,"stars":23,"repoUrl":24,"updatedAt":1761},"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},[1756,1759,1760],{"name":1757,"slug":1758,"type":15},"Configuration","configuration",{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:21.284801",{"slug":1763,"name":1763,"fn":1764,"description":1765,"org":1766,"tags":1767,"stars":23,"repoUrl":24,"updatedAt":1776},"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},[1768,1769,1772,1773],{"name":1726,"slug":1727,"type":15},{"name":1770,"slug":1771,"type":15},"Database","database",{"name":9,"slug":8,"type":15},{"name":1774,"slug":1775,"type":15},"PostgreSQL","postgresql","2026-07-20T05:58:58.934045",15,{"items":1779,"total":1889},[1780,1795,1805,1812,1819,1826,1833,1840,1846,1853,1860,1874],{"slug":1781,"name":1781,"fn":1782,"description":1783,"org":1784,"tags":1785,"stars":1792,"repoUrl":1793,"updatedAt":1794},"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},[1786,1787,1788,1791],{"name":1694,"slug":1695,"type":15},{"name":1757,"slug":1758,"type":15},{"name":1789,"slug":1790,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},32,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Faxis","2026-07-20T05:59:47.468757",{"slug":1796,"name":1796,"fn":1797,"description":1798,"org":1799,"tags":1800,"stars":1792,"repoUrl":1793,"updatedAt":1804},"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},[1801,1802,1803],{"name":13,"slug":14,"type":15},{"name":1789,"slug":1790,"type":15},{"name":9,"slug":8,"type":15},"2026-07-14T05:40:13.443461",{"slug":905,"name":905,"fn":1672,"description":1673,"org":1806,"tags":1807,"stars":23,"repoUrl":24,"updatedAt":1686},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1808,1809,1810,1811],{"name":1677,"slug":1678,"type":15},{"name":9,"slug":8,"type":15},{"name":1681,"slug":1682,"type":15},{"name":1684,"slug":1685,"type":15},{"slug":1688,"name":1688,"fn":1689,"description":1690,"org":1813,"tags":1814,"stars":23,"repoUrl":24,"updatedAt":1703},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1815,1816,1817,1818],{"name":1694,"slug":1695,"type":15},{"name":1697,"slug":1698,"type":15},{"name":1700,"slug":1701,"type":15},{"name":9,"slug":8,"type":15},{"slug":1705,"name":1705,"fn":1706,"description":1707,"org":1820,"tags":1821,"stars":23,"repoUrl":24,"updatedAt":1718},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1822,1823,1824,1825],{"name":1711,"slug":1712,"type":15},{"name":1714,"slug":1715,"type":15},{"name":1700,"slug":1701,"type":15},{"name":9,"slug":8,"type":15},{"slug":1720,"name":1720,"fn":1721,"description":1722,"org":1827,"tags":1828,"stars":23,"repoUrl":24,"updatedAt":1735},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1829,1830,1831,1832],{"name":1726,"slug":1727,"type":15},{"name":1729,"slug":1730,"type":15},{"name":9,"slug":8,"type":15},{"name":1733,"slug":1734,"type":15},{"slug":1737,"name":1737,"fn":1738,"description":1739,"org":1834,"tags":1835,"stars":23,"repoUrl":24,"updatedAt":1750},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1836,1837,1838,1839],{"name":1743,"slug":1744,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":1748,"slug":1749,"type":15},{"slug":58,"name":58,"fn":1752,"description":1753,"org":1841,"tags":1842,"stars":23,"repoUrl":24,"updatedAt":1761},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1843,1844,1845],{"name":1757,"slug":1758,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":1763,"name":1763,"fn":1764,"description":1765,"org":1847,"tags":1848,"stars":23,"repoUrl":24,"updatedAt":1776},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1849,1850,1851,1852],{"name":1726,"slug":1727,"type":15},{"name":1770,"slug":1771,"type":15},{"name":9,"slug":8,"type":15},{"name":1774,"slug":1775,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1854,"tags":1855,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1856,1857,1858,1859],{"name":13,"slug":14,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"slug":1861,"name":1861,"fn":1862,"description":1863,"org":1864,"tags":1865,"stars":23,"repoUrl":24,"updatedAt":1873},"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},[1866,1868,1871,1872],{"name":1867,"slug":1223,"type":15},"Edge Functions",{"name":1869,"slug":1870,"type":15},"Middleware","middleware",{"name":9,"slug":8,"type":15},{"name":1748,"slug":1749,"type":15},"2026-07-14T05:40:34.147865",{"slug":1875,"name":1875,"fn":1876,"description":1877,"org":1878,"tags":1879,"stars":23,"repoUrl":24,"updatedAt":1888},"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},[1880,1883,1886,1887],{"name":1881,"slug":1882,"type":15},"Forms","forms",{"name":1884,"slug":1885,"type":15},"HTML","html",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"2026-07-14T05:40:16.075367",17]