
<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>Mon, 13 Apr 2026 18:04:06 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Cloudflare Apps Fund 2.0]]></title>
            <link>https://blog.cloudflare.com/app-fund-2-0/</link>
            <pubDate>Fri, 30 Nov 2018 08:52:00 GMT</pubDate>
            <description><![CDATA[ Today we are launching the second iteration of the Cloudflare App Developer Fund. This is an investment fund started in partnership with Venrock, Pelion Venture Partners, and New Enterprise Associates. ]]></description>
            <content:encoded><![CDATA[ <p>Today we are launching the second iteration of the Cloudflare App Developer Fund.</p><p>This is an investment fund started in partnership with Venrock, Pelion Venture Partners, and New Enterprise Associates. We created the fund to provide developers with resources so that they can build apps using the Cloudflare network and our serverless product, <a href="https://www.cloudflare.com/products/cloudflare-workers/">Workers</a>, which enables developers to create applications without configuring or maintaining infrastructure. The goal is to fuel a new economy that grows into a thriving ecosystem so that developers’ serverless innovations can enjoy commercial success.  </p><p>Cloudflare Apps with Workers allows developers to package Workers, delivering new worker-powered experiences to Cloudflare customers, all within a few clicks via <a href="https://www.cloudflareapps.com/">Cloudflare Apps</a>.</p><p>Our CTO, John Graham-Cumming talks about it in a recently recorded video:</p><p>In short, Cloudflare is looking for apps that will advance our mission to help build a better Internet: one that is safe, fast and reliable.   We are seeking out apps that have a clear vision, delight customers by the ease of use and align with our vision. Having already seen multiple use cases around custom application security, data loss prevention, and bot mitigation, we can’t wait to see what else you come up with.</p><p>We welcome apps coming from a variety of sources, ranging from standalone developers who have identified a particular market opportunity, to engineers who realize their internal idea has utility for a wider audience.  Since our beta launch of <a href="/introducing-apps-with-workers/">Cloudflare Apps with Workers</a> we’ve already seen keen interest across developers who are looking to bundle and deliver complex worker logic for anyone else to consume by publishing to the Apps marketplace.  </p><p>With our fund we are helping this move faster.</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Serverless]]></category>
            <category><![CDATA[Cloudflare Workers]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <guid isPermaLink="false">513cyM4ylYgdvtlLWfspQS</guid>
            <dc:creator>Jonathan Bruce</dc:creator>
        </item>
        <item>
            <title><![CDATA[Introducing Apps with Workers]]></title>
            <link>https://blog.cloudflare.com/introducing-apps-with-workers/</link>
            <pubDate>Fri, 16 Nov 2018 15:00:00 GMT</pubDate>
            <description><![CDATA[ Since its inception, Cloudflare Apps has made it possible for website owners to install a tool or a service directly onto a domain they have that lives on the Cloudflare network. ]]></description>
            <content:encoded><![CDATA[ <p>Since its inception, <a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a> has made it possible for website owners to install a tool or a service directly onto a domain they have that lives on the Cloudflare network.  As an App Developer, you’ve had the ability to deliver your product by modifying traffic and content of a user’s website using a combination of Javascript, HTML, CSS injection with the ability to modify Cloudflare features such as DNS.</p><p>Today we are announcing a public beta for our Cloudflare Apps with Workers!  If you are a developer who has been using Workers or Cloudflare Apps, this is a significant step forward to bring together our server-less platform allowing you the next wave of innovation in the Cloudflare marketplace.</p><p>Wait!  Yet more Workers news?  It’s already been a furious year of releases for Workers, from our GA launch in February to numerous improvements including the beta of Cache API and a flurry of updates during Cloudflare’s Birthday week, where we made available our K/V Storage and WASM support.  With this beta, developers can now package all Workers capabilities, deliver new worker-powered experiences to Cloudflare customers all within a few clicks via Cloudflare Apps.</p><p>Now your Apps can be more powerful, and Workers code running on the Cloudflare network are the engine that can take you there.   If you’ve successfully built and deployed a worker on your own domain, you can package it as an App and bring your idea to the Cloudflare Marketplace.  </p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2HUeaGOjSurGZn1Uirfs38/3706aa58600fdc5053dac63974783e4a/workers-marketplace-apps-_2x.png" />
            
            </figure><p>Apps and Workers Life of a Request</p><p>New App experiences are possible including but not limited to personalization, experimentation with A/B testing, custom security, content validation, and localization.</p>
    <div>
      <h3>How Do I Build An App with Cloudflare Workers?</h3>
      <a href="#how-do-i-build-an-app-with-cloudflare-workers">
        
      </a>
    </div>
    <p>To package a Worker in your App as an additional resource in your <a href="https://www.cloudflare.com/apps/developer/docs/install-json"><i>install.json</i></a>, simply add a reference to your Worker script similar to how <a href="https://www.cloudflare.com/apps/developer/docs/dns">DNS entries</a> were declared before.</p>
            <pre><code>{
	"resources": [...],
	"hooks": [...],
	"workers": [{
		"src": "./worker.js"
	}]
}</code></pre>
            <p>You can also deliver custom variables as <a href="https://www.cloudflare.com/apps/developer/docs/environment">install options</a> which can then be referenced in Workers; useful for apps who may need to include a service specific token at App install time.</p>
            <pre><code>// inside src/worker.js
addEventListener('fetch', event =&gt; {
  event.respondWith(workerFn(event.request))
  let someOptionFromInstall = INSTALL_OPTIONS.UserAgents // UserAgents was selected by siteowner in previewer
})</code></pre>
            
    <div>
      <h3>Does the Approval Process Change?</h3>
      <a href="#does-the-approval-process-change">
        
      </a>
    </div>
    <p>As before, when you submit your app for approval and review, the submission process will gather your app  and worker  sources and make it available for our Moderation Team to review.  Once successfully through the Moderation process, you can expect an additional Security Review of your Worker, before this app will be made available just like any App is today.</p>
    <div>
      <h3>How Can I Apply to the Beta?</h3>
      <a href="#how-can-i-apply-to-the-beta">
        
      </a>
    </div>
    <p>Back in August, we <a href="/growing-the-cloudflare-apps-ecosystem/">announced</a> the upcoming App with Worker capability and since then we’ve seen great interest across our developers and partners who are eager to put their Workers based solutions into the hands to a much broader audience We are continuing to welcome new App Developers in our beta. Apply below to be part of our beta program.</p><p><a href="https://www.cloudflare.com/products/cloudflare-workers/#otherways">Sign-up to Join the beta!</a></p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Cloudflare Workers]]></category>
            <category><![CDATA[Serverless]]></category>
            <category><![CDATA[Programming]]></category>
            <category><![CDATA[JavaScript]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <guid isPermaLink="false">7o1UnGaBJJwv4g9wsPwRB9</guid>
            <dc:creator>Jonathan Bruce</dc:creator>
        </item>
        <item>
            <title><![CDATA[Growing the Cloudflare Apps Ecosystem]]></title>
            <link>https://blog.cloudflare.com/growing-the-cloudflare-apps-ecosystem/</link>
            <pubDate>Thu, 02 Aug 2018 17:26:46 GMT</pubDate>
            <description><![CDATA[ Starting today we are announcing the availability of two key pilot programs: Cloudflare Apps with Workers and 
Cloudflare Workers Service Providers. Over the course of past few months we've seen an accelerating interest in Workers. ]]></description>
            <content:encoded><![CDATA[ <p>Starting today we are announcing the availability of two key pilot programs:</p><ul><li><p><a href="https://www.cloudflare.com/products/cloudflare-workers/#otherways">Cloudflare Apps with Workers</a></p></li><li><p><a href="https://www.cloudflare.com/partners/services/">Cloudflare Workers Service Providers</a></p></li></ul><p>Why now? Over the course of the past few months we've seen accelerating interest in Workers, and we frequently field the question on what we are doing to combine our growing ecosystem around Workers, and our unique deliverability capability, Cloudflare Apps. To meet this need, we have introduced two programs, Apps with Workers and Workers Service Providers. Let’s dig into the details:</p><p>First, we are announcing the <b>upcoming</b> availability of Cloudflare Apps, powered by embeddable Workers. This will allow any developer to build, deploy and in the near future <b>package</b> Workers to distribute to third parties, all using the Cloudflare Apps platform. It will be, in effect, the world's first serverless Apps platform.</p><p>Today, it's easy to develop Workers using our <a href="https://www.cloudflareworkers.com/">UI</a> or <a href="https://developers.cloudflare.com/workers/api/">API</a>. The ability to App-ify Workers opens up a whole new promise to those who prefer to deal in clicks and not code. For our Apps developers, Apps with Workers allows for more complex Apps offerings running on Cloudflare, and for our customers the next generation in Apps. So, while we are actively putting the finishing touches on this capability we are opening up this pilot program for select developers. We have a limited early access to program. To apply, click <a href="https://www.cloudflare.com/products/cloudflare-workers/#otherways">here</a> for more details.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/CGXKM96OxiNjqc5bZwrC5/8e22ff21917f2b8635afaed89e66c6d0/app-stand-marketplace-_0.5x-1.png" />
            
            </figure><p>Second, we are announcing the <b>upcoming</b> availability of <a href="https://www.cloudflare.com/partners/services/">Cloudflare Worker Service providers</a>. While many Cloudflare customers write Cloudflare Workers for themselves, many customers want to focus on their core business and bring in the development expertise when they need it. The goal is simple: make it easy for our customers to connect to an ecosystem of developers and Apps, and to grow a vibrant marketplace around customers and partners. Moving forward, in addition to Apps, we will support the ability to post Solutions and Services backed by a curated set of consultants, experts and System Integrators, all adding a new richness to the Cloudflare ecosystem. We are excited to <a href="https://www.cloudflare.com/partners/services/">hear</a> from our community so drop us a <a href="https://www.cloudflare.com/partners/services/">line</a>.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6xQcCr1EY9SmoC8Afnubj3/f262ee95c6e5d50558c607957207141b/customize_0.5x.png" />
            
            </figure> ]]></content:encoded>
            <category><![CDATA[Cloudflare Workers]]></category>
            <category><![CDATA[Serverless]]></category>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <guid isPermaLink="false">3EurYSPnqAzObf7R7Gpzul</guid>
            <dc:creator>Jonathan Bruce</dc:creator>
        </item>
        <item>
            <title><![CDATA[DroneDeploy and Cloudflare Workers]]></title>
            <link>https://blog.cloudflare.com/dronedeploy-and-cloudflare-workers/</link>
            <pubDate>Thu, 21 Jun 2018 16:36:59 GMT</pubDate>
            <description><![CDATA[ When we launched Workers much of the focus was on use cases surrounding websites running on origins that needed extra oomph. With Workers you can easily take a site and introduce a raft of personalization capabilities around a range of services. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Images courtesty of <a href="https://www.dronedeploy.com/">DroneDeploy</a></p><p>When we launched <a href="/cloudflare-workers-is-now-on-open-beta/">Workers</a> a few months ago, much of the focus was on use cases surrounding websites running on origins that needed extra oomph. With Workers you can easily take a site, introduce a raft of personalization capabilities, A/B test changes or even aggregate a set of API responses around a range of services. In short by layering in Cloudflare Workers we can take origin websites and do transformational things.</p><p>One of the joys of a platform, is that you never know where you are going to see the next use case. Enter <a href="https://www.dronedeploy.com/">DroneDeploy</a></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4OM3J7Ic30OYj2Ha59eYAI/47cd5c3c81fb8d2e13e13cc714143356/image3.png" />
            
            </figure><p>DroneDeploy is a cloud platform that makes it easy to collect and analyze drone imagery and data. Simply install DroneDeploy on your mobile device and connect to a DJI drone. DroneDeploy flies the drone, collects the imagery, then stitches the photos into maps.</p><p>The maps can show things like crop conditions &amp; stress, construction project progress, or even thermal temperature ranges across vast solar farms or for search and rescue situations.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6rcQSI5FDuk6f07bzDruMt/f8348b8dd66ff21e8f9db57bea80caf2/image6.png" />
            
            </figure><p>Using plant health algorithms applied to drone-generated maps, growers can pinpoint crop stress in their fields and stomp out pests, disease, or irrigation issues.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3gv9ODUNXk7i4USJpQ7uWq/d2fb1aab0843b9071414706503fab54b/image1.png" />
            
            </figure><p>With Thermal Live Map, it’s possible to inspect solar farms from the sky in minutes to detect broken photocells in solar panels that are in need of repair.</p><p>You can then upload the images to the cloud and make high res maps and 3D models. With these you can perform deeper analysis (such as volumes, distances, plant health, etc), share and collaborate with coworkers, or move the maps and models into applications like CAD or Agriculture Management Platforms.</p><p>Check out how we were able to draw a flight path over Cloudflare’s HQ. The drone flew around the building and captured imagery that we turned into a map and 3D model.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5xRPCYci9Oe5uZ7Pc5iIeF/34e45982965978da43155ab1bd9e4c4a/Screen-Shot-2018-06-21-at-10.08.50-AM.png" />
            
            </figure>
    <div>
      <h4>So how is DroneDeploy using Workers? And why is it important to DroneDeploy?</h4>
      <a href="#so-how-is-dronedeploy-using-workers-and-why-is-it-important-to-dronedeploy">
        
      </a>
    </div>
    <p>It’s important to understand that they want to maintain architectural freedom around the many services they use to make their service. As with many software stacks today, they use GCP, AWS, and others, but they want to maintain flexibility in their network routing and authentication layer.</p><p>By offering a dramatically better experience to drone users in the field, they can both push the authentication out in front of a <a href="https://www.cloudflare.com/learning/cdn/what-is-a-cdn/">CDN</a> and also serve collected images directly from our CDN (typically hundreds or thousands of tiles used to render maps or 3D models). Many of DroneDeploy’s users operate in highly variable network conditions on job sites or in the field. Workers allows them to push their authentication to the edge; and use Workers to build a custom signed URL to ensure the correct images are surfaced to the correct consumer - in effect ensuring their multi-tenancy image storage model is safe guarded at the edge. To do this, DroneDeploy employs a URL authentication method commonly known as request signing which uses the Web Crypto API.</p><p>Commenting on this Eric Hauser, VP Engineering of DroneDeploy detailed the upside of Cloudflare Workers for his team:</p><blockquote><p><i>Cloudflare Workers provided us with flexibility when we ran into limitations with the shared capabilities of our primary infrastructure providers CDNs. Unique enterprise requirements around authentication, data security, and locality require us to have flexibility at our routing layer. From just the work we’ve done around authentication to date, we see an exciting and productive relationship with Cloudflare.</i></p></blockquote><p>Let's peel back the layers and understand how they use Workers.</p><p>DroneDeploy uses standard JWT authentication - if you are not sure what a JWT Token is, read more <a href="https://jwt.io/">here</a>. So the general flow requires the Worker to:</p><ol><li><p>Intercept requests for images from the DroneDeploy mobile app or website. These requests can number in the hundreds or thousands of image tiles all of which are needed to render a typical map or 3D model and are stored on either S3 or Google Cloud Storage.</p></li><li><p>Ensure the correct JSON Web Token (JWT) is present.</p></li><li><p>Assuming the token is valid, HMAC sign the URL, set cache headers, and return the appropriate file.</p></li></ol><p>Let's look at each step - note we filtered out some components of the code for security reasons.</p>
            <pre><code>addEventListener('fetch', event =&gt; {
  event.respondWith(handleFetch(event.request))
});

/**
 * Intercept a request
 * Validate the provided JWT credentials
 * If valid: 
 *   rewrite the request to the storage backend 
 *   sign the request with our backend credentials
 *   return the response from the storage backend
 * If not valid:
 *   return a 403 Forbidden response
 */
function handleFetch(request) {
  if (!(await isValidJwt(request))) {
    return new Response('Invalid JWT', { status: 403 })
  }
  const gsBaseUrl = createGoogleStorageUrl(request);
  const gsHeaders = new Headers();
  gsHeaders.set('Date', new Date().toUTCString());  // Required by Google for HMAC signed URLs
  const signature =  await hmacSignature(gsBaseUrl, gsHeaders);
  gsHeaders.set('Authorization', 'AWS ' + HMAC_KEY + ':' + signature);
  return fetch(new Request(gsBaseUrl, {headers: gsHeaders}))
}</code></pre>
            <p>Now check for the JWT Token</p>
            <pre><code>/**
 * Parse the JWT and validate it.
 *
 * We are just checking that the signature is valid, but you can do more that. 
 * For example, check that the payload has the expected entries or if the signature is expired..
 */ 
async function isValidJwt(request) {
  const encodedToken = getJwt(request);
  if (encodedToken === null) {
    return false
  }
  const token = decodeJwt(encodedToken);
  return isValidJwtSignature(token)
}

/**
 * For this example, the JWT is passed in as part of the Authorization header,
 * after the Bearer scheme.
 * Parse the JWT out of the header and return it.
 */
function getJwt(request) {
  const authHeader = request.headers.get('Authorization');
  if (!authHeader || authHeader.substring(0, 6) !== 'Bearer') {
    return null
  }
  return authHeader.substring(6).trim()
}</code></pre>
            <p>Now decode the JWT Token</p>
            <pre><code>/**
 * Parse and decode a JWT.
 * A JWT is three, base64 encoded, strings concatenated with ‘.’:
 *   a header, a payload, and the signature.
 * The signature is “URL safe”, in that ‘/+’ characters have been replaced by ‘_-’
 * 
 * Steps:
 * 1. Split the token at the ‘.’ character
 * 2. Base64 decode the individual parts
 * 3. Retain the raw Bas64 encoded strings to verify the signature
 */
function decodeJwt(token) {
  const parts = token.split('.');
  const header = JSON.parse(atob(parts[0]));
  const payload = JSON.parse(atob(parts[1]));
  const signature = atob(parts[2].replace(/_/g, '/').replace(/-/g, '+'));
  return {
    header: header,
    payload: payload,
    signature: signature,
    raw: { header: parts[0], payload: parts[1], signature: parts[2] }
  }
}

/**
 * Validate the JWT.
 *
 * Steps:
 * Reconstruct the signed message from the Base64 encoded strings.
 * Load the RSA public key into the crypto library.
 * Verify the signature with the message and the key.
 */
async function isValidJwtSignature(token) {
  const encoder = new TextEncoder();
  const data = encoder.encode([token.raw.header, token.raw.payload].join('.'));
  const signature = new Uint8Array(Array.from(token.signature).map(c =&gt; c.charCodeAt(0)));
  const jwk = {
    alg: 'RS256',
    e: 'AQAB',
    ext: true,
    key_ops: ['verify'],
    kty: 'RSA',
    n: RSA_PUBLIC_KEY
  };
  const key = await crypto.subtle.importKey('jwk', jwk, { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' }, false, ['verify']);
  return crypto.subtle.verify('RSASSA-PKCS1-v1_5', key, signature, data)
}</code></pre>
            <p>Now HMAC sign the URL, and return the file.</p>
            <pre><code>/**
 * Rewrite the URL from the original request to Google Storage API and bucket.
 */
function createGoogleStorageUrl(request) {
  const googlePrefix = 'https://storage.googleapis.com/BUCKET_NAME';
  const path = new URL(request.url).pathname;
  return new URL(googlePrefix + path)
}

/**
 * Create the HMAC signature for the Google Storage URL.
 */
async function hmacSignature(url, headers) {
  const encoder = new TextEncoder()
  const message = createMessage(url, headers)
  const key = await crypto.subtle.importKey('raw', encoder.encode(HMAC_SECRET), {name: 'HMAC', hash: 'SHA-1'}, false, ['sign'])
  const mac = await crypto.subtle.sign('HMAC', key, encoder.encode(message))
  return btoa(String.fromCharCode(...new Uint8Array(mac)))
}

/**
 * Google requires a specific format for the message that is signed.
 * More documentation can be found here:
 * https://cloud.google.com/storage/docs/migrating
 */
function createMessage(url, headers) {
  const verb = 'GET'
  return [
    verb,
    ‘’,  // GET requests don’t have Content-MD5 or Content-Type headers, so use empty strings
    ‘’,
    headers.get(‘Date’),
    url.pathname
  ].join('\n')
}</code></pre>
            <p>So the upside is clear - Authentication at the Edge provides flexibility, and scale but also means that DroneDeploy is not locked into an architecture that would prevent their ability to choose the best-in-class capabilities they need from GCP, AWS and more.</p>
    <div>
      <h4>So where to from here?</h4>
      <a href="#so-where-to-from-here">
        
      </a>
    </div>
    <p>This Worker is the first of a few DroneDeploy are exploring. In next generation Workers, DroneDeploy is looking to deliver a range of improvements all with a view of optimizing their customers experience by using Cloudflare’s cache in addition to other features Cloudflare has to offer. We’ll update the blog at that time.</p><hr /><p><i>If you have a worker you'd like to share, or want to check out workers from other Cloudflare users, visit the </i><a href="https://community.cloudflare.com/tags/recipe-exchange"><i>“Recipe Exchange”</i></a><i> in the Workers section of the </i><a href="https://community.cloudflare.com/c/developers/workers"><i>Cloudflare Community Forum</i></a><i>.</i></p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Workers]]></category>
            <category><![CDATA[JavaScript]]></category>
            <category><![CDATA[API]]></category>
            <category><![CDATA[Serverless]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <category><![CDATA[Developers]]></category>
            <guid isPermaLink="false">6iYHBl9qJvdCK4aAJ2x2Mq</guid>
            <dc:creator>Jonathan Bruce</dc:creator>
        </item>
    </channel>
</rss>