netlify-deploy
Deploy and manage web projects on Netlify through Git continuous deployment, the CLI, Deploy Previews, and branch deploys.
Identity proven by GitHub's verified organisation badge (netlify)
- Agents
- Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode, claude.ai and API
- License
- MIT (permissive)
- Pin
- b5894c0pinned Oct 9, 2026
- Context cost
- about 3,300 tokenswhen the skill loads
- GitHub stars
- 39on netlify/context-and-tools
- Scripts
- None found
What it does
“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".”
Generated summary from the skill's own text
Deploy and manage web projects on Netlify through Git continuous deployment, the CLI, Deploy Previews, and branch deploys. The skill covers setting up netlify.toml config files, handling deployment contexts, creating Deploy to Netlify buttons, managing deploy states, and fixing failed deploys without rollbacks.
When to use it
- Setting up Git-based continuous deployment on Netlify
- Configuring per-branch or per-context build commands in netlify.toml
- Creating Deploy Previews or branch deploys for pull requests
- Adding a Deploy to Netlify button to a template repository
When not to
- Rolling back or restoring a previous deploy to production
- Silencing real security vulnerabilities flagged by secrets scanning
- Setting production environment variables directly in netlify.toml
Install
These commands install from the publisher's repository and need no account.
skills CLI
npx skills add netlify/context-and-tools --skill netlify-deployInstalls from the repository's default branch, which may have changed since the commit we checked.
GitHub CLI 2.90 or later
gh skill install netlify/context-and-tools netlify-deploy@b5894c0e1c16d924dd5b28546b11c2de650fce7eInstalls the commit we checked (b5894c0).
Copy by hand
Download the folder at b5894c0 and put it in .claude/skills/netlify-deploy for Claude Code and in .agents/skills/netlify-deploy for Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode.
Claude Code plugin
/plugin install netlify-skills@claude-plugins-officialThe publisher's plugin in Claude's official marketplace. It may hold more than this skill, and we have not pinned it.
Copy for your agent
A prompt for any coding agent. It installs this skill from GitHub at the pinned commit, copies the files as they are, and runs nothing unless you ask.
Prompt
Install the agent skill "netlify-deploy" by Netlify. Source, pinned to commit b5894c0e1c16d924dd5b28546b11c2de650fce7e: https://github.com/netlify/context-and-tools/tree/b5894c0e1c16d924dd5b28546b11c2de650fce7e/agent-plugin/skills/netlify-deploy 1. Download that folder at exactly this commit. Do not use the default branch. 2. Copy every file unchanged, keeping the folder structure, into .claude/skills/netlify-deploy/ for Claude Code and .agents/skills/netlify-deploy/ for Codex, Cursor, Gemini CLI, GitHub Copilot and OpenCode. Create the folders if they do not exist. 3. Do not edit the files, and do not run any script in the folder unless I ask you to. 4. When you are done, list the files you copied and where you put them. Listing and checks: https://www.agentnative.dev/skills/netlify/netlify-deploy
SKILL.md at the pin
---
name: netlify-deploy
description: 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".
---
# Netlify deploy
## Modern CLI
```bash
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. A deploy can be a preview or a production version served at your primary domain.
**Continuous deployment vs manual deploys:** Deploy with Git and the Netlify CLI support continuous deployment — a push auto-triggers a build. Drag and drop and the API create one-off manual deploys. 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.
## Ways to create a deploy
- **Git CD** — connect a repo; Netlify builds and deploys on every push (OAuth2 or the Netlify GitHub App). This is the default path.
- **CLI** — `netlify create`, `netlify deploy`, `netlify deploy --prod`.
- **Drag and drop** — https://app.netlify.com/drop. Logged in: builds if needed. Not logged in: publishes files as-is.
- **API** — create deploys via file digest or ZIP (one-off manual).
- **Deploy to Netlify button** — one-click from a public template repo.
- **Build hooks** — unique URLs that trigger builds. (Deploys from build hooks are treated as trusted and bypass the deploy request policy.)
- **AI agents** — Agent Runners (Claude Code, OpenAI Codex, Google Gemini) from the dashboard; every file-changing run auto-generates a Deploy Preview at `agent-<runID>--<site>.netlify.app`. The inline preview shown next to the prompt is the same Deploy Preview available at that URL.
- **Zapier / n8n** — automation integrations.
Not sure which path? The Deploy Navigator gives personalized recommendations: https://docs.netlify.com/start/choose-your-path#deploy-navigator (also embedded on the create-deploys page as "Not sure where to start?").
## netlify.toml deploy contexts
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.
```toml
[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 Previews & branch deploys
- **Deploy Previews** auto-build for PRs/MRs (GitHub, GitLab, Bitbucket, Azure DevOps, Cursor Origin) and agent runs. The base branch must be a production branch or a branch-deploy-enabled branch. URL: `deploy-preview-<num>--<site>.netlify.app`. While the first deploy is pending the URL returns `Not Found`.
- **Branch deploys** require setup: Project configuration > Developer settings > Continuous deployment > Branches and deploy contexts > Configure. Enable specific branches (prefix wildcard `features/*` supported) or **All** new branches. URL: `<branch>--<site>.netlify.app`.
- A branch-deploy branch with an open PR yields **both** a Deploy Preview and a branch deploy.
- **Entry path:** put `@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 a deploy:** `[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.
## Locking, skipping, and manual production deploys
- **Lock** (disable auto publishing): Deploys list > **Lock to stop auto publishing**. New deploys still build but are not published. Unlock to resume.
- **⚠ Manual `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.
## Managing deploys
- **Find:** Deploys tab (Developer or Team Owner); search by deploy ID or branch name; filter by time frame, deploy context, and status.
- **Cancel:** on the in-progress deploy's detail page, **Cancel deploy** > **Yes, cancel deploy**.
- **Retry:** builds from the branch HEAD (optionally clearing cache) — if HEAD moved past the original deploy SHA, it still builds from HEAD.
- **Download:** on a successful deploy's detail page — a single file via **Deploy file browser**, or all files as a ZIP via the header **Download** > **Download ready**.
- **Delete:** Developer or Team Owner only. You cannot delete the deploy most recently published to the site's main URL, or one still in progress. Deletion is permanent and does not reduce team costs or preserve build minutes.
## Deploy to Netlify button
Template code must be in a **public** repo on **GitHub.com or GitLab.com**.
Markdown:
```md
[](https://app.netlify.com/start/deploy?repository=https://github.com/netlify/netlify-statuskit)
```
URL variants (base link `https://app.netlify.com/start/deploy`):
```txt
# 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`:
```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.
## Secrets scanning failures
**⚠ 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`.
## Fixing a failed deploy — no rollbacks
**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 — this diagnosis and its suggested solution do **NOT** consume credits. Selecting **Fix with agent** starts an agent run, which **DOES** consume credits from your team's balance. See https://docs.netlify.com/resources/troubleshooting/fix-a-failed-deploy/.
## Deploy permissions (private repos)
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.
## Constraints & gotchas
- **Files per directory: 54,000.** Any directory over this in the publish dir fails the deploy. No limit on total files per deploy.
- **Skew protection:** all plans; **production context only** — branch deploys, Deploy Previews, and permalinks bypass it and serve the latest deploy. Needs Netlify CLI 23.11.0+. Astro 5.15.0+ enables it by default via the Netlify Adapter; Next.js is opt-in. Password protection on production deploys (or on all deploys) turns skew protection off — it only works when you protect non-production deploys only. Netlify discards skew protection signals on hard navigation (`Sec-Fetch-Mode: navigate`, or `Sec-Fetch-Site` present and not `same-origin`). Framework maintainers add support via `netlify/v1/skew-protection.json`.
- **Search indexing:** only the published production deploy and most recent branch deploys are indexable; previews and old deploys get `X-Robots-Tag: noindex`.
- **Preview URL visibility:** Deploy Preview / branch deploy URLs are shareable with anyone holding the link unless you add password or team-login protection.
- **New-project visibility:** on Credit-based plans with "private by default", new projects start private regardless of how they're created.
- **Automatic deletion:** deploys are deleted after 30 days (90 days on paid plans); Enterprise can raise this up to 365 days. Never deleted: the published deploy, the most recent successful production deploy, and the most recent successful branch deploy per branch. Configure at Project configuration > Developer settings > Automatic Deletion.
See `references/cli-commands.md` for the full CLI surface and flags.
<!-- Retention period for failed/canceled deploys is stated inconsistently in sources (30/90 days vs 6 months); used the 30/90-day figure. -->
<!-- system: agent-context/deploy/system.md — human-owned, merged by ctx-gen; edit system.md, not this section -->
# Netlify house rules (deploy)
These are org conventions, not docs facts — merged into the rendered skill by
ctx-gen and never generated. Owned by the skills maintainer.
1. Agents do not roll back deploys: never call `restoreSiteDeploy` or
`publishDeploy` to restore an older deploy. Fix forward — revert the
commit and let CI deploy it.
2. A failed deploy never publishes; on failure there is nothing to roll
back.
3. Deep guides live in this skill: `references/netlify-toml.md`,
`references/cli-commands.md`, `references/deployment-patterns.md`.
4. The frontmatter description must never advertise rollback or restore as a
capability — no "roll back", "restore a deploy", or equivalent.
5. When the user asks to roll back or restore a previous deploy, correct the
premise rather than complying: after a failed deploy the previous deploy
is still live and there is nothing to restore; for a bad published deploy,
fix forward per rule 1. Do not hand over `restoreSiteDeploy` /
`publishDeploy` or a dashboard rollback as the answer.
6. Always add `.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.
7. Secrets-scanning deploy failures: if the flagged value is a real secret,
that is a leak — stop shipping it in client/published output and rotate
it; never silence the scanner over a real leak. For genuinely non-secret
values, scope narrowly with `SECRETS_SCAN_OMIT_KEYS` /
`SECRETS_SCAN_OMIT_PATHS`, never `SECRETS_SCAN_ENABLED=false`.
8. Before running a manual `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.
9. Deploy-to-Netlify buttons: template configuration (incoming hooks,
template env vars) is only read from the repository ROOT. When a
button targets a subdirectory via `base`, state this limitation
explicitly — do not leave it implied.
From netlify/context-and-tools at b5894c0, shown as plain text under its license: MIT (permissive). The license text is in agent-plugin/LICENSE.
View SKILL.md on GitHub at b5894c0Files
- SKILL.md14 KB · 70ee386212e6
- references/
- cli-commands.md3.5 KB · ee13906271ce
- deployment-patterns.md5.2 KB · 30500141db7d
- netlify-toml.md2.8 KB · 0020510798bf
4 files, 25 KB in total. Each file has a sha256 in the pin's manifest; the first 12 characters are shown.
Skill folder on GitHub at b5894c0Also in
The same SKILL.md content appears in these places too. We list it once and credit the oldest public source.
More from Netlify
test-skill
This skill computes an AXIS Result by weighting three metrics: task completion at 60 percent, efficiency at 30 percent, and resilience at 10 percent.
Claude Code, Codex, Cursor +4 · about 120 tokens · pinned 6 days ago
using-axis
This skill teaches an agent how to run AXIS, a synthetic testing framework for AI agents, and interpret its output.
Claude Code, Codex, Cursor +4 · about 4.9K tokens · pinned 6 days ago
netlify-access-control
This skill routes users to the correct Netlify site-protection layer for their access-control need and clarifies the three distinct authentication concepts…
Claude Code, Codex, Cursor +4 · about 2.9K tokens · pinned 6 days ago
netlify-agent-runner
Run AI agents remotely on Netlify infrastructure to automate development tasks against your site's repository.
Claude Code, Codex, Cursor +4 · about 2.6K tokens · pinned 6 days ago
netlify-ai-gateway
Calls OpenAI, Anthropic Claude, Google Gemini, TypeSafe, or OpenRouter-hosted models from Netlify Functions and Edge Functions using each provider's official…
Claude Code, Codex, Cursor +4 · about 3.3K tokens · pinned 6 days ago
netlify-blobs
Store and retrieve unstructured files, objects, and cached data on Netlify using the @netlify/blobs module from Functions, Edge Functions, or Build Plugins.
Claude Code, Codex, Cursor +4 · about 2.9K tokens · pinned 6 days ago
Related in Cloud and DevOps
netlify-caching
This skill enables caching of dynamic responses from Netlify Functions and Edge Functions on Netlify's CDN.
by NetlifyOfficial publisher
Claude Code, Codex, Cursor +4 · about 3.6K tokens · pinned 6 days ago
netlify-config
This skill configures Netlify builds and deployments via netlify.toml, _redirects, and _headers files at the repository root.
by NetlifyOfficial publisher
Claude Code, Codex, Cursor +4 · about 3.9K tokens · pinned 6 days ago
netlify-frameworks
Deploy and configure web frameworks on Netlify with build settings, SSR adapters, and environment variable management.
by NetlifyOfficial publisher
Claude Code, Codex, Cursor +4 · about 3.5K tokens · pinned 6 days ago
n8n-cli
This skill enables agents to manage n8n workflows, credentials, executions, and instance resources via the n8n CLI command-line tool.
by n8nOfficial publisher
Claude Code, Codex, Cursor +4 · about 2.9K tokens · pinned 6 days ago
managing-streamlit-apps
Manage Streamlit apps running in PostHog sandboxes through the full lifecycle: create, set or edit source code, start and stop the sandbox, poll status, and…
by PostHogOfficial publisher
Claude Code, Codex, Cursor +4 · about 1.4K tokens · pinned 6 days ago
release-candidate-prep
Prepares a local Python SDK release candidate in a dedicated Git worktree when explicitly invoked with a version number.
by OpenAIOfficial publisher
Contains scripts
Claude Code, Codex, Cursor +3 · about 4.8K tokens · pinned 6 days ago