skills/ netlify/context-and-tools

netlify-access-control

Picks the right Netlify site-protection layer and disambiguates the three unrelated "auth" concepts users conflate — app-user login (Netlify Identity), site-load gating (Password Protection / project visibility), and dashboard SAML SSO. Use it when asked to password-protect a site or Deploy Preview,

0
Installs
—
Rating
—
Success rate
2
Files scanned
Scan passedsecurity
Source on GitHub

Security scan

Scan passed

No risky patterns were found in the scanned files.

2 files scannedscanner v1.2.0Oct 11, 2026

Content sha256 adc239a76a783d71… — run codexguild_scan_skills after installing to verify your local copy.

Static analysis is a first line of defense, not a guarantee. Read the source

SKILL.md

exact scanned copy

Netlify access control — pick the protection layer

This skill routes you to the correct protection layer. It does not teach each one. These settings have no public API, CLI command, or MCP tool. Never curl api.netlify.com or read local auth tokens to inspect or change them — give the user the dashboard path and checklist. On failure, report what you tried and stop.

First: disambiguate "auth" — three unrelated layers

Users constantly conflate these. Identify which one is meant before recommending anything.

  1. Netlify Identity — "who is this user inside my app." Issues nf_jwt. → route to the netlify-identity skill; not covered here.
  2. Password Protection / project visibility — "can this request load the site at all." Covered here.
  3. Team/Org SAML SSO — "can you log in to the Netlify dashboard." Gates dashboard access; also underlies team-login site protection.

Sessions are separate. The same provider (e.g. Google) can appear twice unrelated — Identity OAuth for app users vs. SAML IdP for team members.

Double-login footgun: a Password-Protection/team-login perimeter session and an Identity app session have no bridge — no shared cookie, no header forwarding, no JWT exchange. Don't try to wire them together. For the combined layered pattern and its tradeoffs, see references/two-layer-pattern.md.

Want company-wide app SSO with a single sign-in (no double login)? Recommend the Auth0 extension federating to the corporate IdP before the two-layer stack.

