Deploy web projects to Netlify using the Netlify CLI (`npx netlify`). Use when the user asks to deploy, host, publish, or link a site/repo on Netlify, including preview and production deploys.
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=true
File-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.skillbazaar install netlify-deploy --agent claudeSign in (free) to install skills with the CLI.
Author
@netlify
on GitHub
Published by