Blog

  • Radar – Finer-grained chart granularity on Cloudflare Radar for longer time ranges

    Radar now provides finer-grained traffic charts for longer time ranges. Previously, selecting a 1-3 month view on HTTP and NetFlows charts defaulted to weekly aggregation, which was too coarse to surface meaningful trends. Views longer than 3 months defaulted to monthly aggregation, returning as few as 7 data points for a 6-month range.

    The new defaults are:

    • 1-3 months: daily granularity (7x more data points)
    • Longer than 3 months (HTTP and NetFlows): weekly granularity (4x more data points)

    For example, a 12-week traffic view previously showed weekly data:

    Traffic trends chart with weekly granularity for a 12-week view

    The same view now shows daily data:

    Traffic trends chart with daily granularity for a 12-week view

    Similarly, a 1-year HTTP traffic view that previously showed just 12 monthly data points now provides 52 weekly data points.

    Visit Cloudflare Radar to explore the new granular views.

  • AI Gateway – Control AI costs with spend limits

    AI Gateway now supports spend limits — cost-based budgets that track cumulative dollar spend and block requests when the budget is exceeded. Unlike rate limiting, which caps the number of requests, spend limits track actual cost based on token usage and model pricing.

    You can scope limits by model, provider, or custom metadata dimensions. For example, give each user a $200/day budget, cap total gateway spend at $10,000/day, or limit a specific model to $50/day per user. Each rule uses a configurable time window with fixed or sliding enforcement.

    Spend limits work with both Unified Billing and BYOK requests for models with known pricing.

    For more details, refer to the Spend limits documentation.

  • Access – SAML assertion encryption for identity providers

    Cloudflare Access now supports SAML assertion encryption for identity provider integrations. When turned on, your identity provider encrypts SAML assertions using a Cloudflare-managed certificate before sending them through the user’s browser. Only Access can decrypt these assertions, protecting sensitive identity data even after TLS termination.

    Without encryption, SAML assertions are transmitted in plaintext and could be visible to browser extensions or client-side malware.

    SAML encryption toggle in the identity provider configuration

    SAML encryption includes built-in certificate lifecycle management:

    • Automatic certificate generation: Access generates an encryption certificate when you turn on SAML encryption for an identity provider.
    • Certificate rotation: Rotate certificates without downtime. The previous certificate remains valid until expiration, giving you time to update your IdP.
    • PEM export: Copy the certificate in PEM format for manual upload to your IdP, or point your IdP to the SAML metadata endpoint for automatic retrieval.

    To get started, refer to Encrypt SAML assertions.

  • Workflows, Workers – Schedule Workflow instances directly from your Workflow binding

    You can now attach cron schedules directly to a Workflow binding in wrangler.jsonc. Each scheduled run creates a new Workflow instance automatically, so you do not need to define a separate Worker with a scheduled handler just to trigger your Workflow on an interval.

    For example, you can configure hourly, every-15-minute, or weekday schedules on the same Workflow:

    {
    "workflows": [
    {
    "name": "my-scheduled-workflow",
    "binding": "MY_WORKFLOW",
    "class_name": "MyScheduledWorkflow",
    "schedules": ["0 * * * *", "*/15 * * * *", "0 9 * * MON-FRI"]
    }
    ]
    }

    This makes it easier to build recurring jobs such as database backups, invoice generation, report aggregation, and cleanup tasks without wiring up a separate Cron Trigger entrypoint.

    For more information, refer to Trigger Workflows.

  • Cloudflare WAN, Cloudflare One – Cisco IOS XE

    The Cisco IOS XE third-party integration guide for Cloudflare WAN has been updated to include:

    • Post Quantum Cryptography (PQC)
    • Policy-Based Routing (PBR)
    • IP Service Level Agreement (IP SLA)

    This link will take you directly to the updated Cisco IOS XE guide.

  • Agents, Workers – Agents SDK v0.14.0: Agent Skills, messengers, scheduled tasks, Workflows, and hardened chat recovery

    The latest release of the Agents SDK adds four new ways to build with @cloudflare/think: on-demand Agent Skills, chat messengers (starting with Telegram), declarative scheduled tasks, and durable reasoning steps inside Workflows. This release also significantly hardens durable chat recovery, so turns reliably ride through deploys, evictions, and stalled model streams in production.

    Agent Skills (experimental)

    Give an agent a catalog of on-demand instructions, resources, and scripts. A skill source adds a catalog to the system prompt, and the model activates a skill only when a task matches — so a large library of capabilities does not bloat every prompt.

    • JavaScript

      import { Think, skills } from "@cloudflare/think";
      import bundledSkills from "agents:skills";
      export class SkillsAgent extends Think {
      getSkills() {
      return [
      bundledSkills,
      skills.r2(this.env.SKILLS_BUCKET, { prefix: "skills/" }),
      ];
      }
      }
    • TypeScript

      import { Think, skills } from "@cloudflare/think";
      import bundledSkills from "agents:skills";
      export class SkillsAgent extends Think<Env> {
      getSkills() {
      return [
      bundledSkills,
      skills.r2(this.env.SKILLS_BUCKET, { prefix: "skills/" }),
      ];
      }
      }

    The agents:skills import bundles a local ./skills directory through the Agents Vite plugin (one directory per skill, each with a SKILL.md). Skills can also load from R2 or a manifest. When skills are available, Think exposes activate_skill, read_skill_resource, and an optional run_skill_script tool. Skill loading is resilient: a duplicate or failing source is skipped with a warning instead of breaking the agent.

    Agent Skills are experimental, and script execution in particular is early. The API may change in a future release. We would love your feedback — tell us what you are building and what is missing in the Agents repository.

    Messengers

    Connect a Think agent directly to a chat platform. Think owns the webhook route, conversation routing, durable reply fiber, and streamed delivery back to the provider. Telegram ships as the first provider.

    • JavaScript

      import { Think } from "@cloudflare/think";
      import {
      defineMessengers,
      ThinkMessengerStateAgent,
      } from "@cloudflare/think/messengers";
      import telegramMessenger from "@cloudflare/think/messengers/telegram";
      export { ThinkMessengerStateAgent };
      export class SupportAgent extends Think {
      getMessengers() {
      return defineMessengers({
      telegram: telegramMessenger({
      token: this.env.TELEGRAM_BOT_TOKEN,
      userName: "support_bot",
      secretToken: this.env.TELEGRAM_WEBHOOK_SECRET_TOKEN,
      }),
      });
      }
      }
    • TypeScript

      import { Think } from "@cloudflare/think";
      import {
      defineMessengers,
      ThinkMessengerStateAgent,
      } from "@cloudflare/think/messengers";
      import telegramMessenger from "@cloudflare/think/messengers/telegram";
      export { ThinkMessengerStateAgent };
      export class SupportAgent extends Think<Env> {
      getMessengers() {
      return defineMessengers({
      telegram: telegramMessenger({
      token: this.env.TELEGRAM_BOT_TOKEN,
      userName: "support_bot",
      secretToken: this.env.TELEGRAM_WEBHOOK_SECRET_TOKEN,
      }),
      });
      }
      }

    Each Chat SDK thread maps to its own Think sub-agent by default, so group chats and direct messages do not share memory. Multiple bots, custom conversation routing, and custom providers are all supported.

    Scheduled tasks

    Declare recurring, timezone-aware prompts and handlers with a typed domain-specific language (DSL). Think reconciles the declarations on startup and re-arms the next occurrence after each run, backed by durable idempotent submissions.

    • JavaScript

      import { Think, defineScheduledTasks } from "@cloudflare/think";
      export class DigestAgent extends Think {
      getScheduledTasks() {
      return defineScheduledTasks({
      weeklyCommitReport: {
      schedule: "every week on monday at 09:00",
      prompt:
      "Compile my GitHub commits for the last week and summarize them.",
      },
      workout: {
      schedule: "every day at 08:00 in Europe/London",
      prompt: "Start my workout.",
      },
      });
      }
      }
    • TypeScript

      import { Think, defineScheduledTasks } from "@cloudflare/think";
      export class DigestAgent extends Think<Env> {
      getScheduledTasks() {
      return defineScheduledTasks({
      weeklyCommitReport: {
      schedule: "every week on monday at 09:00",
      prompt:
      "Compile my GitHub commits for the last week and summarize them.",
      },
      workout: {
      schedule: "every day at 08:00 in Europe/London",
      prompt: "Start my workout.",
      },
      });
      }
      }

    Think Workflows

    Run a model-driven reasoning step inside a Cloudflare Workflow with ThinkWorkflow and step.prompt(), with durable typed structured output, long waits, and approval gates.

    • JavaScript

      import { z } from "zod";
      import { ThinkWorkflow } from "@cloudflare/think/workflows";
      const draftSchema = z.object({
      title: z.string(),
      summary: z.string(),
      labels: z.array(z.string()),
      });
      export class TriageWorkflow extends ThinkWorkflow {
      async run(event, step) {
      const draft = await step.prompt("triage-issue", {
      prompt: `Triage issue #${event.payload.issueNumber}`,
      output: draftSchema,
      timeout: "3 days",
      });
      await step.do("apply-labels", async () => {
      await this.agent.applyLabels(draft.labels);
      });
      }
      }
    • TypeScript

      import { z } from "zod";
      import { ThinkWorkflow } from "@cloudflare/think/workflows";
      import type { ThinkWorkflowStep } from "@cloudflare/think/workflows";
      import type { AgentWorkflowEvent } from "agents/workflows";
      const draftSchema = z.object({
      title: z.string(),
      summary: z.string(),
      labels: z.array(z.string()),
      });
      export class TriageWorkflow extends ThinkWorkflow<TriageAgent, Params> {
      async run(event: AgentWorkflowEvent<Params>, step: ThinkWorkflowStep) {
      const draft = await step.prompt("triage-issue", {
      prompt: `Triage issue #${event.payload.issueNumber}`,
      output: draftSchema,
      timeout: "3 days",
      });
      await step.do("apply-labels", async () => {
      await this.agent.applyLabels(draft.labels);
      });
      }
      }

    Production hardening for durable chat recovery

    Durable chat turns have always been designed to survive a mid-turn deploy or Durable Object eviction. This release is a major hardening pass on that machinery for production.

    • Better recovery during deploys. Turns now ride through continuous deploys and evictions without losing completed work or re-running tools that already ran.
    • A live “recovering…” signal. useAgentChat exposes a new isRecovering flag, so a recovering turn shows progress instead of looking frozen. Most UIs render isStreaming || isRecovering as “busy”.
    • Stalled streams recover. Set chatStreamStallTimeoutMs to route a hung provider stream into the same recovery path instead of leaving an infinite spinner.
    • Sub-agents re-attach. On parent recovery, an in-flight agentTool() child is re-attached to its result rather than abandoned and re-run, so long-running children no longer lose work under deploys.

    MCP transport improvements

    • Resumable streams — In-flight tool calls over Server-Sent Events (SSE) survive a dropped connection. Clients reconnect with Last-Event-ID and replay anything they missed.
    • Readable server IDsaddMcpServer accepts an optional id, so tools surface as readable keys (for example tool_github_create_pull_request) instead of opaque connection IDs.
    • Better handling of concurrent requests — Overlapping JSON-RPC requests are now correctly correlated to their responses across the HTTP and RPC transports.

    Other improvements

    • Compaction — A Session‘s tokenCounter now also drives the compaction boundary decision (“what to compress”), not just the fire/no-fire trigger.
    • @cloudflare/worker-bundler — Adds a virtualModules option to createWorker to provide in-memory module source during bundling.
    • Client-tool continuations — Parallel tool results now coalesce into a single continuation, immediate resume requests attach to the pending continuation, and server-side needsApproval continuations resume reliably after approval.

    Upgrade

    To update to the latest version:

    npm i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest
    yarn add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest
    pnpm add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest
    bun add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest

    Refer to the Agents API reference and Chat agents documentation for more information.

  • Logs – New Turnstile Events Logpush dataset in Cloudflare Logs

    Cloudflare has updated Logpush datasets:

    New datasets

    • Turnstile Events: A new dataset with fields including ASN, Action, BrowserMajor, BrowserName, ClientIP, CountryCode, EventType, Hostname, OSMajor, OSName, Sitekey, Timestamp, and UserAgent.

    For the complete field definitions for each dataset, refer to Logpush datasets.

  • Cloudflare One Client – Cloudflare One Client for macOS (version 2026.5.1155.1)

    A new Beta release for the macOS Cloudflare One Client is now available on the beta releases downloads page.

    This release introduces the new Cloudflare One Client UI for macOS! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:

    • Right click context menu to access the most common client actions quickly
    • Built-in captive portal login experience

    Additional Changes and improvements

    • The client now applies DNS search suffixes configured in your device profile / network policy. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See DNS search suffixes for details.
    • Administrators can now control which virtual networks (VNETs) are available to which users via WARP device profile settings in the Zero Trust dashboard. Previously, every VNET in the organization was visible to every device; you can now scope the VNET picker per profile so users only see the networks relevant to them. See VNET availability for details.
    • Added a local-file signal source for Emergency Disconnect. In addition to the existing HTTPS polling mechanism, administrators can now configure WARP to monitor for a file on disk; the presence of the file triggers an emergency disconnect even if both Cloudflare and your own infrastructure are unreachable. Either signal being asserted triggers disconnect; both must be cleared for normal operation to resume.
    • Added new warp-cli debug commands for interactive connection diagnosis. See Extra debug logging for details.
    • The local DNS proxy now supports DNSSEC passthrough. DNSSEC-signed responses are forwarded to the application intact (including DO/AD bits and RRSIG records), so applications that validate DNSSEC locally — including resolvers and the dig/drill tooling — work correctly through the client.
    • Added a new MDM format for organization-wide settings, including a cleaner way to configure the compliance environment (e.g. FedRAMP). The previous per-configuration approach still works, but the new format is now recommended. See the updated Cloudflare One MDM documentation for details.
    • Client Certificate device-posture checks now support template variables (e.g. ${serial_number}, ${device_uuid}) in the Subject Alternative Name field, matching what the documentation has always claimed. Previously only the Common Name field accepted variables, which broke posture rules that pinned identity to a SAN entry.
    • Fixed the in-client captive-portal browser rendering a blank “Success” page on some airline Wi-Fi networks (United inflight Wi-Fi was the reported case). The browser now reliably loads the airline’s real portal page so users can complete sign-in from inside the client instead of having to open a separate browser.
    • Fixed an issue in proxy mode where hostnames containing underscores (e.g. ai_app.com) were rejected, breaking apps that depend on such hostnames (notably ChatGPT sandbox apps). The local proxy now accepts underscore-containing hostnames in CONNECT requests.

    Known issues

    • Registration may hang at “Checking your organization configuration” due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.
    • Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via warp-cli tunnel ip and warp-cli tunnel host. UI support will be added in a future release.
  • Cloudflare One Client – Cloudflare One Client for macOS (version 2026.5.1155.1)

    A new Beta release for the macOS Cloudflare One Client is now available on the beta releases downloads page.

    This release introduces the new Cloudflare One Client UI for macOS! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:

    • Right click context menu to access the most common client actions quickly
    • Built-in captive portal login experience

    Additional Changes and improvements

    • The client now applies DNS search suffixes configured in your device profile / network policy. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See DNS search suffixes for details.
    • Administrators can now control which virtual networks (VNETs) are available to which users via WARP device profile settings in the Zero Trust dashboard. Previously, every VNET in the organization was visible to every device; you can now scope the VNET picker per profile so users only see the networks relevant to them. See VNET availability for details.
    • Added a local-file signal source for Emergency Disconnect. In addition to the existing HTTPS polling mechanism, administrators can now configure WARP to monitor for a file on disk; the presence of the file triggers an emergency disconnect even if both Cloudflare and your own infrastructure are unreachable. Either signal being asserted triggers disconnect; both must be cleared for normal operation to resume.
    • Added new warp-cli debug commands for interactive connection diagnosis. See Extra debug logging for details.
    • The local DNS proxy now supports DNSSEC passthrough. DNSSEC-signed responses are forwarded to the application intact (including DO/AD bits and RRSIG records), so applications that validate DNSSEC locally — including resolvers and the dig/drill tooling — work correctly through the client.
    • Added a new MDM format for organization-wide settings, including a cleaner way to configure the compliance environment (e.g. FedRAMP). The previous per-configuration approach still works, but the new format is now recommended. See the updated Cloudflare One MDM documentation for details.
    • Client Certificate device-posture checks now support template variables (e.g. ${serial_number}, ${device_uuid}) in the Subject Alternative Name field, matching what the documentation has always claimed. Previously only the Common Name field accepted variables, which broke posture rules that pinned identity to a SAN entry.
    • Fixed the in-client captive-portal browser rendering a blank “Success” page on some airline Wi-Fi networks (United inflight Wi-Fi was the reported case). The browser now reliably loads the airline’s real portal page so users can complete sign-in from inside the client instead of having to open a separate browser.
    • Fixed an issue in proxy mode where hostnames containing underscores (e.g. ai_app.com) were rejected, breaking apps that depend on such hostnames (notably ChatGPT sandbox apps). The local proxy now accepts underscore-containing hostnames in CONNECT requests.

    Known issues

    • Registration may hang at “Checking your organization configuration” due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.
    • Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via warp-cli tunnel ip and warp-cli tunnel host. UI support will be added in a future release.
  • Cloudflare One Client – Cloudflare One Client for macOS (version 2026.5.1155.1)

    A new Beta release for the macOS Cloudflare One Client is now available on the beta releases downloads page.

    This release introduces the new Cloudflare One Client UI for macOS! You can expect a cleaner and more intuitive design as well as easier access to common actions and information. Here are some of the many things we have found our users appreciate:

    • Right click context menu to access the most common client actions quickly
    • Built-in captive portal login experience

    Additional Changes and improvements

    • The client now applies DNS search suffixes configured in your device profile / network policy. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See DNS search suffixes for details.
    • Administrators can now control which virtual networks (VNETs) are available to which users via WARP device profile settings in the Zero Trust dashboard. Previously, every VNET in the organization was visible to every device; you can now scope the VNET picker per profile so users only see the networks relevant to them. See VNET availability for details.
    • Added a local-file signal source for Emergency Disconnect. In addition to the existing HTTPS polling mechanism, administrators can now configure WARP to monitor for a file on disk; the presence of the file triggers an emergency disconnect even if both Cloudflare and your own infrastructure are unreachable. Either signal being asserted triggers disconnect; both must be cleared for normal operation to resume.
    • Added new warp-cli debug commands for interactive connection diagnosis. See Extra debug logging for details.
    • The local DNS proxy now supports DNSSEC passthrough. DNSSEC-signed responses are forwarded to the application intact (including DO/AD bits and RRSIG records), so applications that validate DNSSEC locally — including resolvers and the dig/drill tooling — work correctly through the client.
    • Added a new MDM format for organization-wide settings, including a cleaner way to configure the compliance environment (e.g. FedRAMP). The previous per-configuration approach still works, but the new format is now recommended. See the updated Cloudflare One MDM documentation for details.
    • Client Certificate device-posture checks now support template variables (e.g. ${serial_number}, ${device_uuid}) in the Subject Alternative Name field, matching what the documentation has always claimed. Previously only the Common Name field accepted variables, which broke posture rules that pinned identity to a SAN entry.
    • Fixed the in-client captive-portal browser rendering a blank “Success” page on some airline Wi-Fi networks (United inflight Wi-Fi was the reported case). The browser now reliably loads the airline’s real portal page so users can complete sign-in from inside the client instead of having to open a separate browser.
    • Fixed an issue in proxy mode where hostnames containing underscores (e.g. ai_app.com) were rejected, breaking apps that depend on such hostnames (notably ChatGPT sandbox apps). The local proxy now accepts underscore-containing hostnames in CONNECT requests.

    Known issues

    • Registration may hang at “Checking your organization configuration” due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.
    • Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via warp-cli tunnel ip and warp-cli tunnel host. UI support will be added in a future release.