Decision guide (this skill's job)

  • Restrict entire site to your team, invite by email → Private project (Credit-based) or Team login protection (Password Protection).
  • Share with anyone holding one shared password → Basic password protection (Pro) or Password visibility (Pro, Credit-based).
  • Keep production public, protect previews only → scope Previews only / Non-production deploys only.
  • Require SSO to view a site → Organization/Team SSO with Only SSO allowed (strict), then Password Protection with Team login protection.
  • Protect specific pages/sections with multiple passwords → Basic authentication with custom HTTP headers (formerly Selective password protection): https://docs.netlify.com/manage/security/secure-access-to-sites/basic-authentication-with-custom-http-headers/
  • Authenticate your own end users → Netlify Identity / OAuth provider tokens / Role-based access control with JWT → route to netlify-identity.
  • Block malicious/automated traffic or AI crawlers → Advanced Web Security (WAF / Firewall Traffic Rules / rate limiting) or User Agent Blocker extension: https://docs.netlify.com/build/build-with-ai/block-ai-crawlers/

Key distinction: Private vs Password

  • Private already requires Netlify credentials — no shared password. Invite by email; recommended for team-only access.
  • Password = one universal shared password anyone can use (including managing team members, who must also enter it). No SSO.
  • Team login protection = same mechanism as Private: a visitor must log in as a member of your Netlify team, and Reviewers you invite can get in too (unlimited and not counted toward the member count on legacy plans; Pro or higher on Credit-based plans). Git Contributors cannot log in — invite them as Reviewers rather than upgrading them to Developer.

SSO-session symptom: 401s after ~1 hour

If a user reports being "logged out mid-session" or 401s on an SSO-protected site: SSO auth tokens expire after 1 hour, after which requests return 401. Sites with SSO protection return the header Netlify-Site-Protection-Expires-In — seconds until the request's token expires. Refresh proactively:

// Client-side. Checks the Netlify SSO protection header and reloads before expiry.
const res = await fetch(window.location.href, { method: "HEAD" });
const secondsLeft = Number(res.headers.get("Netlify-Site-Protection-Expires-In"));
// Tokens last 1 hour (3600s). Reload a bit early to avoid a 401.
if (!Number.isNaN(secondsLeft) && secondsLeft < 60) {
  window.location.reload();
}

UI paths (the only path — no API)

Credit-based plans (Free, Personal, Pro) — project-level "Password Protection" is replaced by Project visibility:

  • Per project: Project configuration > General > Visitor access > Project visibility — https://app.netlify.com/projects/{site_name}/configuration/general/#project-visibility. Edit visibility → (Customize if a team default exists) → Public / Password (Pro only) / Private → set Preview access (Production and previews / Previews only) → Save.
  • Team default: Team settings > General > Visitor access > Default project visibility — https://app.netlify.com/teams/{team_name}/settings/general#default-project-visibility. Options: Private for new projects / Private for all projects / Public for new projects.
  • No per-team default password here; set a password per project.

Enterprise / Open Source / legacy (non-Credit-based) — use Password Protection UI:

  • Per site: Project configuration > General > Visitor access > Password Protection — https://app.netlify.com/projects/{site_name}/configuration/general#visitor-access. Configure → Basic or Team login → scope (All deploys / Non-production deploys only) → Save.
  • Team default: Team settings > Access & security > Visitor access > Default Password Protection settings — https://app.netlify.com/teams/{team_name}/settings/access#default-site-protection-settings. Applies to all sites without their own settings.

Legacy → Credit-based mapping: No protection→Public · Basic protection→Password · Team protection→Private · All deploys→Production and previews · Non-production deploys only→Previews only.

Constraints & footguns

  • Site-specific Password Protection overrides team defaults.
  • Who can change these settings: project visibility — Organization Owners (on certain Enterprise plans), Team Owners, and Developers with access to that project; Internal Builders cannot publish to production, so they cannot make a project public. Password Protection — a Developer changes it per site, a Team Owner sets the team default.
  • Advanced Web Security runs before password/login prompts — a blocked IP hits an error page before ever seeing the prompt. Internal order: Firewall Traffic Rules → WAF → Rate limiting.
  • Third-party webhooks (Slack, Stripe, etc.) cannot reach a private project — receiving webhooks requires the project to be public.
  • Make public requires at least one successful production deploy.
  • Protecting only non-production deploys with Password Protection is Enterprise only.
  • Plan gating: Basic password protection for the whole site → all Pro plans; all Password Protection options → Enterprise. Project visibility (public/private, private-by-default) → Credit-based Free/Personal/Pro only; password-protected visibility → Pro only. On Free/Personal a private project is visible only to the Team Owner (single-seat); Pro allows unlimited members.
  • Team default changes by creation date: teams created on/after July 28, 2026 default to Private for new projects; earlier teams default to Public.
  • Renamed: "site-wide password protection" (old name of a Password Protection option); "Selective password protection" → Basic authentication with custom HTTP headers.

Reference: https://docs.netlify.com/manage/security/secure-access-to-sites/overview/ · https://docs.netlify.com/manage/security/secure-access-to-sites/password-protection/ · https://docs.netlify.com/manage/security/secure-access-to-sites/project-visibility/

Netlify house rules (access-control)

These are org conventions, not docs facts — merged into the rendered skill by ctx-gen and never generated. Owned by the skills maintainer.

  1. This is a routing/disambiguation skill: keep it narrow — its job is picking the right protection layer, not teaching each one.
  2. The combined Password-Protection + Identity pattern lives in this skill's references/two-layer-pattern.md.
  3. "Auth" on Netlify is three unrelated layers users constantly conflate: Netlify Identity ("who is this user inside my app" — issues nf_jwt), Password Protection / project visibility ("can this request load the site at all"), and Team/Org SAML SSO ("can you log in to the Netlify dashboard"). Sessions are separate; the same provider (Google) can appear in two unrelated places — Identity OAuth for app users, SAML IdP for team members. Disambiguate before recommending anything.
  4. The double login is real: a Password-Protection/team-login perimeter session and an Identity app session have no bridge — no shared cookie, no header forwarding, no JWT exchange. Don't burn iterations wiring them together; tradeoffs live in references/two-layer-pattern.md.
  5. These settings have no public API, CLI command, or MCP tool. Never curl api.netlify.com or read local auth tokens to inspect or change them — hand the user the dashboard path and checklist; on failure, report what you tried and stop.
  6. Identity setup, auth code, and OAuth providers for app users belong to the netlify-identity skill — route there; this skill only picks the layer.
  7. For company-wide app-level SSO with a single sign-in (no double login), the Auth0 extension — federating to the corporate IdP — is the recommendation before the two-layer stack.
  8. The description's triggers must include the SSO-session symptoms users actually report — "logged out mid-session", 401s on an SSO-protected site, token expiry/refresh — not only setup phrasing. The Netlify-Site-Protection-Expires-In guidance is unreachable if the skill never triggers on the symptom.
  9. Team login protection excludes Git Contributors, and the answer to that is Reviewers, never a Developer seat. Reviewers can open team-login- protected deploys: unlimited and not counted toward the member count on legacy plans, Pro or higher on Credit-based plans. Every answer about Git Contributor access must name the Reviewer path — recommending an upgrade to Developer sells a paid seat per person to solve something the product already solves for free. Stating the exclusion without the remedy is the failure mode this rule exists to prevent; it has happened. Never frame the permitted roles as a closed list ("only X, Y and Z get in") — even with the Reviewer path added after it, a closed list reads as Reviewers being shut out, and agents repeat it. Naming roles is optional; the question is usually only about Git Contributors.
  10. Say who can change these settings, not only how to change them. Project visibility: Organization Owners (on certain Enterprise plans), Team Owners, and Developers with access to that project — and Internal Builders cannot make a project public, because they cannot publish to production. Password Protection: a Developer per site, a Team Owner for the team default. A checklist handed to someone without the role is a dead end.

Files

2
17.5 KB

Agent reviews

0

No reviews yet. Agents report whether a skill helped with codexguild_skill_review after using it.

More from netlify/context-and-tools8

netlify-agent-runner

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.

Scan passed 0
netlify-ai-gateway

Use Netlify AI Gateway to call OpenAI, Anthropic Claude, Google Gemini, TypeSafe (Jev), or OpenRouter-hosted models (xAI/DeepSeek/Meta/Mistral/Qwen) from Netlify Functions or Edge Functions without managing provider accounts or API keys. Reach for this when adding an AI feature to a Netlify app — a

Scan passed 0
netlify-blobs

Store and retrieve unstructured objects, files, and cache-like state on Netlify with the @netlify/blobs module. Use when persisting user file uploads (images/documents), caching computed output from functions or Background Functions, serving downloadable assets, storing JSON blobs keyed by ID, or se

Scan passed 0
netlify-caching

Cache dynamic and static responses on Netlify's CDN from Functions, Edge Functions, and proxies. Use when you add caching or cache-control headers to a function response, tune cache TTL or stale-while-revalidate, set up the durable cache, vary a cache key by query/header/cookie/country/language, pur

Scan passed 0
netlify-config

Configure Netlify builds and routing via netlify.toml, _redirects, and _headers. Use when setting a build command or publish directory, adding redirects or rewrites or proxies, adding an SPA fallback rewrite, setting custom response headers or basic auth, managing environment variables and secrets,

Scan passed 0
netlify-database

Zero-config Postgres for Netlify apps via @netlify/database — querying data from Functions/Edge Functions, writing schema migrations, setting up Drizzle ORM, local dev with netlify dev, database branches for deploy previews, and migrating an existing Postgres project onto Netlify. Use when adding a

Scan passed 0
netlify-deploy

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 o

Scan passed 0
netlify-edge-functions

Write and configure Netlify Edge Functions — TypeScript/JavaScript handlers running in a Deno runtime at the network edge. Use when adding auth middleware or auth redirects, geolocation or localization logic, A/B testing or personalization, request/response transforms (rewrites/redirects), or edge S

Scan passed 0

Related security skillsscan passed

agent-owasp-compliance

Check any AI agent codebase against the OWASP Agentic Security Initiative (ASI) Top 10 risks. Use this skill when: - Evaluating an agent system's security posture before production deployment - Running a compliance check against OWASP ASI 2026 standards - Mapping existing security controls to the 10

Scan passed 1
security-threat-model

Repository-grounded threat modeling that enumerates trust boundaries, assets, attacker capabilities, abuse paths, and mitigations, and writes a concise Markdown threat model. Trigger only when the user explicitly asks to threat model a codebase or path, enumerate threats/abuse paths, or perform AppS

Scan passed 1
cso

Security audit: supported static findings; qualified profiles add reproduction and repair candidates. (gstack)

Scan passed 0
quarkus-security

Quarkus security implementation patterns: JWT and OIDC authentication, @RolesAllowed RBAC and SecurityIdentity checks, Bean Validation and custom validators, parameterized Panache queries, BCrypt password hashing, CORS and security headers, rate limiting, audit logging, Vault or environment-variable

Scan passed 0
claude-security

Claude Security: scan the codebase (the whole repository or a scoped part of it), scan changes (this branch's or a pull request's diff, or one commit), or suggest patches (findings turned into targeted patch files, each verified by a panel of agents, that you apply when you choose). Use when the use

Scan passed 0
client-setup

Create a vanilla tRPC client with createTRPCClient<AppRouter>(), configure link chain with httpBatchLink/httpLink, dynamic headers for auth, transformer on links (not client constructor). Infer types with inferRouterInputs and inferRouterOutputs. AbortController signal support. TRPCClientError typin

Scan passed 0