Create, configure, and manage Netlify deploys from code — reach for this when setting up Git continuous deployment, running netlify deploy or netlify deploy --prod from the CLI, writing netlify.toml deploy contexts, adding a Deploy to Netlify button, wiring build hooks, configuring Deploy Previews or branch deploys, locking or skipping deploys, fixing a failed or secrets-scanning deploy, or when someone asks to "deploy my site", "set up preview deploys", "add per-branch build config", or "add a deploy button to my README".
The canonical home for this skill is netlify-deploy in netlify/context-and-tools
netlify deploy # manual draft deploy (no CI)
netlify deploy --prod # deploy straight to production
netlify create # new project from a natural-language prompt
netlify deploy --allow-anonymous # temp project, claim within 1 hour
npm update -g netlify-cli # skew protection needs 23.11.0+A deploy is a versioned, atomic snapshot: Netlify uploads only changed files and switches the live site only after all files land — the site is never in an inconsistent state. Manual deploys (netlify deploy) do not run a build command; drag-and-drop while logged in is the only exception (framework auto-detected).
⚠ When linking or creating a site, add .netlify to .gitignore. Every linking path writes .netlify/state.json, which must not be committed.
netlify create, netlify deploy, netlify deploy --prod.agent-<runID>--<site>.netlify.app.At the repo root. File config overrides UI settings. Five predefined contexts: production, deploy-preview, branch-deploy, preview-server, dev. Branch names also work as custom contexts; more specific contexts override general ones.
[context.production]
command = "make production"
[context.production.environment]
ACCESS_TOKEN = "super secret"
[[context.production.plugins]] # plugins REQUIRE double brackets
package = "@netlify/plugin-sitemap"
[context.deploy-preview.environment]
ACCESS_TOKEN = "not so secret"
[context.branch-deploy]
command = "make staging"
[context.dev.environment]
NODE_ENV = "development"
[context."features/branch"] # quote slashed branch names
command = "gulp"⚠ Environment variables set in netlify.toml are NOT available to the deploy environment — set them via UI/CLI/API. netlify.toml is committed, so keep sensitive values out of it; use per-context env vars via UI/CLI/API instead.
See references/netlify-toml.md for the full context precedence rules and references/deployment-patterns.md for context strategy.
deploy-preview-<num>--<site>.netlify.app. While the first deploy is pending the URL returns Not Found.features/* supported) or All new branches. URL: <branch>--<site>.netlify.app.@netlify /some/path in the PR/MR description, then push a new commit to regenerate. Once set in the PR, you can't change it in the Netlify Drawer.[skip ci] or [skip netlify] — in the PR/MR title to skip the Deploy Preview; anywhere in the commit message to skip a branch/production deploy. Next unmarked commit deploys all skipped changes.netlify deploy --prod on a Git-CD site: the next push to the production branch silently replaces your hand-shipped deploy. Warn the user; lock the published deploy if it must stay live.Template code must be in a public repo on GitHub.com or GitLab.com.
Markdown:
[](https://app.netlify.com/start/deploy?repository=https://github.com/netlify/netlify-statuskit)URL variants (base link https://app.netlify.com/start/deploy):
# require/pre-fill env vars (hash, client-side only; values may be null)
...?repository=<repo>#SECRET_TOKEN=specialuniquevalue&CUSTOM_LOGO=
# monorepo base dir (whole repo cloned, builds from blog/)
...?repository=<repo>&base=blog
# clone only a subdirectory
...?repository=<repo>&create_from_path=examples/hello
# deploy a specific branch (sets it as production branch)
...?repository=<repo>&branch=beta-feature
# install required SDK extensions before first deploy
...?repository=<repo>&fullConfiguration=trueFile-based template config, [template] in the repo root netlify.toml:
[template]
incoming-hooks = ["Contentful"]
required-extensions = ["supabase"]
[template.environment]
SECRET_TOKEN = "change me for your secret token"
CUSTOM_LOGO = "set the url to your custom logo here"You cannot set env var values or a base directory in [template] — use URL params. [template.environment] placeholder strings are only UI labels.
⚠ Template configuration (incoming hooks, template env vars) is read ONLY from the repository ROOT. When the button targets a subdirectory via base, the base-directory netlify.toml takes precedence for builds, but template config there is ignored. State this limitation explicitly rather than leaving it implied.
⚠ A secrets-scanning deploy failure means a value that looks like a secret reached your build output. If it's a real secret, that's a leak — stop shipping it in client/published output and rotate it. Never set SECRETS_SCAN_ENABLED=false to silence the scanner over a real leak. For genuinely non-secret values, scope narrowly with SECRETS_SCAN_OMIT_KEYS / SECRETS_SCAN_OMIT_PATHS.
A failed deploy never publishes — the previous deploy is still live, so there is nothing to restore. If someone asks to roll back or restore a previous deploy, correct the premise: after a failed deploy nothing changed, and for a bad published deploy, fix forward — revert the commit and let CI redeploy it. Do not call restoreSiteDeploy or publishDeploy, and do not hand over a dashboard rollback as the answer.
Netlify surfaces a "Why did it fail?" AI diagnosis above the deploy log. See https://docs.netlify.com/resources/troubleshooting/fix-a-failed-deploy/.
Netlify only builds changes pushed to private repos from recognized authors (Owners, Developers, Git Contributors; Marketplace bots count). An unrecognized author's merge shows Pending approval; a Team Owner must associate them with a team account before the build starts. Build-hook deploys are exempt.
Sec-Fetch-Mode: navigate, or Sec-Fetch-Site present and not same-origin). Framework maintainers add support via netlify/v1/skew-protection.json.X-Robots-Tag: noindex.See references/cli-commands.md for the full CLI surface and flags.
These are org conventions, not docs facts — merged into the rendered skill by ctx-gen and never generated. Owned by the skills maintainer.
restoreSiteDeploy or
publishDeploy to restore an older deploy. Fix forward — revert the
commit and let CI deploy it.references/netlify-toml.md,
references/cli-commands.md, references/deployment-patterns.md.restoreSiteDeploy /
publishDeploy or a dashboard rollback as the answer..netlify to .gitignore when linking or creating a site —
every linking path writes .netlify/state.json, which must not be
committed. Mention it whenever you link.SECRETS_SCAN_OMIT_KEYS /
SECRETS_SCAN_OMIT_PATHS, never SECRETS_SCAN_ENABLED=false.netlify deploy --prod on a site with Git CD
connected, warn the user that the next push to the production branch
silently replaces the hand-shipped deploy; suggest locking the published
deploy if it must stay live.base, state this limitation
explicitly — do not leave it implied.0830047
Canonical home
since May 18, 2026
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.