Changelog

Subscribe to feed
  • Know who is visiting your protected site, right from your functions

    On private projects and sites protected with Netlify team login, your Netlify Functions and Edge Functions can now see who is making the request. The signed-in Netlify user is available as context.user, with their user ID, email address, and when their access expires.

    This function returns the signed-in user’s ID, email address, and access expiry as JSON at /whoami, and responds with a 401 when context.user isn’t set:

    netlify/functions/whoami.ts
    import type { Config, Context } from '@netlify/functions'
    export default async (req: Request, context: Context) => {
    if (!context.user) {
    return new Response('Unauthorized', { status: 401 })
    }
    return Response.json({
    id: context.user.id,
    email: context.user.email,
    expiresAt: context.user.expiresAt.toISOString(),
    })
    }
    export const config: Config = { path: '/whoami' }

    Previously, protecting a site meant Netlify checked who could visit, but your code couldn’t tell who they were. Knowing who’s on the other end meant adding a second login of your own on top.

    Now Netlify verifies the visitor at the edge and passes their identity to your code. Because context.user comes from Netlify and not from the request, a visitor can’t impersonate someone else by sending their own headers.

    With context.user, you can build on the login your team already uses. Examples like:

    • Internal dashboards and admin tools that show each person their own data
    • Audit logs that record who made a change or triggered an action
    • Approval and review workflows that know who approved what
    • Per-person settings, permissions, or feature access inside an internal app

    Learn more in the Netlify documentation:

    Permalink to Know who is visiting your protected site, right from your functions
  • Subscribe to Netlify events from ChatGPT

    You can now subscribe to Netlify events from ChatGPT and set up automations that respond to what’s happening on your sites.

    Instead of checking the Netlify dashboard or waiting on an email, you can have ChatGPT act as soon as something happens. Events you can subscribe to include:

    • A deploy succeeded
    • A build failed
    • A form submission came in

    For more events to subscribe to, check out our deploy events.

    Combine events with Netlify plugin and MCP server

    Events get more useful when you pair them with everything else you can already do through the Netlify ChatGPT plugin and Netlify MCP server. For example, you could set up an automation that:

    • Reviews new form submissions and flags the ones that need a follow-up
    • Summarizes what changed when a production deploy succeeds

    Because these automations live in ChatGPT, you can describe what you want in plain language and adjust it as your workflow changes.

    Get started

    Connect Netlify in ChatGPT, then ask it to subscribe to the events you care about for your project. Learn more in our guide to using Netlify with ChatGPT.

    Permalink to Subscribe to Netlify events from ChatGPT
  • Claude Haiku 5.5 now available in AI Gateway and Agent Runners

    Anthropic’s Claude Haiku 5.5 model is now available through Netlify’s AI Gateway and Agent Runners with zero configuration required.

    Use the Anthropic SDK directly in your Netlify Functions without managing API keys or authentication. AI Gateway handles everything automatically. Here’s an example using Claude Haiku 5.5 with the Messages API:

    import Anthropic from '@anthropic-ai/sdk';
    export default async () => {
    const anthropic = new Anthropic();
    const response = await anthropic.messages.create({
    model: 'claude-haiku-5-5',
    max_tokens: 1024,
    messages: [
    { role: 'user', content: 'Give a concise explanation of how AI works.' }
    ],
    });
    return Response.json(response);
    };

    Claude Haiku 5.5 is also available across Scheduled Functions, Background Functions, and Edge Functions. You get automatic access to Netlify’s caching, rate limiting, and authentication infrastructure.

    Learn more in the AI Gateway documentation and Agent Runners documentation.

    Permalink to Claude Haiku 5.5 now available in AI Gateway and Agent Runners
  • OpenAI Decisions API now available in AI Gateway

    OpenAI’s Decisions API is now available through Netlify’s AI Gateway with zero configuration required.

    Use the OpenAI SDK directly in your Netlify Functions to classify, route, and score inputs without managing API keys. Instead of generating prose, the Decisions API answers questions you define about an input, and choice answers are always one of the options you declared. That means there’s no output to parse and nothing unexpected to handle before you branch on the result. The Decisions API is in beta and currently runs on gpt-6-luna.

    Here’s a Function for an online store that sorts incoming return requests by reason:

    import type { Config } from "@netlify/functions";
    import OpenAI from "openai";
    export default async (req: Request) => {
    const openai = new OpenAI();
    const { answers } = await openai.decisions.create({
    model: "gpt-6-luna",
    input: await req.text(),
    questions: [
    {
    type: "choice",
    name: "reason",
    instructions: "Why is the customer returning this item?",
    choices: [
    { value: "wrong_size" },
    { value: "defective" },
    { value: "not_as_described" },
    { value: "changed_mind" },
    ],
    },
    ],
    });
    return Response.json(answers[0]);
    };
    export const config: Config = { path: "/api/returns", method: "POST" };

    Send it “The jacket fits well, but the zipper came off the second time I wore it” and you get back:

    {
    "type": "choice",
    "name": "reason",
    "choice": "defective",
    "probabilities": [
    { "value": "wrong_size", "probability": 0.01 },
    { "value": "defective", "probability": 0.95 },
    { "value": "not_as_described", "probability": 0.03 },
    { "value": "changed_mind", "probability": 0.01 }
    ],
    "confidence": 0.93
    }

    choice is safe to branch on directly, so you can send a prepaid label for defective items or offer an exchange for the wrong size, and use confidence to pass unclear requests to your support team.

    Learn more in the AI Gateway documentation and the OpenAI API reference.

    Permalink to OpenAI Decisions API now available in AI Gateway
  • Comment on specific lines of code in Agent Runners

    You can now add comments to individual lines in the diff on the Code tab of Agent Runners, so you can give your agent precise feedback on the code it generated.

    Previously, asking for a fix meant describing where the problem was in your prompt, such as naming the file, quoting the code, or explaining which function you meant.

    Now you can pinpoint exactly where you want changes. Open the Code tab for an agent run, select the + next to a line in the diff, and leave a comment about what you want changed. Your comments are sent along with your next prompt, so the agent knows exactly which code lines you’re referring to.

    Agent Runners Code tab showing a diff of index.html with a comment box open on line 278 that reads “use class name subdued instead” and an Add comment button

    This makes follow-up prompts more useful when you want to:

    • Correct a specific bug or edge case without rewriting the whole request
    • Ask for a different approach in one part of a change while keeping the rest
    • Flag naming, styling, or structure issues right where they appear
    • Leave feedback on several spots across multiple files in a single follow-up run

    Try it on your next agent run, or learn more about making changes with Agent Runners.

    Permalink to Comment on specific lines of code in Agent Runners
  • Google’s Gemini Nano Banana 2.1 now available in AI Gateway

    Google’s Gemini Nano Banana 2.1 is now available through Netlify AI Gateway. You can call this image generation model from Netlify Functions without configuring API keys; AI Gateway provides the connection to Google for you.

    Use the Google Gen AI SDK with the model ID gemini-nano-banana-2.1. Here’s an example that generates an image from a prompt and returns it directly from a Function:

    import { GoogleGenAI } from '@google/genai';
    // Netlify Function: Generate an image with Gemini Nano Banana 2.1 and return it directly.
    // Usage (GET): /.netlify/functions/nano-banana-2-1?prompt=Your+prompt+here
    // Returns: binary image (PNG/JPEG/etc) with proper content-type. If no image, JSON error.
    export default async (request: Request) => {
    const url = new URL(request.url);
    const prompt = url.searchParams.get('prompt') || 'two happy bananas holding flashlights';
    const ai = new GoogleGenAI({});
    try {
    const response = await ai.models.generateContent({
    model: 'gemini-nano-banana-2.1',
    contents: prompt,
    config: {
    imageConfig: {
    aspectRatio: '16:9',
    imageSize: '1K'
    }
    }
    });
    let imagePart = null;
    for (const part of response.candidates[0].content.parts) {
    if (part.inlineData) {
    imagePart = part.inlineData;
    break;
    }
    }
    const bytes = Buffer.from(imagePart.data, 'base64');
    const mimeType = imagePart.mimeType || 'image/png';
    return new Response(bytes, {
    status: 200,
    headers: {
    'Content-Type': mimeType,
    'Cache-Control': 'no-store'
    }
    });
    } catch (err) {
    return new Response(JSON.stringify({ error: String(err), prompt }), {
    status: 500,
    headers: { 'Content-Type': 'application/json' }
    });
    }
    };

    Gemini Nano Banana 2.1 is also available across Scheduled Functions, Background Functions, and Edge Functions. You get automatic access to Netlify’s caching, rate limiting, and authentication infrastructure.

    Learn more in the AI Gateway documentation.

    Permalink to Google’s Gemini Nano Banana 2.1 now available in AI Gateway
  • SvelteKit 3 just works on Netlify

    SvelteKit 3 is out today, and it just works on Netlify on day one. To upgrade, run:

    npx sv migrate sveltekit-3

    The migration tool handles most of the mechanical changes for you, including moving your config and updating imports. You can also check out the official migration guide.

    What’s new

    Some highlights include:

    • Vite 8 — SvelteKit 3 requires Vite 8, bringing faster builds powered by Rolldown.
    • Config lives in vite.config.ts — SvelteKit configuration moves out of svelte.config.js and into your Vite config, so Vite plugins can read it right away.
    • Explicit environment variables are stable — Declare the environment variables your app depends on in src/env.ts, and specify whether each one is public and whether it’s resolved at build time or when the app boots. You get validation and type safety out of the box.
    • $lib is now #lib — The $lib alias is replaced by #lib, using Node’s subpath imports. Imports need to be unambiguous, so write #lib/foo.ts or #lib/foo/index.ts.
    • Shallow routing is built into goto — Use goto() with shallow: true instead of pushState and replaceState.
    • Consistent error handling — All errors, including ones you throw with error(...), now go through your handleError hook.
    • New service worker modules — $service-worker is replaced by imports from $app/env, $app/paths, and $app/manifest, with better type checking in service workers.
    • Tracing is stable — Tracing support has moved out of the experimental namespace.

    Check the full migration guide for all the details.

    Watch out for the #lib alias

    Nearly every SvelteKit project imports from $lib, so this is the change you’re most likely to run into. The migration tool rewrites these imports for you, but because #lib relies on Node’s subpath imports, directory imports without an explicit file no longer resolve:

    // Before
    import { formatDate } from '$lib/utils';
    // After
    import { formatDate } from '#lib/utils/index.ts';

    If a build fails after upgrading with a module resolution error, look for #lib imports that point to a directory or leave off the file extension.

    Deploy a SvelteKit 3 site on Netlify

    If you want to get started with a new site, start with the SvelteKit on Netlify doc, or just click this button:

    Deploy to Netlify

    Permalink to SvelteKit 3 just works on Netlify
  • Security Update: Multiple vulnerabilities in Next.js

    The Next.js team has disclosed seven security vulnerabilities in Next.js (one high, five medium, one low), patched on September 30, 2026 in 15.5.27 and 16.3.8. The issues span server-side request forgery (SSRF), cache poisoning, and information disclosure. Several of them do not affect apps hosted on Netlify. Here’s what Netlify customers need to know.

    Summary

    Some of these vulnerabilities affect Next.js sites hosted on Netlify (details in Impact on Netlify), so if you run Next.js on Netlify, we strongly recommend upgrading next to 15.5.27 or 16.3.8 and redeploying. The OpenNext Netlify Next.js adapter must also be updated to @netlify/plugin-nextjs 5.16.1; it’s auto-installed by default, so a redeploy picks it up (a manual upgrade is only needed if you pin the version). See What should I do? for full steps.

    Vulnerabilities

    All issues are patched in 15.5.27 and 16.3.8.

    VulnerabilitySeverityAffected
    GHSA-cjq9-62q9-8jv4 / CVE-2026-94483 — Image optimizer SSRFHigh16.x with an attacker-controlled remote host in images.remotePatterns
    GHSA-4jqv-mc3x-m676 / CVE-2026-94543 — Cache poisoning of SSG/ISR pages (cross-route)Medium15.x/16.x Pages Router apps with SSG/ISR and a root catch-all route
    GHSA-mcj8-r9mp-w47p / CVE-2026-94484 — Cache poisoning via encoded paths / /index (SSG/ISR)Medium15.x/16.x apps combining a root catch-all with SSG/ISR routes
    GHSA-f87g-xv8r-7p7x / CVE-2026-94485 — Metadata image dynamicParams bypass (information disclosure)Medium16.x App Router Webpack builds using metadata image routes
    GHSA-h694-7cp9-m8p3 — Cache leak across root param values in nested use cacheMedium16.3.x with Cache Components + nested use cache reading root params
    GHSA-3w37-wq28-93x7 / CVE-2026-94544 — Draft Mode use cache content leakMedium16.3.x with Cache Components / useCache, Draft Mode, and draft-dependent cached content
    GHSA-39w2-rjm5-chcv / CVE-2026-94486 — Development MCP information disclosureLow16.x development servers (next dev) with the MCP endpoint

    Impact on Netlify

    Not affected on Netlify

    • GHSA-cjq9-62q9-8jv4 (Image optimizer SSRF): Netlify projects are not affected. Image optimization on Netlify is handled by Netlify Image CDN — a separate service outside your project’s functions — so the vulnerable Next.js image-optimizer code path is not used, and the Image CDN has its own protections against this class of SSRF.
    • GHSA-3w37-wq28-93x7 (Draft Mode use cache content leak): Netlify projects are not affected. This leak requires two requests to share a single server process’s in-flight cache fill. On Netlify’s serverless architecture each request is served by its own isolated invocation, so the required overlap cannot occur.
    • GHSA-39w2-rjm5-chcv (Development MCP information disclosure): Netlify projects are not affected. This affects the next dev development server only; Netlify serves production builds, which do not expose the development MCP endpoint.

    Information disclosure

    GHSA-f87g-xv8r-7p7x (Metadata image dynamicParams bypass) can expose content from routes excluded via dynamicParams through metadata image routes. It only affects Webpack builds; Turbopack builds are not affected. On Netlify, apps that use a Webpack build are affected; upgrading Next.js resolves it.

    Cache poisoning and availability

    GHSA-4jqv-mc3x-m676 and GHSA-mcj8-r9mp-w47p affect apps with SSG/ISR routes behind a root catch-all.

    • GHSA-4jqv-mc3x-m676 (cross-route cache poisoning): Pages Router apps with SSG/ISR and a root catch-all route are affected on Netlify. Upgrading Next.js resolves the poisoning on its own. The fix also changes how cache entries are keyed, so you should update the Netlify adapter (5.16.1) as well — otherwise prerendered pages miss the cache and re-render (a serving/performance regression, not a security one). See What should I do?.
    • GHSA-mcj8-r9mp-w47p (encoded paths / /index): App Router apps with a prerendered catch-all route are affected by an availability issue — certain valid percent-encoded URLs can return an error (HTTP 500) instead of the page. Upgrading Next.js resolves it.
    • GHSA-h694-7cp9-m8p3 (cache leak across root param values): affects Next.js 16.x apps using Cache Components with a nested use cache that reads root params (e.g. locale or region segments) — an enclosing cache entry can be keyed without the root param and reused across values, so content produced for one value can be served for another. Upgrading Next.js resolves it.

    What should I do?

    We strongly recommend upgrading as soon as possible:

    • Upgrade next to 15.5.27 or 16.3.8 and redeploy.

    The OpenNext Netlify Next.js adapter that runs your app must also be updated to v5.16.1:

    • Auto-installed adapter (default): redeploy — the update is applied automatically.
    • Manually installed adapter: upgrade @netlify/plugin-nextjs to v5.16.1 and redeploy. We recommend not pinning the adapter version so future fixes ship automatically.

    Note that any publicly available deploy previews and branch deploys may remain vulnerable until they are automatically deleted. Consider deleting these deploys manually.

    Resources

    Permalink to Security Update: Multiple vulnerabilities in Next.js
  • Security Update: Cross-site scripting in TanStack Start

    The TanStack team has disclosed a critical cross-site scripting (XSS) vulnerability in TanStack Start. A crafted URL can cause an affected app to return attacker-controlled HTML from its own origin, which may run attacker-supplied JavaScript in a visitor’s browser. Here’s what Netlify customers need to know.

    Vulnerabilities

    GHSA-qx66-fv34-fjm8 (CVE-2026-102989): Unauthenticated reflected XSS in server-function responses.

    PackageAffected versionsFixed in
    @tanstack/react-start>= 1.143.12, < 1.168.601.168.60
    @tanstack/solid-start>= 1.143.12, < 1.168.571.168.57
    @tanstack/vue-start>= 1.143.12, < 1.168.561.168.56
    @tanstack/start-server-core>= 1.143.12, < 1.169.391.169.39

    Impact on Netlify

    This is a client-side cross-site scripting (XSS) vulnerability in TanStack Start’s server-function response handling. Because the malicious response is returned from the app’s own origin, an attacker who gets a victim to open a crafted link can run JavaScript in that visitor’s session — for example, to read their data or act as them on the site. All applications on an affected version should upgrade.

    What should I do?

    We strongly recommend upgrading as soon as possible to the patched releases:

    • @tanstack/react-start 1.168.60 or later
    • @tanstack/solid-start 1.168.57 or later
    • @tanstack/vue-start 1.168.56 or later
    • @tanstack/start-server-core 1.169.39 or later

    Not sure if you’re affected?

    Open your project in Agent Runners in ask mode and try this prompt:

    Does this project use TanStack Start? If so, which versions of `@tanstack/react-start`, `@tanstack/solid-start`, `@tanstack/vue-start`, and `@tanstack/start-server-core` are resolved in the lockfile? Is the resolved `@tanstack/start-server-core` version 1.169.39 or later? If not, what do I need to change to upgrade? (Advisory: GHSA-qx66-fv34-fjm8)

    Ask mode answers without changing your code. If an upgrade is needed, switch to Build mode to make the change, preview, and redeploy.

    Deploy previews and branch deploys

    Note that any publicly available deploy previews and branch deploys may remain vulnerable until they are automatically deleted. Consider deleting these deploys manually.

    Resources

    Permalink to Security Update: Cross-site scripting in TanStack Start
Next page