
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title><![CDATA[ The Cloudflare Blog ]]></title>
        <description><![CDATA[ Get the latest news on how products at Cloudflare are built, technologies used, and join the teams helping to build a better Internet. ]]></description>
        <link>https://blog.cloudflare.com</link>
        <atom:link href="https://blog.cloudflare.com/" rel="self" type="application/rss+xml"/>
        <language>en-us</language>
        <image>
            <url>https://blog.cloudflare.com/favicon.png</url>
            <title>The Cloudflare Blog</title>
            <link>https://blog.cloudflare.com</link>
        </image>
        <lastBuildDate>Sun, 05 Apr 2026 05:18:16 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Embedded function calling in Workers AI: easier, smarter, faster]]></title>
            <link>https://blog.cloudflare.com/embedded-function-calling/</link>
            <pubDate>Thu, 27 Jun 2024 17:00:09 GMT</pubDate>
            <description><![CDATA[ Introducing a new way to do function calling in Workers AI by running function code alongside your inference. Plus, a new @cloudflare/ai-utils package to make getting started as simple as possible ]]></description>
            <content:encoded><![CDATA[ <p></p>
    <div>
      <h2>Introducing embedded function calling and a new ai-utils package</h2>
      <a href="#introducing-embedded-function-calling-and-a-new-ai-utils-package">
        
      </a>
    </div>
    <p>Today, we’re excited to announce a novel way to do function calling that co-locates LLM inference with function execution, and a new ai-utils package that upgrades the developer experience for function calling.</p><p>This is a follow-up to our <a href="https://x.com/CloudflareDev/status/1803849609078284315">mid-June announcement for traditional function calling</a>, which allows you to leverage a Large Language Model (LLM) to intelligently generate structured outputs and pass them to an API call. Function calling has been largely adopted and standardized in the industry as a way for AI models to help perform actions on behalf of a user.</p><p>Our goal is to make building with AI as easy as possible, which is why we’re introducing a new <a href="https://www.npmjs.com/package/@cloudflare/ai-utils">@cloudflare/ai-utils</a> npm package that allows developers to get started quickly with embedded function calling. These helper tools drastically simplify your workflow by actually executing your function code and dynamically generating tools from OpenAPI specs. We’ve also open-sourced our ai-utils package, which you can find on <a href="https://github.com/cloudflare/ai-utils">GitHub</a>. With both embedded function calling and our ai-utils, you’re one step closer to creating intelligent AI agents, and from there, the possibilities are endless.</p>
    <div>
      <h2>Why Cloudflare’s AI platform?</h2>
      <a href="#why-cloudflares-ai-platform">
        
      </a>
    </div>
    <p>OpenAI has been the gold standard when it comes to having performant model inference and a great developer experience. However, they mostly support their closed-source models, while we want to also promote the open-source ecosystem of models. One of our goals with Workers AI is to match the developer experience you might get from OpenAI, but with open-source models.</p><p>There are other open-source inference providers out there like <a href="https://azure.microsoft.com/en-us/solutions/ai">Azure</a> or <a href="https://aws.amazon.com/bedrock/">Bedrock</a>, but most of them are focused on serving inference and the underlying infrastructure, rather than being a developer toolkit. While there are external libraries and frameworks like AI SDK that help developers build quickly with simple abstractions, they rely on upstream providers to do the actual inference. With <a href="https://developers.cloudflare.com/workers-ai/">Workers AI</a>, it’s the best of both worlds – we offer open-source model inference and a killer developer experience out of the box.</p><p>With the release of embedded function calling and ai-utils today, we’ve advanced how we do inference for function calling and improved the developer experience by making it dead simple for developers to start building AI experiences.</p>
    <div>
      <h2>How does traditional function calling work?</h2>
      <a href="#how-does-traditional-function-calling-work">
        
      </a>
    </div>
    <p>Traditional LLM function calling allows customers to specify a set of function names and required arguments along with a prompt when running inference on an LLM. The LLM returns the names and arguments for the functions that the customer can then make to perform actions. These actions give LLMs the ability to do things like fetch fresh data not present in the training dataset and "perform actions" based on user intent.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2vZ1PHwC5e6RUkxQRKfBW0/1812907a22283b5eef02e92c747e8a73/image3-15.png" />
            
            </figure><p>Traditional function calling requires multiple back-and-forth requests passing through the network in order to get to the final output. This includes requests to your origin server, an inference provider, and external APIs. As a developer, you have to orchestrate all the back-and-forths and handle all the requests and responses. If you were building complex agents with multi-tool calls or recursive tool calls, it gets infinitely harder. Fortunately, this doesn’t have to be the case, and we’ve solved it for you.</p>
    <div>
      <h2>Embedded function calling</h2>
      <a href="#embedded-function-calling">
        
      </a>
    </div>
    <p>With Workers AI, our inference runtime is the Workers platform, and the Workers platform can be seen as a global compute network of distributed functions (RPCs). With this model, we can run inference using Workers AI, and supply not only the function names and arguments, but also the runtime function code to be executed. Rather than performing multiple round-trips across networks, the LLM inference and function can run in the same execution environment, cutting out all the unnecessary requests.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/15yHmiG9OmRj9KkuLHteRm/2c50ad90b4736fbc7496a8495d58e1fe/image1-23.png" />
            
            </figure><p>Cloudflare is one of the few inference providers that is able to do this because we offer more than just inference – our developer platform has compute, storage, inference, and more, all within the same Workers runtime.</p>
    <div>
      <h3>We made it easy for you with a new ai-utils package</h3>
      <a href="#we-made-it-easy-for-you-with-a-new-ai-utils-package">
        
      </a>
    </div>
    <p>And to make it as simple as possible, we created a <a href="https://www.npmjs.com/package/@cloudflare/ai-utils"><code>@cloudflare/ai-utils</code></a> package that you can use to get started. These powerful abstractions cut down on the logic you have to implement to do function calling – it just works out of the box.</p>
    <div>
      <h3>runWithTools</h3>
      <a href="#runwithtools">
        
      </a>
    </div>
    <p><code>runWithTool</code>s is our method that you use to do embedded function calling. You pass in your AI binding (env.AI), model, prompt messages, and tools. The tools array includes the description of the function, similar to traditional function calling, but you also pass in the function code that needs to be executed. This method makes the inference calls and executes the function code in one single step. <code>runWithTools</code> is also able to handle multiple function calls, recursive tool calls, validation for model responses, streaming for the final response, and other features.</p><p>Another feature to call out is a helper method called <code>autoTrimTools</code> that automatically selects the relevant tools and trims the tools array based on the names and descriptions. We do this by adding an initial LLM inference call to intelligently trim the tools array before the actual function-calling inference call is made. We found that <code>autoTrimTools</code> helped decrease the number of total tokens used in the entire process (especially when there’s a large number of tools provided) because there’s significantly fewer input tokens used when generating the arguments list. You can choose to use <code>autoTrimTools</code> by setting it as a parameter in the <code>runWithTools</code> method.</p>
            <pre><code>const response = await runWithTools(env.AI,"@hf/nousresearch/hermes-2-pro-mistral-7b",
  {
    messages: [{ role: "user", content: "What's the weather in Austin, Texas?"}],
    tools: [
      {
        name: "getWeather",
        description: "Return the weather for a latitude and longitude",
        parameters: {
          type: "object",
          properties: {
            latitude: {
              type: "string",
              description: "The latitude for the given location"
            },
            longitude: {
              type: "string",
              description: "The longitude for the given location"
            }
          },
          required: ["latitude", "longitude"]
        },
	 // function code to be executed after tool call
        function: async ({ latitude, longitude }) =&gt; {
          const url = `https://api.weatherapi.com/v1/current.json?key=${env.WEATHERAPI_TOKEN}&amp;q=${latitude},${longitude}`
          const res = await fetch(url).then((res) =&gt; res.json())

          return JSON.stringify(res)
        }
      }
    ]
  },
  {
    streamFinalResponse: true,
    maxRecursiveToolRuns: 5,
    trimFunction: autoTrimTools,
    verbose: true,
    strictValidation: true
  }
)</code></pre>
            
    <div>
      <h3>createToolsFromOpenAPISpec</h3>
      <a href="#createtoolsfromopenapispec">
        
      </a>
    </div>
    <p>For many use cases, users will need to make a request to an external API call during function calling to get the output needed. Instead of having to hardcode the exact API endpoints in your tools array, we made a helper function that takes in an OpenAPI spec and dynamically generates the corresponding tool schemas and API endpoints you’ll need for the function call. You call <code>createToolsFromOpenAPISpec</code> from within runWithTools and it’ll dynamically populate everything for you.</p>
            <pre><code>const response = await runWithTools(env.AI, "@hf/nousresearch/hermes-2-pro-mistral-7b", {
  messages: [{ role: "user",content: "Can you name me 5 repos created by Cloudflare"}],
  tools: [
    ...(await createToolsFromOpenAPISpec(  "https://raw.githubusercontent.com/github/rest-api-description/main/descriptions-next/api.github.com/api.github.com.json"
    ))
  ]
})</code></pre>
            
    <div>
      <h2>Putting it all together</h2>
      <a href="#putting-it-all-together">
        
      </a>
    </div>
    <p>When you make a function calling inference request with <code>runWithTools</code> and <code>createToolsFromOpenAPISpec</code>, the only thing you need is the prompts – the rest is automatically handled. The LLM will choose the correct tool based on the prompt, the runtime will execute the function needed, and you’ll get a fast, intelligent response from the model. By leveraging our Workers runtime’s bindings and RPC calls along with our global network, we can execute everything from a single location close to the user, enabling developers to easily write complex agentic chains with fewer lines of code.</p><p>We’re super excited to help people build intelligent AI systems with our new embedded function calling and powerful tools. Check out our <a href="https://developers.cloudflare.com/workers-ai/function-calling/">developer docs</a> on how to get started, and let us know what you think on <a href="https://discord.cloudflare.com">Discord</a>.</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Workers AI]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Open Source]]></category>
            <category><![CDATA[AI]]></category>
            <category><![CDATA[Internship Experience]]></category>
            <guid isPermaLink="false">28DvCOWrN5gKA9IBZqrdc3</guid>
            <dc:creator>Harley Turan</dc:creator>
            <dc:creator>Dhravya Shah</dc:creator>
            <dc:creator>Michelle Chen</dc:creator>
        </item>
        <item>
            <title><![CDATA[Cloudflare launches AI Assistant for Security Analytics]]></title>
            <link>https://blog.cloudflare.com/security-analytics-ai-assistant/</link>
            <pubDate>Mon, 04 Mar 2024 14:00:29 GMT</pubDate>
            <description><![CDATA[ Introducing AI Assistant for Security Analytics. Now it is easier than ever to get powerful insights about your web security. Use the new integrated natural language query interface to explore Security Analytics ]]></description>
            <content:encoded><![CDATA[ <p></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1XqHKAmbIZ4NBeFBXsnaFp/4d66b61833021c41d054dbfd5d8d23c6/AI-Assistant-for-Security-AnalyticsNatural-Language.png" />
            
            </figure><p>Imagine you are in the middle of an attack on your most crucial production application, and you need to understand what’s going on. How happy would you be if you could simply log into the Dashboard and type a question such as: “Compare attack traffic between US and UK” or “Compare rate limiting blocks for automated traffic with rate limiting blocks from human traffic” and see a time series chart appear on your screen without needing to select a complex set of filters?</p><p>Today, we are introducing an AI assistant to help you query your security event data, enabling you to more quickly discover anomalies and potential security attacks. You can now use plain language to interrogate Cloudflare analytics and let us do the magic.</p>
    <div>
      <h2>What did we build?</h2>
      <a href="#what-did-we-build">
        
      </a>
    </div>
    <p>One of the big challenges when analyzing a spike in traffic or any anomaly in your traffic is to create filters that isolate the root cause of an issue. This means knowing your way around often complex dashboards and tools, knowing where to click and what to filter on.</p><p>On top of this, any traditional security dashboard is limited to what you can achieve by the way data is stored, how databases are indexed, and by what fields are allowed when creating filters. With our Security Analytics view, for example, it was difficult to compare time series with different characteristics. For example, you couldn’t compare the traffic from IP address x.x.x.x with automated traffic from Germany without opening multiple tabs to Security Analytics and filtering separately. From an engineering perspective, it would be extremely hard to build a system that allows these types of unconstrained comparisons.</p><p>With the AI Assistant, we are removing this complexity by leveraging our Workers AI platform to build a tool that can help you query your HTTP request and security event data and generate time series charts based on a request formulated with natural language. Now the AI Assistant does the hard work of figuring out the necessary filters and additionally can plot multiple series of data on a single graph to aid in comparisons. This new tool opens up a new way of interrogating data and logs, unconstrained by the restrictions introduced by traditional dashboards.</p><p>Now it is easier than ever to get powerful insights about your application security by using plain language to interrogate your data and better understand how Cloudflare is protecting your business. The new AI Assistant is located in the Security Analytics dashboard and works seamlessly with the existing filters. The answers you need are just a question away.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/65fA9saL0RoHlbErGhKGhL/53e0498be059490a3d442ea383136d8e/Screenshot-2024-02-29-at-13.35.32.png" />
            
            </figure>
    <div>
      <h2>What can you ask?</h2>
      <a href="#what-can-you-ask">
        
      </a>
    </div>
    <p>To demonstrate the capabilities of AI Assistant, we started by considering the questions that we ask ourselves every day when helping customers to deploy the best security solutions for their applications.</p><p>We’ve included some clickable examples in the dashboard to get you started.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7lHKu9aErFzilFDlPId4lL/80a67fb2e3e558ea0a4626ff166fdbd3/ai-analytics.png" />
            
            </figure><p>You can use the AI Assistant to</p><ul><li><p>Identify the source of a spike in attack traffic by asking: “Compare attack traffic between US and UK”</p></li><li><p>Identify root cause of 5xx errors by asking: “Compare origin and edge 5xx errors”</p></li><li><p>See which browsers are most commonly used by your users by asking:”Compare traffic across major web browsers”</p></li><li><p>For an ecommerce site, understand what percentage of users visit vs add items to their shopping cart by asking: “Compare traffic between /api/login and /api/basket”</p></li><li><p>Identify bot attacks against your ecommerce site by asking: “Show requests to /api/basket with a bot score less than 20”</p></li><li><p>Identify the HTTP versions used by clients by asking: “Compare traffic by each HTTP version”</p></li><li><p>Identify unwanted automated traffic to specific endpoints by asking: “Show POST requests to /admin with a Bot Score over 30”</p></li></ul><div>
  
</div><p>You can start from these when exploring the AI Assistant.</p>
    <div>
      <h2>How does it work?</h2>
      <a href="#how-does-it-work">
        
      </a>
    </div>
    <p>Using Cloudflare’s powerful <a href="https://ai.cloudflare.com/">Workers AI</a> global network inference platform, we were able to use one of the off-the-shelf large language models (LLMs) offered on the platform to convert customer queries into GraphQL filters. By teaching an AI model about the available filters we have on our Security Analytics GraphQL dataset, we can have the AI model turn a request such as “<i>Compare attack traffic on /api and /admin endpoints</i>”  into a matching set of structured filters:</p>
            <pre><code>```
[
  {“name”: “Attack Traffic on /api”, “filters”: [{“key”: “clientRequestPath”, “operator”: “eq”, “value”: “/api”}, {“key”: “wafAttackScoreClass”, “operator”: “eq”, “value”: “attack”}]},
  {“name”: “Attack Traffic on /admin”, “filters”: [{“key”: “clientRequestPath”, “operator”: “eq”, “value”: “/admin”}, {“key”: “wafAttackScoreClass”, “operator”: “eq”, “value”: “attack”}]}
]
```</code></pre>
            <p>Then, using the filters provided by the AI model, we can make requests to our <a href="https://developers.cloudflare.com/analytics/graphql-api/">GraphQL APIs</a>, gather the requisite data, and plot a data visualization to answer the customer query.</p><p>By using this method, we are able to keep customer information private and avoid exposing any security analytics data to the AI model itself, while still allowing humans to query their data with ease. This ensures that your queries will never be used to train the model. And because Workers AI hosts a local instance of the LLM on Cloudflare’s own network, your queries and resulting data never leave Cloudflare’s network.</p>
    <div>
      <h2>Future Development</h2>
      <a href="#future-development">
        
      </a>
    </div>
    <p>We are in the early stages of developing this capability and plan to rapidly extend the capabilities of the Security Analytics AI Assistant. Don’t be surprised if we cannot handle some of your requests at the beginning. At launch, we are able to support basic inquiries that can be plotted in a time series chart such as “show me” or “compare” for any currently filterable fields.</p><p>However, we realize there are a number of use cases that we haven’t even thought of, and we are excited to release the Beta version of AI Assistant to all Business and Enterprise customers to let you test the feature and see what you can do with it. We would love to hear your feedback and learn more about what you find useful and what you would like to see in it next. With future versions, you’ll be able to ask questions such as “Did I experience any attacks yesterday?” and use AI to automatically generate WAF rules for you to apply to mitigate them.</p>
    <div>
      <h2>Beta availability</h2>
      <a href="#beta-availability">
        
      </a>
    </div>
    <p>Starting today, AI Assistant is available for a select few users and rolling out to all Business and Enterprise customers throughout March. Look out for it and try for free and let us know what you think by using the <a href="https://docs.google.com/forms/d/e/1FAIpQLSfKtXvPvKUZpjoKZa93ceTk_NAdRY4CF_PpjvFwZwa69o7i6A/viewform?entry.2073820081=Account%20security%20analytics">Feedback</a> link at the top of the Security Analytics page.</p><p>Final pricing will be determined prior to general availability.</p> ]]></content:encoded>
            <category><![CDATA[Security Week]]></category>
            <category><![CDATA[Security]]></category>
            <category><![CDATA[WAF]]></category>
            <category><![CDATA[Workers AI]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Analytics]]></category>
            <category><![CDATA[AI]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <category><![CDATA[Application Services]]></category>
            <guid isPermaLink="false">7rHa5ZDtie6BcqcvMDndWH</guid>
            <dc:creator>Jen Sells</dc:creator>
            <dc:creator>Harley Turan</dc:creator>
        </item>
        <item>
            <title><![CDATA[We've shipped so many products the Cloudflare dashboard needed its own search engine]]></title>
            <link>https://blog.cloudflare.com/quick-search-beta/</link>
            <pubDate>Wed, 28 Sep 2022 13:00:00 GMT</pubDate>
            <description><![CDATA[ Today we’re proud to announce our beta release of quick search for the Cloudflare dashboard, our first ever cross-dashboard search tool to help you navigate our products and features. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Today we’re proud to announce our first release of <i>quick search</i> for the Cloudflare dashboard, a beta version of our first ever cross-dashboard search tool to help you navigate our products and features. This first release is now available to a small percentage of our customers. Want to request early access? Let us know by filling out <a href="https://forms.gle/wFXsvNCCPpTDPKNw5">this form</a>.</p>
    <div>
      <h2>What we’re launching</h2>
      <a href="#what-were-launching">
        
      </a>
    </div>
    <p>We’re launching <i>quick search</i> to speed up common interactions with the Cloudflare dashboard. Our dashboard allows you to configure Cloudflare’s full suite of products and features, and <i>quick search</i> gives you a shortcut.</p><p>To get started, you can access the <i>quick search</i> tool from anywhere within the Cloudflare dashboard by clicking the magnifying glass button in the top navigation, or hitting <i>Ctrl + K</i> on Linux and Windows or <i>⌘ + K</i> on Mac. (If you find yourself forgetting which key combination it is just remember that it’s <i>⌘</i> or <i>Ctrl-K</i>-wik.) From there, enter a search term and then select from the results shown below.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/18FxLXGhxaDifpdwrbLL6g/c194908339f7305be8d06577a550d98a/image7-8.png" />
            
            </figure><p><i>Access</i> quick search <i>from the top navigation bar, or use keyboard shortcuts Ctrl + K on Linux and Windows or ⌘ + K on Mac.</i></p>
    <div>
      <h2>Current supported functionality</h2>
      <a href="#current-supported-functionality">
        
      </a>
    </div>
    <p>What functionality will you have access to? Below you’ll learn about the three core capabilities of <i>quick search</i> that are included in this release, as well as helpful tips for using the tool.</p>
    <div>
      <h3>Search for a page in the dashboard</h3>
      <a href="#search-for-a-page-in-the-dashboard">
        
      </a>
    </div>
    <p>Start typing in the name of the product you’re looking for, and we’ll load matching terms after each key press. You will see results for any dashboard page that currently exists in your sidebar navigation. Then, just click the desired result to navigate directly there.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/30Se7KvpQxKKecPW54rr8n/67388a8a37af76a11d50d86f633378d1/image6-12.png" />
            
            </figure><p><i>Search for “page” and you’ll see results categorized into “website-only products” and “account-wide products.”</i></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3UHBkxlq39FejydkUsLJoK/cbf57b82071ce11613ae87d7fef36bd1/image3-42.png" />
            
            </figure><p><i>Search for “ddos” and you’ll see results categorized into “websites,” “website-only products” and “account-wide products.”</i></p>
    <div>
      <h3>Search for website-only products</h3>
      <a href="#search-for-website-only-products">
        
      </a>
    </div>
    <p>For our customers who manage a website or domain in Cloudflare, you have access to a multitude of Cloudflare products and features to enhance your website’s security, performance and reliability. <i>Quick search</i> can be used to easily find those products and features, regardless of where you currently are in the dashboard (even from within another website!).</p><p>You may easily search for your website by name to navigate to your website’s Overview page:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/EegwomFl43gRGdZbD4ecI/e5a2cd35d1ac65a7836856889220ac54/image9-5.png" />
            
            </figure><p>You may also navigate to the products and feature pages <i>within</i> your specific website(s). Note that you can perform a website-specific search from anywhere in your core dashboard using one of two different approaches, which are explained below.</p><p>First, you may search first for your website by name, then navigate search results from there:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/11Bi07CtVIWCh5YdIb8E93/de0b72d5d8b5aa8f923719a5cc934682/image2-61.png" />
            
            </figure><p>Alternatively, you may search first for the product or feature you’re looking for, then filter down by your website:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6raMp2ha9o8ZSIuHUkvafb/cdcc066b01ae3066d7d438963e5d3045/image5-22.png" />
            
            </figure>
    <div>
      <h3>Search for account-wide products</h3>
      <a href="#search-for-account-wide-products">
        
      </a>
    </div>
    <p>Many Cloudflare products and features are <i>not</i> tied directly to a website or domain that you have set up in Cloudflare, like Workers, <a href="https://www.cloudflare.com/developer-platform/r2/">R2</a>, Magic Transit—not to mention their related sub-pages. Now, you may use <i>quick search</i> to more easily navigate to those sections of the dashboard.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4TgFfEpQ9ewvfU90knvhEe/58f5a2aaecfdf38528eee04bc19c6aa2/image8-6.png" />
            
            </figure>
    <div>
      <h2>What’s next for quick search</h2>
      <a href="#whats-next-for-quick-search">
        
      </a>
    </div>
    <p>Here’s an overview of what’s next on our <i>quick search</i> roadmap (and not yet supported today):</p><ul><li><p>Search results do not currently return results of product- and feature-specific names or configurations, such as Worker names, specific DNS records, IP addresses, Firewall Rules.</p></li><li><p>Search results do not currently return results from <i>within</i> the Zero Trust dashboard.</p></li><li><p>Search results do not currently return results for Cloudflare content living outside the dashboard, like Support or Developer documentation.</p></li></ul><p>We’d love to hear what you think. What would you like to see added next? Let us know using the feedback link found at the bottom of the search window.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/CBp4LkpNA6x8V8Q1uWt0l/02da171b53c08df91c8609b160626c91/image4-23.png" />
            
            </figure>
    <div>
      <h2>Our vision for the future of the dashboard</h2>
      <a href="#our-vision-for-the-future-of-the-dashboard">
        
      </a>
    </div>
    <p>We’re excited to launch <i>quick search</i> and to continue improving our dashboard experience for all customers. Over time, we’ll mature our search functionality to index any and all content you might be looking for — including search results for all product content, Support and Developer docs, extending search across accounts, caching your recent searches, and more.</p><p><i>Quick search</i> is one of many important user experience improvements we are planning to tackle over the coming weeks, months and years. The dashboard is central to your Cloudflare experience, and we’re fully committed to making your experience delightful, useful, and easy. Stay tuned for an upcoming blog post outlining the vision for the Cloudflare dashboard, from our in-app home experience to our global navigation and beyond.</p><p>For now, keep your eye out for the little search icon that will help you in your day-to-day responsibilities in Cloudflare, and if you don’t see it yet, don’t worry—we can’t wait to ship it to you soon.</p><p>If you don’t yet see <i>quick search</i> in your Cloudflare dashboard, you can request early access by filling out <a href="https://forms.gle/wFXsvNCCPpTDPKNw5">this form</a>.</p> ]]></content:encoded>
            <category><![CDATA[Birthday Week]]></category>
            <category><![CDATA[Dashboard]]></category>
            <category><![CDATA[User Research]]></category>
            <category><![CDATA[Beta]]></category>
            <category><![CDATA[Product News]]></category>
            <guid isPermaLink="false">1pMicOaM3g9qNkIWyiAHMP</guid>
            <dc:creator>Emily Flannery</dc:creator>
            <dc:creator>Harley Turan</dc:creator>
        </item>
        <item>
            <title><![CDATA[Dark Mode for the Cloudflare Dashboard]]></title>
            <link>https://blog.cloudflare.com/dark-mode/</link>
            <pubDate>Wed, 29 Sep 2021 12:59:34 GMT</pubDate>
            <description><![CDATA[ Dark mode is now available for the Cloudflare Dashboard in beta! From your user profile, you can configure the Cloudflare Dashboard in light mode, dark mode, or match it to your system settings. ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/61QiOeplrC8eEpodCYr3Vm/db254c79029a092fa9e18903825f65f1/image1-42.png" />
            
            </figure><p>Today, dark mode is available for the Cloudflare Dashboard in beta! From your <a href="https://dash.cloudflare.com/profile">user profile</a>, you can configure the Cloudflare Dashboard in light mode, dark mode, or match it to your system settings.</p><p>For those unfamiliar, dark mode, or light on dark color schemes, uses light text on dark backgrounds instead of the typical dark text on light (usually white) backgrounds. In low-light environments, this can help reduce eyestrain and actually reduce power consumption on OLED screens. For many though, dark mode is simply a preference supported widely by applications and devices.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/58dMu82Wo7DpdqOHsoh66s/15cc1b33d43d29b2d5579751676b81a6/image13-6.png" />
            
            </figure><p>Side by side comparing the Cloudflare dashboard in dark mode and in light mode</p>
    <div>
      <h3>How to enable dark mode</h3>
      <a href="#how-to-enable-dark-mode">
        
      </a>
    </div>
    <ol><li><p>Log into Cloudflare.</p></li><li><p>Go to your <a href="https://dash.cloudflare.com/profile">user profile</a>.</p></li><li><p>Under <b>Appearance</b>, select an option: <i>Light</i>, <i>Dark</i>, or <i>Use system setting</i>. For the time being, your choice is saved into local storage.</p></li></ol>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1k9oNOhJL3UoE6f9bBgilf/04cbb0f7e715ad2fd5d21f659f839c55/image11-6.png" />
            
            </figure><p>The appearance card in the dashboard for modifying color themes</p><p>There are many primers and how-tos on implementing dark mode, and you can find articles talking about the general complications of implementing a dark mode including <a href="https://www.reddit.com/r/explainlikeimfive/comments/hq2s0z/eli5_why_did_it_take_so_much_time_to_introduce/">this straightforward explanation</a>. Instead, we will talk about what enabled us to be able to implement dark mode in only a matter of weeks.</p>
    <div>
      <h3>Cloudflare’s Design System - Our Secret Weapon</h3>
      <a href="#cloudflares-design-system-our-secret-weapon">
        
      </a>
    </div>
    <p>Before getting into the specifics of how we implemented dark mode, it helps to understand the system that underpins all product design and UI work at Cloudflare - the Cloudflare Design System.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2o0p4aO6GndFww4DkORffk/ff5c862d0f14a57b2c8e33d6e7ab8022/image6-22.png" />
            
            </figure><p>The six pillars of the design system: logo, typography, color, layout, icons, videos</p><p>Cloudflare’s Design System defines and documents the interface elements and patterns used to build products at Cloudflare. The system can be used to efficiently build consistent experiences for Cloudflare customers. In practice, the Design System defines primitives like typography, color, layout, and icons in a clear and standard fashion. What this means is that anytime a new interface is designed, or new UI code is written, an easily referenceable, highly detailed set of documentation is available to ensure that the work matches previous work. This increases productivity, especially for new employees, and prevents repetitious discussions about style choices and interaction design.</p><p>Built on top of these design primitives, we also have our own component library. This is a set of ready to use components that designers and engineers can combine to form the products our customers use every day. They adhere to the design system, are battle tested in terms of code quality, and enhance the user experience by providing consistent implementations of common UI components. Any button, table, or chart you see looks and works the same because it <i>is</i> the same underlying code with the relevant data changed for the specific use case.</p><p>So, what does all of this have to do with dark mode? Everything, it turns out. Due to the widespread adoption of the design system across the dashboard, changing a set of variables like background color and text color in a specific way and seeing the change applied nearly everywhere at once becomes much easier. Let’s take a closer look at how we did that.</p>
    <div>
      <h3>Turning Out the Lights</h3>
      <a href="#turning-out-the-lights">
        
      </a>
    </div>
    <p>The use of color at Cloudflare has a well documented history. When we originally set out to build our color system, the <a href="https://color.cloudflare.design">tools we built</a> and the extensive <a href="/thinking-about-color/">research we performed</a> resulted in a ten-hue, ten-luminosity set of colors that can be used to build digital products. These colors were built to be accessible — not just in terms of internal use, but for our customers. Take our blue hue scale, for example.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3PGzm1z3tMdVi7DymNP7uP/1e38bb546fd274bc4349d946466e7e77/image10-6.png" />
            
            </figure><p>Our blue color scale, as used on the Cloudflare Dashboard. This shows color-contrast accessible text and background pairings for each step in the scale.</p><p>Each hue in our color scale contains ten colors, ordered by luminosity in ten increasing increments from low luminosity to high luminosity. This color scale allows us to filter down the choice of color from the 16,777,216 hex codes available on the web to a much simpler choice of just hue and brightness. As a result, we now have a methodology where designers know the first five steps in a scale have sufficient color contrast with white or lighter text, and the last five steps in a scale have sufficient contrast with black or darker text.</p><p>Color scales also allow us to make changes while designing in a far more fluid fashion. If a piece of text is too bright relative to its surroundings, drop down a step on the scale. If an element is too visually heavy, take a step-up. With the Design System and these color scales in place, we’ve been able to design and ship products at a rapid rate.</p><p>So, with this color system in place, how do we begin to ship a dark mode? It turns out there’s a simple solution to this, and it’s built into the JS standard library. We call <code>reverse()</code> and flip the luminosity scales.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/GUZ9MW5PKQYsaTCDWrL8n/d893975cdc0d3783366ae5ec8cc1f7ae/image12-8.png" />
            
            </figure><p>Our blue color scale after calling reverse on it. High luminosity colors are now at the start of the scale, making them contrast accessible with darker backgrounds (and vice-versa).</p><p>By performing this small change within our dashboard’s React codebase and shipping a production preview deploy, we were able to see the Cloudflare Dashboard in dark mode with a whole new set of colors in a matter of minutes.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3n0vUwjdzCS1IWjvK0487K/83aae923cb84ec67ce50ef45779e2c20/image7-9.png" />
            
            </figure><p>An early preview of the Cloudflare Dashboard after flipping our color scales.</p><p>While not perfect, this brief prototype gave us an incredibly solid baseline and validated the approach with a number of benefits.</p><p>Every product built using the Cloudflare Design System now had a dark mode theme built in for free, with no additional work required by teams.</p><p>Our color contrast principles remain sound — just as the first five colors in a scale would be accessible with light text, when flipped, the first five colors in the scale are accessible with dark text. Our scales aren’t perfectly symmetrical, but when using white and black, the principle still holds.</p><p>In a traditional approach of “inverting” colors, we face the issue of a color’s hue being changed too. When a color is broken down into its constituent hue, saturation, and luminosity values, inverting it would mean a vibrant light blue would become a dull dark orange. Our approach of just inverting the luminosity of a color means that we retain the saturation and hue of a color, meaning we retain Cloudflare’s brand aesthetic and the associated meaning of each hue (blue buttons as calls-to-action, and so on).</p><p>Of course, shipping a dark mode for a product as complex as the Cloudflare Dashboard can’t just be done in a matter of minutes.</p>
    <div>
      <h3>Not Quite Just Turning the Lights Off</h3>
      <a href="#not-quite-just-turning-the-lights-off">
        
      </a>
    </div>
    <p>Although our prototype did meet our initial requirements of facilitating the dashboard in a dark theme, some details just weren’t quite right. The data visualization and mapping libraries we use, our icons, text, and various button and link states all had to be audited and required further iterations. One of the most obvious and prominent examples was the page background color. Our prototype had simply changed the background color from white (#FFFFFF) to black (#000000). It quickly became apparent that black wasn’t appropriate. We received feedback that it was “too intense” and “harsh.” We instead opted for off black, specifically what we refer to as “gray.0” or #1D1D1D. The difference may not seem noticeable, but at larger dimensions, the gray background is much less distracting.</p><p>Here is what it looks like in our design system:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/53o6OTIT1cBmThMDNR0aXP/43f973ef4ab2ebbe615ec3e86b0bc7f0/image9-7.png" />
            
            </figure><p>Black background color contrast for white text</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3083uB7mi7KPoGzbGldGJY/ba3a68d98618794e1117428f2c9aee7d/image8-8.png" />
            
            </figure><p>Gray background color contrast for white text</p><p>And here is a more realistic example:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/S5q4EXp6VFsU65wupcmwG/ba61887437a4a331b18d3a7a7afb6df7/image4-27.png" />
            
            </figure><p>lorem ipsum sample text on black background and on gray background</p><p>The numbers at the end of each row represent the contrast of the text color on the background. According to the Web Content Accessibility Guidelines (<a href="https://www.w3.org/WAI/standards-guidelines/wcag/">WCAG</a>), the <a href="https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html">standard contrast ratio for text</a> should be at least 4.5:1. In our case, while both of the above examples exceed the standard, the gray background ends up being less harsh to use across an entire application. This is not the case with light mode as dark text on white (#FFFFFF) background works well.</p><p>Our technique during the prototyping stage involved flipping our color scale; however, we additionally created a tool to let us replace any color within the scale arbitrarily. As the dashboard is made up of charts, icons, links, shadows, buttons and certainly other components, we needed to be able to see how they reacted in their various possible states. Importantly, we also wanted to improve the accessibility of these components and pay particular attention to color contrast.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7DN7Nzw7yW5WKtQXWpfej9/fabb6d2b18a3ac4aa438a5048a765b75/image5-24.png" />
            
            </figure><p>Color picker tool screenshot showing a color scale</p><p>For example, a button is made up of four distinct states:</p><ol><li><p>Default</p></li><li><p>Focus</p></li><li><p>Hover</p></li><li><p>Active</p></li></ol>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3JApmRD2XeF5fhAzjaGCdn/ef0764d345c51fbfea035f637317eb02/image2-44.png" />
            
            </figure><p>Example showing the various colors for states of buttons in light and dark mode</p><p>We wanted to ensure that each of these states would be at least compliant with the AA accessibility standards according to the WCAG. Using a combination of our design systems documentation and a prioritized list of components and pages based on occurrence and visits, we meticulously reviewed each state of our components to ensure their compliance.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1SoATB16O1z2em0u7nfoUq/94a29e459c22bf049d53dfb370a7f730/image3-34.png" />
            
            </figure><p>Side by side comparison of the navbar in light and dark modes</p><p>The navigation bar used to select between the different applications was a component we wanted to treat differently compared to light mode. In light mode, the app icons are a solid blue with an outline of the icon; it’s a distinct look and certainly one that grabs your attention. However, for dark mode, the consensus was that it was too bright and distracting for the overall desired experience. We wanted the overall aesthetic of dark mode to be subtle, but it’s important to not conflate aesthetic with poor usability. With that in mind, we made the decision for the navigation bar to use outlines around each icon, instead of being filled in. Only the selected application has a filled state. By using outlines, we are able to create sufficient contrast between the current active application and the rest. Additionally, this provided a visually distinct way to present hover states, by displaying a filled state.</p><p>After applying the same methodology as described to other components like charts, icons, and links, we end up with a nicely tailored experience without requiring a substantial overhaul of our codebase. For any new UI that teams at Cloudflare build going forward, they will not have to worry about extra work to support dark mode. This means we get an improved customer experience without any impact to our long term ability to keep delivering amazing new capabilities — that’s a win-win!</p>
    <div>
      <h3>Welcome to the Dark Side</h3>
      <a href="#welcome-to-the-dark-side">
        
      </a>
    </div>
    <p>We know many of you have been asking for this, and we are excited to bring dark mode to all. Without the investment into our design system by many folks at Cloudflare, dark mode would not have seen the light of day. You can enable dark mode on the <b>Appearance</b> card in your <a href="https://dash.cloudflare.com/profile">user profile</a>. You can give feedback to shape the future of the dark theme with the feedback form in the card.</p><p>If you find these types of problems interesting, come help us tackle them! We are hiring across <a href="https://boards.greenhouse.io/cloudflare/jobs/3120477?gh_jid=3120477">product</a>, <a href="https://boards.greenhouse.io/cloudflare/jobs/3421232?gh_jid=3421232`">design</a>, and <a href="https://boards.greenhouse.io/cloudflare/jobs/3192227?gh_jid=3192227">engineering</a>!</p> ]]></content:encoded>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Birthday Week]]></category>
            <category><![CDATA[Dashboard]]></category>
            <guid isPermaLink="false">4uk8qSO6sWdJa2f9qzpwki</guid>
            <dc:creator>Garrett Galow</dc:creator>
            <dc:creator>Syeef Karim</dc:creator>
            <dc:creator>Harley Turan</dc:creator>
        </item>
    </channel>
</rss>