Developer Platform Updates & Release Notes

Follow

376 updates curated from 1 source by the Releasebot Team. Last updated: Oct 3, 2026

Get this feed:
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 3, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Agents, Workers - Run the Pi Durable harness on Cloudflare with the Agents SDK

    Developer Platform adds first-class Pi harness support in the Agents SDK, introducing the beta PiHarness class for durable long-running agents. It brings Pi Durable integration, lifecycle persistence, and support for extensions, tools, and Cloudflare models.

    The Agents SDK now provides first-class support for building agents using the Pi harness.

    You can build long-running agents using the combination of Pi 1.0 ↗︎, Pi Durable ↗︎, and the new PiHarness class that the Cloudflare Agents SDK provides, ensuring your agent's work is durably persisted, even if interrupted mid-turn.

    Built with Earendil ↗︎, this integration is our first step toward first-class support for third-party agent harnesses on Cloudflare.

    Copy promptPrompt copied!

    Beta

    PiHarness is in beta. Pi Durable ↗︎ is a new, experimental package, and the PiHarness API will likely change as Pi Durable matures.

    PiHarness is a new "Lifecycle capability" provided by the Cloudflare Agents SDK. Pi Durable provides the agent harness and the Lifecycle is responsible for keeping the agent running in the Durable Object. The Lifecycle is a core concept in the Agents SDK ensuring that long-running work can run in a Durable Object, surviving restarts, crashes, and network issues. We will share more on Lifecycle capabilities in the near future.

    Install

    npmyarnpnpmbun

    npm i agents@latest @earendil-works/pi-durable @earendil-works/pi-ai
    yarn add agents@latest @earendil-works/pi-durable @earendil-works/pi-ai
    pnpm add agents@latest @earendil-works/pi-durable @earendil-works/pi-ai
    bun add agents@latest @earendil-works/pi-durable @earendil-works/pi-ai

    Both Pi packages are optional peer dependencies of agents, so you only install them if you use the harness.

    Use it in an Agent

    Creating a Pi agent requires configuring the Pi Harness with a model, skills, and tools, then registering the PiHarness with the Agent class.

    import { Agent } from "agents";
    import { createModels } from "@earendil-works/pi-ai/models";
    import { createRegistry, Harness } from "@earendil-works/pi-durable";
    import { PiHarness } from "agents/harness/pi";
    import { createAI } from "agents/models/pi-ai";
    
    export class Assistant extends Agent {
    ai = createAI({ binding: this.env.AI });
    registry = createRegistry();
    harness = new PiHarness({
    harness: ({ storage, context }) => {
    const models = createModels();
    models.setProvider(this.ai.provider);
    return Harness.open(
    storage,
    { models, registry: this.registry },
    context,
    );
    },
    defaults: { model: this.ai("@cf/moonshotai/kimi-k2.7-code") },
    });
    constructor(ctx, env) {
    super(ctx, env);
    this.lifecycle.use(this.harness);
    }
    async ask(prompt) {
    const { text } = await this.harness.prompt(prompt);
    return text;
    }
    }
    
    import { Agent } from "agents";
    import { createModels } from "@earendil-works/pi-ai/models";
    import { createRegistry, Harness } from "@earendil-works/pi-durable";
    import { PiHarness } from "agents/harness/pi";
    import { createAI } from "agents/models/pi-ai";
    
    export class Assistant extends Agent<Env> {
    ai = createAI({ binding: this.env.AI });
    registry = createRegistry();
    harness = new PiHarness({
    harness: ({ storage, context }) => {
    const models = createModels();
    models.setProvider(this.ai.provider);
    return Harness.open(
    storage,
    { models, registry: this.registry },
    context,
    );
    },
    defaults: { model: this.ai("@cf/moonshotai/kimi-k2.7-code") },
    });
    constructor(ctx: DurableObjectState, env: Env) {
    super(ctx, env);
    this.lifecycle.use(this.harness);
    }
    async ask(prompt: string) {
    const { text } = await this.harness.prompt(prompt);
    return text;
    }
    }
    

    The agents/models/pi-ai entry point supports AI Gateway and Workers AI models, so you can get started with Cloudflare models right away or use your existing pi-ai provider.

    Add tools with extensions

    Both tools and system prompt sections are provided to the Pi Harness via extensions.

    import { Type } from "@earendil-works/pi-ai";
    import { skills } from "agents/harness/pi";
    
    const WordCount = Type.Object({ text: Type.String() });
    
    const wordCount = {
    name: "word_count",
    description: "Count the words in a text.",
    parameters: WordCount,
    replay: "safe",
    async execute({ text }) {
    const words = text.split(/\s+/).filter(Boolean).length;
    return { content: [{ type: "text", text: String(words) }] };
    },
    };
    
    // In the harness factory, before Harness.open():
    registry.install({
    name: "editor",
    sections: [
    { key: "preamble", render: () => "You are an editor.", tag: false },
    ],
    tools: [wordCount],
    });
    registry.install(await skills(sources));
    
    import { Type } from "@earendil-works/pi-ai";
    import type { ToolRegistration } from "@earendil-works/pi-durable";
    import { skills } from "agents/harness/pi";
    
    const WordCount = Type.Object({ text: Type.String() });
    
    const wordCount: ToolRegistration<typeof WordCount> = {
    name: "word_count",
    description: "Count the words in a text.",
    parameters: WordCount,
    replay: "safe",
    async execute({ text }) {
    const words = text.split(/\s+/).filter(Boolean).length;
    return { content: [{ type: "text", text: String(words) }] };
    },
    };
    
    // In the harness factory, before Harness.open():
    registry.install({
    name: "editor",
    sections: [
    { key: "preamble", render: () => "You are an editor.", tag: false },
    ],
    tools: [wordCount],
    });
    registry.install(await skills(sources));
    

    For more information on creating and configuring extensions, refer to Extensions.

    Learn more

    Pi harness documentation

    Pi harness extensions

    pi-ai model provider

    Pi harness example ↗︎, with WebSockets, a browser UI, and a @cloudflare/computer Workspace for the model's tools

    Lifecycle ↗︎

    Pi Durable announcement ↗︎ from Earendil

    Original source
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    AI Gateway, Web Search API - Introducing Web Search API

    Developer Platform launches Web Search API in beta, giving AI agents and apps live web search grounded in current information. It supports Ceramic.ai, Exa, and Linkup, works through AI Gateway, and lets users bring their own provider key.

    Web Search API is now available in beta. Web Search API lets your AI agents and applications search the Internet and ground their responses in live information, instead of guessing URLs or relying on a model's training cutoff.

    At launch, you can choose between three search providers: Ceramic.ai, Exa, and Linkup. All three support Zero Data Retention for requests made through Cloudflare, and all have committed to Cloudflare's verified bot crawling standards.

    Web Search API runs through AI Gateway, so search requests appear in your gateway logs and are billed to your AI Gateway credits at each provider's list API price, with no additional markup. You can also bring your own provider API key.

    Call Web Search API with the REST API:

    curl https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/ai/websearch/ \
    --request POST \
    --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    --header "Content-Type: application/json" \
    --data '{
    "query": "What are some fun things to do in Salt Lake City as fall approaches?",
    "provider": "ceramic",
    "limit": 5,
    "options": { "gateway": { "id": "default" } }
    }'
    

    Or from a Worker with the AI binding:

    const response = await env.AI.websearch({
    gatewayId: "default",
    query: "What are some fun things to do in Salt Lake City as fall approaches?",
    provider: "exa",
    limit: 5,
    });
    const results = await response.json();
    

    To get started, refer to How to use Web Search API.

    Original source
  • All of your release notes in one feed

    Join Releasebot and get updates from Cloudflare and hundreds of other software products.

    Create account
  • Oct 2, 2026
    • Date parsed from source:
      Oct 2, 2026
    • First seen by Releasebot:
      Oct 2, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    KV - Workers KV namespace jurisdictions are now generally available

    Developer Platform adds generally available jurisdictions for Workers KV namespaces, letting teams pin new namespaces to eu, us, or fedramp regions for data localization and compliance.

    Jurisdictions for Workers KV namespaces are now generally available.

    When you create a namespace, you can set a jurisdiction to make sure the namespace's data is only durably stored within that region. Jurisdictions can help you comply with data localization regulations such as GDPR or FedRAMP. Supported jurisdictions are eu, us, and fedramp.

    A jurisdiction can only be set when a namespace is created, using the Cloudflare dashboard, Wrangler, the cf CLI, or the REST API, and cannot be added or changed afterwards.

    npx wrangler@latest kv namespace create <NAMESPACE_NAME> --jurisdiction=eu
    cf kv namespaces create --title <NAMESPACE_NAME> --jurisdiction eu
    curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/storage/kv/namespaces" \
    --request POST \
    --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    --header "Content-Type: application/json" \
    --data '{
    "title": "<NAMESPACE_NAME>",
    "jurisdiction": "eu"
    }'
    

    Workers can still access a namespace restricted to a jurisdiction from anywhere in the world, and KV data can be cached outside the jurisdiction on Cloudflare's network. The jurisdiction only controls where the namespace's data is durably stored.

    To learn more, refer to Data location.

    Original source
  • Oct 1, 2026
    • Date parsed from source:
      Oct 1, 2026
    • First seen by Releasebot:
      Oct 1, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Workers AI - Introducing Clef: Cloudflare's first open-source decision models, now on Workers AI

    Developer Platform releases Clef and Clef-flash, two new Cloudflare Workers AI decision models for fast, structured agent decisions. It also adds RL fine-tuning, open-sourced weights, vision support, and 64K context for hot-path workflows.

    Meet @cf/cloudflare/clef and @cf/cloudflare/clef-flash

    Meet @cf/cloudflare/clef and @cf/cloudflare/clef-flash, the first models trained by the Cloudflare Workers AI team, available on Workers AI today.

    Clef is a decision model, in the same family as Typesafe's Jev ↗︎. Instead of generating text, it reads an input state and a set of typed questions, then returns a probability for every allowed answer. Your agent gets a structured decision it can act on immediately, for example: route the ticket, block the request, or escalate to a human. There is no free-form output to parse and no reasoning tokens to wait for.

    Both models are hosted on Workers AI as Clef and Clef-flash. We are also open-sourcing the weights under the Apache 2.0 license on Hugging Face: Clef ↗︎ and Clef-flash ↗︎. Read the launch blog post ↗︎ for the full story, including how we trained them.

    We are also launching a reinforcement learning (RL) fine-tuning service to help you tune Clef for your own workloads. Sign up to work with us as a design partner ↗︎.

    Built for the hot path

    Clef is designed to be fast so decisions come back in milliseconds. Across our 43 benchmark runs, we achieved speeds where Clef is 2.5x faster than Jev at the median, and Clef-flash 13x faster.

    Latency

    Clef Clef-flash Jev Median 209.3 ms 38.8 ms p95 238.6 ms 122.4 ms

    Hosting on Workers AI adds to that speed. Requests run on GPUs across Cloudflare's network, running close to your users, so the network round trip stays short. You can put Clef directly in the request path of your agent, then hand off to an LLM on Workers AI to take action.

    Leading the benchmarks

    Across 10 decision benchmarks, a Clef model scores highest on 7, ahead of Jev and other open decision models. A few highlights:

    Benchmark

    Clef Clef-flash Jev BFCL (case exact) 98.47 98.76 BANKING77 (macro-F1) 94.20 90.93 CLINC150+OOS (macro-F1) 97.43 66.77 Home appliances (case exact) 82.95 97.73

    On Typesafe's own workflow evals, Clef beats Jev in 3 of 4 areas: invoice processing, customer service, and security incidents. The full results are on the Hugging Face model card ↗︎.

    Drop-in compatible with Jev

    Model Size Best for Context window @cf/cloudflare/clef 27B Highest-precision decisions 64K tokens @cf/cloudflare/clef-flash 9B Latency-critical, hot-path decisions 64K tokens

    Clef follows the System One API, so you can switch an existing Jev integration to Clef by changing the endpoint and model. Ask up to 64 questions per request, in three types:

    noul: A yes/no question. Returns the probability that the answer is yes.

    choice: Pick one option from a set you define. Returns the chosen option, a probability per option, and a confidence value.

    score: Rate against an ordered rubric. Returns a probability-weighted score and a probability per level.

    const response = await env.AI.run("@cf/cloudflare/clef", {
    model: "clef",
    state: "Checkout has been failing for every customer for the last hour.",
    questions: {
    urgent: {
    type: "noul",
    instructions: "Is this support request urgent?",
    },
    team: {
    type: "choice",
    instructions: "Which team should handle this request?",
    criteria: {
    billing: "Payments, invoices, and refunds",
    technical: "Outages, errors, and configuration",
    sales: "Plans and upgrades",
    },
    },
    },
    });
    // response.answers.urgent.noul -> probability the request is urgent
    // response.answers.team.choice -> highest-probability team
    const response = await env.AI.run("@cf/cloudflare/clef", {
    model: "clef",
    state: "Checkout has been failing for every customer for the last hour.",
    questions: {
    urgent: {
    type: "noul",
    instructions: "Is this support request urgent?",
    },
    team: {
    type: "choice",
    instructions: "Which team should handle this request?",
    criteria: {
    billing: "Payments, invoices, and refunds",
    technical: "Outages, errors, and configuration",
    sales: "Plans and upgrades",
    },
    },
    },
    });
    // response.answers.urgent.noul -> probability the request is urgent
    // response.answers.team.choice -> highest-probability team
    

    What you can build with decision models

    Support triage: Decide whether a ticket is urgent and which team owns it, then route it without a human in the loop.

    Threat intelligence: Classify a website by category. Paired with Browser Run, Clef fetched, rendered, and classified a domain in 2.2 seconds, compared to 4.7 seconds for gpt-oss-120b in the same workflow.

    Trust and safety: Score user submissions against your own policy rubric and act on the probability.

    Agent guardrails: Let an agent check "should I take this action?" in tens of milliseconds before calling a tool.

    Visual classification: Pass up to four images alongside the state. Unlike text-only decision models, Clef has a vision encoder.

    Get started

    Use Clef through the Workers AI binding (env.AI.run()) or the REST API at /ai/run. You can also use AI Gateway with these endpoints.

    For more information, refer to the Clef model page, the Clef-flash model page, and pricing.

    Original source
  • Oct 1, 2026
    • Date parsed from source:
      Oct 1, 2026
    • First seen by Releasebot:
      Oct 1, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Agents, Workers - The best way to do MCP auth just got better: Workers OAuth Provider goes v1, with a new split API and full support for MCP 2026-07-28

    Developer Platform releases v1 of @cloudflare/workers-oauth-provider with a split OAuth API for separate authorization and resource Workers, MCP 2026 authorization support, token validation over Service Bindings, step-up authorization, and migration help.

    The split API

    import { OAuthAuthorizationServer, OAuthResourceServer, insufficientScope, } from "@cloudflare/workers-oauth-provider"; import { WorkerEntrypoint } from "cloudflare:workers";

    // auth-server Worker: signs users in and issues tokens for both MCP servers. const authorizationServer = new OAuthAuthorizationServer({ issuer: "https://auth.example.com", resources: [ "https://calendar.example.com/mcp", "https://drive.example.com/mcp", ], scopesSupported: ["calendar:read", "calendar:write", "offline_access"], clientIdMetadataDocumentEnabled: true, }); export class AuthServer extends WorkerEntrypoint { fetch(request) { if (new URL(request.url).pathname === "/authorize") { return showConsent(request, this.env); } return authorizationServer.fetch(request, this.env, this.ctx); } validateToken(resource, token) { return authorizationServer.validateToken(resource, token, this.env); } }

    // calendar MCP Worker: checks tokens with AuthServer over a Service Binding. export const calendar = new OAuthResourceServer({ resourceMetadata: { resource: "https://calendar.example.com/mcp", authorization_servers: ["https://auth.example.com"], }, requiredScopes: ["calendar:read"], validateToken: (env) => env.AUTH_SERVER.validateToken, handler: { fetch(request, env, ctx) { if ( request.method === "POST" && !ctx.auth.scope.includes("calendar:write") ) { return insufficientScope(ctx.auth, ["calendar:read", "calendar:write"]); } return handleMcp(request, ctx.props); }, }, });

    import { OAuthAuthorizationServer, OAuthResourceServer, insufficientScope, } from "@cloudflare/workers-oauth-provider"; import { WorkerEntrypoint } from "cloudflare:workers";

    // auth-server Worker: signs users in and issues tokens for both MCP servers. const authorizationServer = new OAuthAuthorizationServer<Env>({ issuer: "https://auth.example.com", resources: [ "https://calendar.example.com/mcp", "https://drive.example.com/mcp", ], scopesSupported: ["calendar:read", "calendar:write", "offline_access"], clientIdMetadataDocumentEnabled: true, }); export class AuthServer extends WorkerEntrypoint<Env> { fetch(request: Request) { if (new URL(request.url).pathname === "/authorize") { return showConsent(request, this.env); } return authorizationServer.fetch(request, this.env, this.ctx); } validateToken(resource: string, token: string) { return authorizationServer.validateToken(resource, token, this.env); } }

    // calendar MCP Worker: checks tokens with AuthServer over a Service Binding. export const calendar = new OAuthResourceServer<Env, AuthProps>({ resourceMetadata: { resource: "https://calendar.example.com/mcp", authorization_servers: ["https://auth.example.com"], }, requiredScopes: ["calendar:read"], validateToken: (env) => env.AUTH_SERVER.validateToken, handler: { fetch(request, env, ctx) { if ( request.method === "POST" && !ctx.auth.scope.includes("calendar:write") ) { return insufficientScope(ctx.auth, ["calendar:read", "calendar:write"]); } return handleMcp(request, ctx.props); }, }, });

    In the example, env.AUTH_SERVER.validateToken is that Service Binding call. The calendar Worker needs no KV namespace of its own.

    {
      "name": "calendar-mcp",
      "main": "src/index.ts",
      "// Set this to today's date": "",
      "compatibility_date": "2026-10-01",
      "services": [
        {
          "binding": "AUTH_SERVER",
          "service": "auth-server",
          "entrypoint": "AuthServer"
        }
      ]
    }
    
    name = "calendar-mcp"
    main = "src/index.ts"
    # Set this to today's date
    compatibility_date = "2026-10-01"
    
    [[services]]
    binding = "AUTH_SERVER"
    service = "auth-server"
    entrypoint = "AuthServer"
    

    OAuthResourceServer publishes the RFC 9728 ↗︎ protected resource metadata that MCP clients use to find your authorization server. It answers requests without a token with a 401 challenge that points to that metadata. It also rejects tokens issued for any other resource.

    You can still use OAuthProvider as both the authorization server and the MCP server. For most 0.x deployments, the only required change is to add resourceMetadata: { resource }.

    Other updates and helpers

    • Consent page ↗︎ and upstream sign-in ↗︎ helpers implement the MCP confused deputy protections.
    • Sliding refresh token expiry ↗︎ with refreshTokenIdleTTL.
    • Resumable KV cleanup ↗︎ with purgeExpiredData().
    • An internal reason ↗︎ on every error passed to onError.

    Upgrade with the migration skill

    npmyarnpnpmbun

    npm i @cloudflare/workers-oauth-provider@latest

    yarn add @cloudflare/workers-oauth-provider@latest

    pnpm add @cloudflare/workers-oauth-provider@latest

    bun add @cloudflare/workers-oauth-provider@latest

    Point your coding agent at node_modules/@cloudflare/workers-oauth-provider/skills/migrate-to-1.0/SKILL.md, or follow the migration guide ↗︎.

    For both Workers in full, refer to the split Workers example ↗︎.

    Original source
  • Similar to Developer Platform with recent updates:

  • Oct 1, 2026
    • Date parsed from source:
      Oct 1, 2026
    • First seen by Releasebot:
      Oct 1, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    AI Search - AI Search is generally available

    Developer Platform launches AI Search generally available with hybrid search by default, included Workers AI embeddings and reranking, multimodal image support, OCR for scanned PDFs, higher file limits, and smarter source type inference.

    AI Search is now generally available. Usage-based billing begins on November 1, 2026, with included monthly ingestion, storage, semantic query, and full-text query usage. Cloudflare will send a reminder email the week before billing begins.

    Refer to Limits & pricing for rates and included usage.

    Hybrid search is on by default

    New AI Search instances use hybrid search by default. Hybrid search combines semantic vector retrieval with full-text matching. You can choose a different index method when you create an instance.

    Refer to Hybrid search for details.

    Workers AI embeddings and reranking are included

    Workers AI embedding and reranking calls made by AI Search are included in AI Search pricing. These calls no longer appear on your Workers AI bill or in your AI Gateway logs. Generation, query rewriting, and external providers continue to use your account and gateway.

    Refer to Limits & pricing for details.

    Multimodal model and image support

    AI Search supports the @cf/qwen/qwen3-vl-embedding-2b and google-ai-studio/gemini-embedding-2 multimodal embedding models. Search and chat requests can include images through the REST API and public endpoint.

    Refer to Supported models for the full list of embedding models.

    OCR availability and increased file limits

    Optical character recognition (OCR) is available on every account for scanned PDFs. Plain-text or code files and PDFs with OCR enabled can be up to 10 MiB. PDFs without OCR and other supported formats remain limited to 4 MiB.

    Refer to Data source for file limits and Limits & pricing for OCR pricing.

    Source type inference

    When you create an AI Search instance, the type field is optional. AI Search infers a website source from an HTTP or HTTPS URL, or an R2 source from an existing bucket name.

    Refer to Data source for details.

    Original source
  • Oct 1, 2026
    • Date parsed from source:
      Oct 1, 2026
    • First seen by Releasebot:
      Oct 1, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Artifacts, Workers - Artifacts is now in open beta

    Developer Platform launches Artifacts, Cloudflare’s Git-speaking versioned file system in open beta, with Workers deployment, programmatic repository management, event subscriptions, data residency controls, and usage analytics for the Workers Paid plan.

    Artifacts, Cloudflare's versioned file system that speaks Git, is now in open beta. Artifacts is built for scale, so you can create a repository per project, user, session, or task.

    With Artifacts, you can:

    • Deploy repositories to Workers — Connect an Artifacts repository through Workers Builds. Pushes to the production branch deploy the updated Worker, while other branches create or update Worker Previews.
    • Programmatically manage repositories — Use an Artifacts binding from a Worker to create or fork repos, inspect files and commits, read files by path, and issue repo-scoped Git tokens.
    • React to repository changes — Subscribe to events when a repository is created, imported, forked, deleted, pushed to, cloned, or fetched.
    • Control where repository data is stored — Choose to store and process your data in the US or EU.
    • Monitor repository usage — View total operations, pulls, pushes, errors, and error rates in the Cloudflare dashboard or via API for analytics.

    Artifacts is available for customers on the Workers Paid plan. Cloudflare will begin billing for Artifacts on October 14, 2026.

    Build the next GitHub on Cloudflare

    We are hosting a competition to see who can build the next GitHub on Cloudflare using Workers and Artifacts.

    Apply today ↗︎ — submissions are open until October 14, 2026.

    The first-place team will receive $25,000 in Cloudflare credits. The top three teams will be flown to San Francisco to present what they built at Cloudflare Connect.

    Get started with the Artifacts documentation.

    Original source
  • Oct 1, 2026
    • Date parsed from source:
      Oct 1, 2026
    • First seen by Releasebot:
      Oct 1, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Basin Pipelines, Basin - Basin Pipelines ingest limit increased to 1 GB/s

    Developer Platform raises Basin Pipelines stream ingest limits to 1 GB/s for high-volume events, telemetry, and logs.

    Each Basin Pipelines stream can now ingest up to 1 GB/s, increased from 5 MB/s.

    The higher per-stream limit gives high-volume application events, telemetry, and logs more room to grow without splitting ingestion across streams solely to stay within the previous limit.

    For the full list of stream, sink, and pipeline limits, refer to Basin Pipelines limits.

    Original source
  • Oct 1, 2026
    • Date parsed from source:
      Oct 1, 2026
    • First seen by Releasebot:
      Oct 1, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Basin, Basin Pipelines, Basin Catalog, Basin SQL - Cloudflare Basin is now generally available

    Developer Platform launches Basin, a generally available end-to-end analytics platform that brings data ingestion, Iceberg catalog management, and serverless SQL querying together for apps, infrastructure, devices, and Cloudflare services.

    Basin

    Basin, formerly the Cloudflare Data Platform, is now generally available. Basin brings an end-to-end analytics platform to the Developer Platform, enabling you to collect data from a variety of sources, such as apps, infrastructure, devices, and other Cloudflare services, then query it to answer analytical questions.

    Basin Pipelines

    Basin Pipelines, formerly Cloudflare Pipelines, ingests events from Workers, HTTP endpoints, and Cloudflare Logpush. It transforms events with SQL and ingests them into Iceberg tables or files on R2. With Basin Pipelines you can:

    • Ingest application and device events through HTTP endpoints or Workers bindings.
    • Filter and reshape Cloudflare logs before storing them as Iceberg tables, Parquet, or JSON.
    • Catch schema mismatches with typed bindings and investigate dropped events in the dashboard.

    Basin Catalog

    Basin Catalog, formerly R2 Data Catalog, manages and automatically maintains Apache Iceberg tables ↗︎ to keep them fast, cost-efficient, and accessible to any compatible query engine. With Basin Catalog you can:

    • Connect DuckDB, Spark, Snowflake, or PyIceberg to the same tables.
    • Maintain growing tables with compaction, snapshot expiration, and manifest optimization.
    • Share analytical data across tools and clouds without paying egress fees.

    Basin SQL

    Basin SQL, formerly R2 SQL, is a serverless, distributed SQL engine for querying large Apache Iceberg tables in Basin Catalog without managing or scaling compute. With Basin SQL you can:

    • Summarize and rank data with standard and approximate aggregates, grouping sets, and window functions.
    • Combine and inspect datasets with joins, subqueries, common table expressions, set operations, schema discovery, and EXPLAIN.
    • Transform strings, timestamps, JSON, and complex values with more than 190 functions.

    Get started

    To get started with creating an end-to-end data pipeline, run:

    npx wrangler basin pipelines setup
    yarn wrangler basin pipelines setup
    pnpm wrangler basin pipelines setup
    

    Or get started by referring to the Basin getting started guide.

    Note

    Existing Cloudflare Pipelines, R2 Data Catalog, and R2 SQL resources and configurations will continue to work and will be deprecated over time.

    Original source
  • Oct 1, 2026
    • Date parsed from source:
      Oct 1, 2026
    • First seen by Releasebot:
      Oct 1, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Durable Objects - Pending I/O operations allow Durable Objects to continue long-running work without a connected client

    Developer Platform adds Durable Objects support that keeps objects active during pending work, including service bindings, RPC, fetch(), waitUntil(), timers, and container monitoring. The update helps long-running jobs and agents continue after a client disconnects.

    Durable Objects remain active while handling a request from a connected client. This change applies when no client is connected, such as when an agent continues a submitted job after its client disconnects.

    This behavior is the default for Workers with a compatibility date of 2026-10-01 or later. To use it with an earlier date, add the durable_object_io_tasks_prevent_eviction compatibility flag. To opt out, add the durable_object_io_tasks_do_not_prevent_eviction flag.

    Pending service binding requests now keep Durable Objects running while they wait for a response. Pending calls to another Durable Object through remote procedure call (RPC) or fetch(), as well as this.ctx.container.monitor(), now also keep the Durable Object running.

    Promises passed to this.ctx.waitUntil() and pending setTimeout() and setInterval() timers also receive this protection.

    Previously, Cloudflare could shut down an idle Durable Object while one of these operations remained pending without a connected client. This could stop unfinished work.

    This change helps you run long-running tasks such as agents. An agent can call tools through service bindings, coordinate with other Durable Objects, or wait for a container process without relying on the original client to remain connected.

    Outbound fetch() requests to external services, TCP sockets, and outbound WebSockets already keep Durable Objects running.

    Each pending operation prevents idle shutdown for up to 15 minutes. Starting another one later can extend the Durable Object's time in memory. The limit applies to each operation, not to the total time in memory.

    Duration charges continue while an operation prevents eviction.

    For more information, refer to Lifecycle of a Durable Object.

    Original source
  • Oct 1, 2026
    • Date parsed from source:
      Oct 1, 2026
    • First seen by Releasebot:
      Oct 1, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Workers - Web Crypto adds ML-KEM and ML-DSA support

    Developer Platform adds modern Web Crypto support in Workers for ML-KEM and ML-DSA, plus key encapsulation and decapsulation, getPublicKey(), SubtleCrypto.supports(), and JWKs with the AKP key type behind an opt-in compatibility flag.

    The Workers Web Crypto API now supports ML-KEM-768, ML-KEM-1024, ML-DSA-44, ML-DSA-65, and ML-DSA-87. ML-KEM establishes shared secrets, while ML-DSA signs and verifies data.

    The opt-in API also adds key encapsulation and decapsulation methods, getPublicKey(), SubtleCrypto.supports(), and JSON Web Keys (JWKs) with the AKP key type.

    Turn on the webcrypto_modern_algorithms compatibility flag to use these features:

    {
      "$schema": "./node_modules/wrangler/config-schema.json",
      "compatibility_flags": [
        "webcrypto_modern_algorithms"
      ]
    }
    
    compatibility_flags = ["webcrypto_modern_algorithms"]
    

    This example uses ML-KEM-768 to establish the same shared secret on both sides:

    src/index.js
    const keyPair = await crypto.subtle.generateKey("ML-KEM-768", false, [
    "encapsulateBits",
    "decapsulateBits",
    ]);
    if (!("publicKey" in keyPair)) {
    throw new Error("Expected an ML-KEM key pair");
    }
    const { sharedKey, ciphertext } = await crypto.subtle.encapsulateBits(
    "ML-KEM-768",
    keyPair.publicKey,
    );
    const recoveredSharedKey = await crypto.subtle.decapsulateBits(
    "ML-KEM-768",
    keyPair.privateKey,
    ciphertext,
    );
    
    src/index.ts
    const keyPair = await crypto.subtle.generateKey("ML-KEM-768", false, [
    "encapsulateBits",
    "decapsulateBits",
    ]);
    if (!("publicKey" in keyPair)) {
    throw new Error("Expected an ML-KEM key pair");
    }
    const { sharedKey, ciphertext } = await crypto.subtle.encapsulateBits(
    "ML-KEM-768",
    keyPair.publicKey,
    );
    const recoveredSharedKey = await crypto.subtle.decapsulateBits(
    "ML-KEM-768",
    keyPair.privateKey,
    ciphertext,
    );
    

    Workers implements a subset of the evolving Modern Algorithms in the Web Cryptography API ↗︎ draft. ML-KEM-512 and the draft's other algorithms are not supported. The API may change as the draft evolves.

    For current algorithm and operation support, refer to Web Crypto supported algorithms.

    Original source
  • Sep 30, 2026
    • Date parsed from source:
      Sep 30, 2026
    • First seen by Releasebot:
      Sep 30, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Containers - New scheduling policy for Containers to configure image and instance from Durable Objects

    Developer Platform adds the durable_object scheduling policy for Containers in public beta, letting Durable Objects choose images and instance sizes at runtime. It also supports named custom images and the Cloudflare-managed debian-trixie image with Node.js 24.20.0.

    Containers now support the durable_object scheduling policy in public beta. This policy lets a Durable Object select the image and instance size for a Container at runtime instead of using one centrally managed configuration for the application.

    To use custom images, configure the policy and one or more named images in Wrangler:

    {
      "containers": [
        {
          "class_name": "AgentComputer",
          "scheduling_policy": "durable_object",
          "images": {
            "base": {
              "dockerfile": "./container/Dockerfile"
            }
          }
        }
      ]
    }
    
    [[containers]]
    class_name = "AgentComputer"
    scheduling_policy = "durable_object"
    
    [containers.images.base]
    dockerfile = "./container/Dockerfile"
    

    Wrangler prepares each image and exposes its immutable reference through ctx.container.images. Supply that reference and an instance size when you start the Container:

    src/index.jsjsthis.ctx.container.start({
    image: this.ctx.container.images.base,
    enableInternet: false,
    instance: "standard-2",
    });
    
    src/index.tststhis.ctx.container.start({
    image: this.ctx.container.images.base,
    enableInternet: false,
    instance: "standard-2",
    });
    

    The durable_object policy also supports the new cloudflare/debian-trixie Cloudflare-managed image, which includes Node.js 24.20.0 on Debian Trixie slim. Start it directly without configuring a named image.

    Durable Object-managed Container instances have independent lifecycles and do not participate in application-wide image rollouts.

    For configuration, runtime sizing, snapshots, and update behavior, refer to Scheduling Policies.

    Original source
  • Sep 30, 2026
    • Date parsed from source:
      Sep 30, 2026
    • First seen by Releasebot:
      Sep 30, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Containers - Snapshot and restore Container filesystem

    Developer Platform adds public beta snapshot APIs for Containers, letting users save and restore point-in-time filesystem state through the Durable Object Container API. Snapshots can be passed to start() to recover files after sleep, restart, or handoff.

    Containers now support snapshot APIs in public beta for saving and restoring point-in-time filesystem state.

    Create a snapshot first, then pass it back to start() to restore files after container sleep, restart, or handoff to another Durable Object.

    Use snapshotContainer() through the Durable Object Container API to capture the full container filesystem. Create a snapshot from a running Container, store its handle, and pass that handle to start() when you restore it later:

    src/index.jsjsimport { DurableObject } from "cloudflare:workers";
    export class MyDurableObject extends DurableObject {
    async saveSnapshot() {
    // Create a snapshot from the running Container.
    const containerSnapshot = await this.ctx.container.snapshotContainer({});
    await this.ctx.storage.put("containerSnapshot", containerSnapshot);
    }
    async restoreSnapshot() {
    // Restore the saved snapshot later.
    const containerSnapshot = await this.ctx.storage.get("containerSnapshot");
    if (!containerSnapshot) {
    return;
    }
    this.ctx.container.start({ containerSnapshot, enableInternet: false });
    }
    }
    
    src/index.tstsimport { DurableObject } from "cloudflare:workers";
    export class MyDurableObject extends DurableObject {
    async saveSnapshot() {
    // Create a snapshot from the running Container.
    const containerSnapshot = await this.ctx.container.snapshotContainer({});
    await this.ctx.storage.put("containerSnapshot", containerSnapshot);
    }
    async restoreSnapshot() {
    // Restore the saved snapshot later.
    const containerSnapshot =
    await this.ctx.storage.get<ContainerSnapshot>("containerSnapshot");
    if (!containerSnapshot) {
    return;
    }
    this.ctx.container.start({ containerSnapshot, enableInternet: false });
    }
    }
    

    Snapshots are only supported for Container applications that use the durable_object scheduling policy.

    Snapshots are immutable, so create a new snapshot to persist filesystem changes made after a restore.

    For more information, refer to Snapshots and the Durable Object Container API.

    Original source
  • Sep 30, 2026
    • Date parsed from source:
      Sep 30, 2026
    • First seen by Releasebot:
      Sep 30, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    Sandboxes - Sandbox SDK 1.0: control every sandbox from your own Durable Object

    Developer Platform releases Sandbox SDK 1.0, giving Durable Objects direct control of sandbox containers through the container API. It adds image and size selection at start, snapshots, streamed commands, terminals, previews, outbound request handling, and agent tools.

    Sandbox SDK 1.0 is available. Your own Durable Object class now controls each sandbox container directly, through the Durable Object container API on this.ctx.container.

    With 1.0, your class can:

    • Choose the image and instance size each time it starts a sandbox. One class can run sandboxes on different images, and a deploy does not restart sandboxes that are running.
    • Save the files of a sandbox as a snapshot, in public beta, and start the same sandbox or a new one from it.
    • Decide when each sandbox stops, for example when a task finishes, when its user goes idle, or after it saves a snapshot.
    • Run commands with streamed input and output, send them signals, and open terminals.
    • Serve previews from ports in the sandbox, with your own hostnames and authentication.
    • Handle outbound requests for each hostname in Worker code, so credentials and bindings stay in your Worker.
    • Expose only the methods that you want callers to use.
    • Run an agent in the same Durable Object, and give the model a tool that runs commands in the sandbox.
    src/index.js
    import { Files } from "@cloudflare/sandbox";
    import { DurableObject } from "cloudflare:workers";
    export class MySandbox extends DurableObject {
    container;
    files;
    constructor(ctx, env) {
    super(ctx, env);
    if (!ctx.container) {
    throw new Error("No container is configured");
    }
    this.container = ctx.container;
    this.files = new Files(ctx.container);
    }
    async run(script) {
    if (!this.container.running) {
    // Your code chooses the image, size, and network access.
    this.container.start({
    image: this.container.images.sandbox,
    instance: "lite",
    enableInternet: false,
    });
    }
    await this.files.writeFile("/tmp/task.sh", script);
    const proc = await this.container.exec(["sh", "/tmp/task.sh"]);
    return proc.output();
    }
    }
    
    src/index.ts
    import { Files } from "@cloudflare/sandbox";
    import { DurableObject } from "cloudflare:workers";
    export class MySandbox extends DurableObject&lt;Env&gt; {
    private readonly container: Container;
    private readonly files: Files;
    constructor(ctx: DurableObjectState, env: Env) {
    super(ctx, env);
    if (!ctx.container) {
    throw new Error("No container is configured");
    }
    this.container = ctx.container;
    this.files = new Files(ctx.container);
    }
    async run(script: string) {
    if (!this.container.running) {
    // Your code chooses the image, size, and network access.
    this.container.start({
    image: this.container.images.sandbox,
    instance: "lite",
    enableInternet: false,
    });
    }
    await this.files.writeFile("/tmp/task.sh", script);
    const proc = await this.container.exec(["sh", "/tmp/task.sh"]);
    return proc.output();
    }
    }
    

    Your class uses the container API directly, with the durable_object scheduling policy and container snapshots, both in public beta. @cloudflare/sandbox adds classes for work that the API does not include:

    • Files streams files in and out of the running sandbox.
    • S3Mount mounts an S3-compatible bucket, such as R2. Your Worker signs each storage request, so the credentials stay out of the sandbox.
    • DirectoryBackup saves a directory to R2 and restores it into any sandbox, including one on a newer image.

    If you use Sandbox SDK 0.x

    Your 0.x applications keep running, and @cloudflare/sandbox 0.x stays on npm. Sandbox SDK 0.x receives bug and security fixes until 2026-12-31, and its documentation stays at Sandbox SDK 0.x.

    When you are ready, Migrate from Sandbox SDK 0.x shows the 1.0 code for each 0.x feature, including preview URLs, tunnels, background processes, terminals, backups, and the code interpreter. The guide keeps the preview URLs and named tunnels that your 0.x application created working. You can move every sandbox in one deploy, or run a 1.0 class next to your 0.x class and move sandboxes one at a time. The deploy that moves an existing class to the new policy is one-way, so the guide shows how to rehearse it first.

    The Sandboxes documentation also covers Dynamic Workers, for untrusted code in JavaScript, Python, or WebAssembly.

    Original source
  • Sep 30, 2026
    • Date parsed from source:
      Sep 30, 2026
    • First seen by Releasebot:
      Sep 30, 2026
    Cloudflare logo

    Developer Platform by Cloudflare

    AI Gateway - Pay for AI inference with Machine Payments

    Developer Platform adds Machine Payments in beta for AI Gateway, letting clients pay for eligible inference requests with x402 from a stablecoin wallet instead of a prepaid credit balance on the /ai/run endpoint for select open models.

    AI Gateway now supports Machine Payments in beta. With Machine Payments, clients can use the x402 protocol to pay for eligible inference requests directly from a stablecoin wallet instead of maintaining a prepaid credit balance.

    Machine Payments is available for the /ai/run endpoint with select open models. To request x402 payment, authenticate with a Cloudflare API token and include the Cloudflare-specific Payment-Method: x402 header:

    curl -iX POST "https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/ai/run" \
    --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    --header "Payment-Method: x402" \
    --header "Content-Type: application/json" \
    --data '{
    "model": "z-ai/glm-4.7-flash",
    "input": {
    "messages": [
    {
    "role": "user",
    "content": "What is Cloudflare?"
    }
    ]
    }
    }'
    

    An x402-compatible client handles the payment challenge, signs an authorization from the client's wallet, and retries the request. Machine Payments currently requires customers to be based in the United States and have a credit card on file.

    For prerequisites, eligible models, and transaction details, refer to Machine Payments (x402).

    Original source
Releasebot

Curated by the Releasebot team

Releasebot is an aggregator of official product update announcements from hundreds of software vendors and thousands of sources.

Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.