
<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>Thu, 09 Apr 2026 15:59:08 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Edge-Side-Includes with Cloudflare Workers]]></title>
            <link>https://blog.cloudflare.com/edge-side-includes-with-cloudflare-workers/</link>
            <pubDate>Mon, 20 Aug 2018 08:00:00 GMT</pubDate>
            <description><![CDATA[ At Cloudflare we’re accelerating web assets in a number of different ways. Part of this is caching, by storing the response given by the origin server directly within our 151+ global data centers. ]]></description>
            <content:encoded><![CDATA[ <p>At Cloudflare we’re accelerating web assets in a number of different ways. Part of this is <a href="https://www.cloudflare.com/cdn/">caching</a>, by storing the response given by the origin server directly within our <a href="https://www.cloudflare.com/network/">151+ global data centers</a>. This will dramatically improve the delivery of the resources as the visitor will directly get them from the data center closest to them, instead of waiting for us to fetch the request from the origin web server.</p>
    <div>
      <h3>The issue with dynamic (but not a lot) pages</h3>
      <a href="#the-issue-with-dynamic-but-not-a-lot-pages">
        
      </a>
    </div>
    <p>The subject we’re gonna cover today is the concept of Edge-Side-Includes. And what’s better than a real use-case to introduce what it is used for? Let’s take a website where all pages are including advertisements at the head and bottom. Could we consider these pages static? We couldn’t as at least part of this page is dynamic. Could we consider caching it? That’s a no again as it would mean the first dynamic part rendered will be cached and served for the other visitors trying to get the page. It would be a catastrophe if the advertisements are user-specific.</p><p>So the issue here is that we can’t cache the page. That’s quite a shame as it means that we’ll fetch the page again, and over again for every new request just to get this 1% portion of dynamic content.</p>
    <div>
      <h3>Counter-measure with delta-compression?</h3>
      <a href="#counter-measure-with-delta-compression">
        
      </a>
    </div>
    <p>Back in time, we’ve released <a href="https://www.cloudflare.com/website-optimization/railgun/">Railgun</a>, which consist in doing delta-compression of the requests received by a web server so Railgun listener could just send the delta bytes since the last request. We’re also working on the inclusion of this delta-compression in our <a href="/argo-tunnel/">Argo Tunnel</a> listener, which is a small agent opening tunnels to us so you don’t even have to have your applications public on the internet, a simple outbound HTTPS access is enough to publish, secure and accelerate applications on Internet.</p><p>In both cases, we’ll need to fetch the complete webpage in order to calculate the difference from the last request, right? This is where Edge-Side-Includes takes place.</p><p>The Edge-Side-Includes standard has been submitted to the W3C (<a href="https://www.w3.org/TR/esi-lang">https://www.w3.org/TR/esi-lang</a>) in August 2001 and defines an XML markup language that can be inserted in HTML or other text based contents which defines how interstitial proxies/CDNs need to combine static and dynamic portion and were to get them. The result is that it’s possible to keep those 99% in cache and for the remaining 1%, the interstitial cache proxy will fetch directly from the destination defined in the Edge-Side-Include block for finally combining both static and dynamic parts and sending the final webpage to the visitor.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/31aYZUXaOHwqH6Aw2OQVqn/a89c67de77722e00e6c27173d03a8bea/static-and-dynamic-content-diagram-blog-post-edge-side-workers_2x-1.png" />
            
            </figure><p>ESI block example:</p>
            <pre><code>&lt;esi:include src="http://example.com/1.html" alt="http://bak.example.com/2.html" onerror="continue"/&gt;</code></pre>
            
    <div>
      <h3>Implementing it in a Worker</h3>
      <a href="#implementing-it-in-a-worker">
        
      </a>
    </div>
    <p>We released months ago <a href="https://www.cloudflare.com/products/cloudflare-workers/">Cloudflare Workers</a>, our serverless framework which helps to implement custom logics directly within the Edge. The Workers are triggering in the path of the requests and the responses and can manipulate almost everything and spin subrequests on-the-fly.This could dramatically improve the time to action for the implementation of new logics on your applications since you won’t have to modify them anymore as this can directly be done in the Edge, even if your applications are <a href="https://www.cloudflare.com/developer-platform/solutions/hosting/">hosted</a> on a bunch of different locations (Cloud and on-premise).</p><p>This scenario sounds then quite compatible with what we can achieve with Cloudflare Workers. For memories, here are the actions the EDGE needs to do for implementing the ESIs:</p><ul><li><p>Fetching the static content</p></li><li><p>Searching in the payload for any <code>&lt;esi:include/&gt;</code> blocks</p></li><li><p>Fetching separately every ESI blocks found</p></li><li><p>Merging the static and dynamic contents</p></li><li><p>Sending the whole new payload to visitors</p></li></ul><p>For this purpose, I created a small page on my test web server, with the following content:</p>
            <pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;ESI Demonstration&lt;/title&gt;
&lt;script src="/cdn-cgi/apps/head/FRz8JyVlvChltLiN7yAq762_k_A.js"&gt;&lt;/script&gt;&lt;/head&gt;
&lt;link rel="stylesheet" href="main.css"&gt;
&lt;img align="absmiddle" SRC="./images/logo.jpg"&gt;
&lt;body&gt;
&lt;h1&gt;Cloudflare Edge-Side-Include demonstration&lt;/h1&gt;
&lt;h3&gt;How to ESI with Cloudflare&lt;/h3&gt;
&lt;p&gt;ESI (or Edge-Side-Include consist in fetching a globally static page with some dynamic fragment, this can be done directly from our EDGE with the workers, where the HTML page would be like that one:&lt;/p&gt;
&lt;p&gt;Dynamic portion coming from https://httpbin.org/headers:&lt;/p&gt;
&lt;esi:include src="https://httpbin.org/headers" onerror="continue" /&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
            <p>So in this page we can see that most of the content will be static and we can find just before the end of the <code>&lt;body&gt;</code> an ESI pointing to <a href="https://httpbin.org/headers">https://httpbin.org/headers</a> that the Edge will need to combine with the static content, in place of the ESI block.</p>
    <div>
      <h2>The worker explained</h2>
      <a href="#the-worker-explained">
        
      </a>
    </div>
    
            <pre><code>addEventListener("fetch", event =&gt; {
  event.respondWith(fetchAndStream(event.request))
  event.passThroughOnException()
})

async function fetchAndStream(request) {
  let response = await fetch(request)
  let contentType = response.headers.get('content-type')

  if (!contentType || !contentType.startsWith("text/")) {
    return response
  }
  let { readable, writable } = new TransformStream()
  let newResponse = new Response(readable, response)
  newResponse.headers.set('cache-control', 'max-age=0')
  streamTransformBody(response.body, writable)
  return newResponse
}</code></pre>
            <p>This is the main portion of the script, testing first if the response is text-based and return the content directly to the visitor if not. Then instanciating a stream pipeline to send to the visitor using a specific function called <code>streamTransformBody()</code> in charge of the payload chunking.</p><p>You'll notice that I'm setting a <code>max-age=0</code> cache-control header in the response as I don't want browsers to cache this response in case of a bad configuration on the Origin side.</p><p>I’m also declaring this script as fail-safe so that the request will go through normally if raising an Exception. More debugging information can be found <a href="https://developers.cloudflare.com/workers/writing-workers/debugging-tips/">on our developer HUB</a>. Feel free to adapt for your use-cases and for example sending the Exception to a specific header, or even fancier <a href="/dogfooding-edge-workers/">sending the event to a logging tool</a>.</p>
            <pre><code>async function handleTemplate(encoder, templateKey) {
  const linkRegex = /(esi:include.*src="(.*?)".*\/)/gm
  let result = linkRegex.exec(templateKey);
  let esi
  if (!result) {
    return encoder.encode(`&lt;${templateKey}&gt;`);
  }
  if (result[2]) {
    esi = await subRequests(result[2]);
  }
  return encoder.encode(
    `${esi}`
  );
}</code></pre>
            <p>In this portion, we’re receiving the chunks and searching for ESI blocks and if found, getting the dynamic parts. You can see that when the regex is matching, we’re calling a <code>subRequest()</code> function. This function will fetch the content of the ESI destination and return + encode the received payload.</p>
            <pre><code>async function subRequests(target){
  const init = {
            method: 'GET',
            headers: {
                'user-agent': 'cloudflare'
            }
        }
  let response = await fetch(target, init)
  let text = await response.text()
  
  return text
}</code></pre>
            <p>This portion is quite simple as it defines the function that does the subrequest to the ESI destination, pay attention to what the Origin server is serving as cache-control response header for those dynamic parts as we want to keep them dynamic and not cached by Cloudflare. It’s also possible to override the TTL via Cloudflare directly if you don’t want to modify your application. The documentation about how to manipulate Cloudflare features is available <a href="https://developers.cloudflare.com/workers/reference/cloudflare-features/">on the developers HUB</a></p>
            <pre><code>async function streamTransformBody(readable, writable) {
  const startTag = "&lt;".charCodeAt(0);
  const endTag = "&gt;".charCodeAt(0);
  let reader = readable.getReader();
  let writer = writable.getWriter();

  let templateChunks = null;
  while (true) {
    let { done, value } = await reader.read();
    if (done) break;
    while (value.byteLength &gt; 0) {
      if (templateChunks) {
        let end = value.indexOf(endTag);
        if (end === -1) {
          templateChunks.push(value);
          break;
        } else {
          templateChunks.push(value.subarray(0, end));
          await writer.write(await translate(templateChunks));
          templateChunks = null;
          value = value.subarray(end + 1);
        }
      }
      let start = value.indexOf(startTag);
      if (start === -1) {
        await writer.write(value);
        break;
      } else {
        await writer.write(value.subarray(0, start));
        value = value.subarray(start + 1);
        templateChunks = [];
      }
    }
  }
  await writer.close();
}</code></pre>
            <p>In the <code>streamTransformBody()</code> function, I’m chunking the payload received in the readable object with specific boundaries in order to avoid chunks to terminate in the middle of a line or worse, in the middle of an ESI block.</p>
            <pre><code>async function translate(chunks) {
  const decoder = new TextDecoder();

  let templateKey = chunks.reduce(
    (accumulator, chunk) =&gt;
      accumulator + decoder.decode(chunk, { stream: true }),
    ""
  );
  templateKey += decoder.decode();

  return handleTemplate(new TextEncoder(), templateKey);
}</code></pre>
            <p>The <code>translate()</code> function decode the chunks and send the stringified payload to the <code>handleTemplate()</code> function, which is for memories intended to properly replace the ESI by the dynamic pieces.</p><p>The complete worker script</p>
            <pre><code>addEventListener("fetch", event =&gt; {
  event.respondWith(fetchAndStream(event.request))
  event.passThroughOnException()
})

async function fetchAndStream(request) {
  let response = await fetch(request)
  let contentType = response.headers.get('content-type')

  if (!contentType || !contentType.startsWith("text/")) {
    return response
  }
  let { readable, writable } = new TransformStream()
  let newResponse = new Response(readable, response)
  newResponse.headers.set('cache-control', 'max-age=0')
  streamTransformBody(response.body, writable)
  return newResponse
}

async function handleTemplate(encoder, templateKey) {
  const linkRegex = /(esi:include.*src="(.*?)".*\/)/gm
  let result = linkRegex.exec(templateKey);
  let esi
  if (!result) {
    return encoder.encode(`&lt;${templateKey}&gt;`);
  }
  if (result[2]) {
    esi = await subRequests(result[2]);
  }
  return encoder.encode(
    `${esi}`
  );
}

async function subRequests(target){
  const init = {
            method: 'GET',
            headers: {
                'user-agent': 'cloudflare'
            }
        }
  let response = await fetch(target, init)
  let text = await response.text()
  
  return text
}

async function streamTransformBody(readable, writable) {
  const startTag = "&lt;".charCodeAt(0);
  const endTag = "&gt;".charCodeAt(0);
  let reader = readable.getReader();
  let writer = writable.getWriter();

  let templateChunks = null;
  while (true) {
    let { done, value } = await reader.read();
    if (done) break;
    while (value.byteLength &gt; 0) {
      if (templateChunks) {
        let end = value.indexOf(endTag);
        if (end === -1) {
          templateChunks.push(value);
          break;
        } else {
          templateChunks.push(value.subarray(0, end));
          await writer.write(await translate(templateChunks));
          templateChunks = null;
          value = value.subarray(end + 1);
        }
      }
      let start = value.indexOf(startTag);
      if (start === -1) {
        await writer.write(value);
        break;
      } else {
        await writer.write(value.subarray(0, start));
        value = value.subarray(start + 1);
        templateChunks = [];
      }
    }
  }
  await writer.close();
}

async function translate(chunks) {
  const decoder = new TextDecoder();

  let templateKey = chunks.reduce(
    (accumulator, chunk) =&gt;
      accumulator + decoder.decode(chunk, { stream: true }),
    ""
  );
  templateKey += decoder.decode();

  return handleTemplate(new TextEncoder(), templateKey);
}</code></pre>
            
    <div>
      <h3>Testing the script</h3>
      <a href="#testing-the-script">
        
      </a>
    </div>
    <p>Testing is easy, we’re going to cURL over the URL having my small HTML code presented earlier in the article, and see what looks like the answer.</p><p>cURL command:</p>
            <pre><code>curl https://www.justalittlebyte.ovh/esi.html -sv 2&gt;&amp;1 | grep -E "Cf-Ray|cf-cache-status|cf-ray"</code></pre>
            <p>The grep is trying to catch few things:</p><ul><li><p>First CF-Ray is for the request itself</p></li><li><p>CF-Cache-Status is the header Cloudflare is using indicating if the requests has been fetched from the cache</p></li><li><p>Second CF-Ray is the CF-Ray coming from the call made to <a href="https://httpbin.org/headers">https://httpbin.org/headers</a>, this will change as the CF-Ray is unique for any new requests made through our Edge</p></li></ul><p>The answer is that one</p>
            <pre><code>&lt; cf-cache-status: HIT 
&lt; cf-ray: 447b3a379ce8bc3e-LHR
    "Cf-Ray": "447b3a37d217bc3e-IAD",</code></pre>
            <p>Doing it again</p>
            <pre><code>&lt; cf-cache-status: HIT
&lt; cf-ray: 447b3a3c4b5fbc44-LHR
    "Cf-Ray": "447b3a3c61f5bc44-IAD",</code></pre>
            <p>and the page looks like this</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7tCYMjbCNgA3iSj8ys9n2x/5ceaf30d5b3399e2c11eba854fe5f5a7/ESI_Demonstration.jpg" />
            
            </figure><p>The most interesting comes from the cf-cache-status where we can see that the page is actually coming from our cache but the worker modified the payload as he detected an ESI block.</p>
    <div>
      <h3>Share your worker recipes</h3>
      <a href="#share-your-worker-recipes">
        
      </a>
    </div>
    <p>You can find additional worker recipes and examples in our <a href="https://developers.cloudflare.com/workers/recipes/">official documentation</a></p><p>Have you written a worker that you'd like to share? <a>Send it to us</a> and you might get featured on our blog or added to our Cloudflare worker recipe collection with a credit.</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Workers]]></category>
            <category><![CDATA[Serverless]]></category>
            <category><![CDATA[JavaScript]]></category>
            <category><![CDATA[Programming]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <guid isPermaLink="false">3VUhOzE9CR0G9U2E9MggU5</guid>
            <dc:creator>Stephane Nouvellon</dc:creator>
        </item>
        <item>
            <title><![CDATA[1 year and 3 months working at Cloudflare: How is it going so far?]]></title>
            <link>https://blog.cloudflare.com/1-year-and-3-months-working-at-cloudflare-how-is-it-going-so-far/</link>
            <pubDate>Thu, 19 Apr 2018 17:21:04 GMT</pubDate>
            <description><![CDATA[ This post is inspired by a very good blog post from one of my colleague in the US, which I really appreciated as I was a newcomer to the company. It was great to see what it is like working for Cloudflare after one year and to learn from the lessons she had learnt. ]]></description>
            <content:encoded><![CDATA[ <p>This post is inspired by a very good blog post from one of my colleagues in the US, which I really appreciated as I was a newcomer to the company. It was great to see what it is like working for Cloudflare after one year and to learn from the lessons she had learnt.</p><p>I'll try to do the same in three parts. Beginning with how my on-boarding went, my first customer experiences and finally what is my day-to-day life at Cloudflare. These writings only reflect my personal feelings and thoughts. The experience is different for each and every newcomer to Cloudflare.</p>
    <div>
      <h3>Chapter 1 - On-boarding, being impressed and filling the (big) knowledge gaps.</h3>
      <a href="#chapter-1-on-boarding-being-impressed-and-filling-the-big-knowledge-gaps">
        
      </a>
    </div>
    <p>Before I joined Cloudflare, I was working as a Security Consultant in Paris, France. I never had the opportunity to move abroad to speak English (<code>me.englishLevel = 0</code>), I never had any reason to live outside of France and was at the same time looking for another Job. Perfect then!</p><p>When I saw the job posting, I immediately applied as I knew the company well, the mindset and the products Cloudflare provided. It took me 6 months to get the offer probably because I was abroad and the French-speaking team was still under construction, to be honest, I would have given it a year if it was needed.At Cloudflare, every new Solutions Engineer is sent to San Francisco for about a month to get a proper onboarding.</p>
    <div>
      <h4>This has primarily served three purposes:</h4>
      <a href="#this-has-primarily-served-three-purposes">
        
      </a>
    </div>
    <ul><li><p>Meet people,</p></li><li><p>Understand the Sales pitch</p></li><li><p>Be technically prepared to face the customers!</p></li></ul><p>I was optimistic in meeting the criteria with four weeks of training in SFO. However, I quickly changed my mind after the first hour! Thinking "This is really tough." I literally had to learn two languages, English and Cloudflarian.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5DRN1p8Cmnq98iMbZcRsDW/5f82c8e880326fec5da48c8797fef5d1/image2018-3-22_15-9-20.png" />
            
            </figure><p>Post on linkedin I shared as I was so excited to start, that shows how hyped I was</p><p>For learning English, I decided to postpone as I had so many things to learn, I was meeting with (impressive) people talking about a product as if I never heard about it before. For me, Cloudflare was a plug-and-play product implementing complex things in a way that kids could setup and understand. Digging deeper I discovered a monster. Not just a simple, well-crafted feature set that can be toggled on/off. but at the same time, a very well furnished product where being a master of a specific piece can take an age to learn!</p>
    <div>
      <h4>Things I learnt:</h4>
      <a href="#things-i-learnt">
        
      </a>
    </div>
    <ul><li><p>People at Cloudflare are impressive. They are at the same time smart, humble, knowledgeable and happy to share/help!</p></li><li><p>Break, reverse-engineer, test, re-break the product with your test zone, that's the best way to not presume but to understand how it works.</p></li><li><p>Ask questions as many as you can. If you're thinking about asking the question it means that's not clear to you so ASK!</p></li><li><p>Cloudflare is a transparent company, use this to your advantage to learn by yourself! We've got access to every single line of code of the product, if you're asking yourself how something works, just dig into the code or ask someone to point you to the correct portion of the codebase.</p></li><li><p>The internal WIKI is your new god!</p></li></ul>
    <div>
      <h3>Chapter 2 - Come back to London and First customer experience</h3>
      <a href="#chapter-2-come-back-to-london-and-first-customer-experience">
        
      </a>
    </div>
    <p>After the 4 weeks, I was almost dead and my head felt like it had gained kilos not from the SF food but with knowledge, I've gone back to my new home, the UK! Remembering that my girlfriend and I had left the apartment before unpacking the boxes, the joy!</p><p>After the weekend, the big day had arrived! My first day at Cloudflare London, I met the team which I was already quite familiar with given the number of interviews I had during my hiring process. They hadn't changed, they were always so friendly and I felt at home very quickly.</p><p>English level at the time: <b>0 + 4 weeks in SFO</b></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4tip6iEBTwSC67vO1Jh0h5/d9ad75bfa24e4a521a2f61301e78e154/1_year_and_3_months_working_at_Cloudflare__How_is_it_going_so_far__-_Sales_-_Cloudflare_Wiki-1.png" />
            
            </figure><p>My first customer meeting</p><p>When I came back, I was literally thrown on to a call with a customer. Shadowed by a fellow colleague. I was excited and terrified at the same time. I discovered that they were Irish with a very difficult accent. I was not able to understand any words they were saying. Looking at my SE shadow with the MAYDAY eyes (please help me), who let me go it alone for this one, so I kept asking to repeat again and over again for the whole meeting. The customer had been quite nice and was repeating and we finally ended the call with what every customer wants: answers and solutions.</p><p>The calls after, I was gaining more and more confident and able to do them on my own, I was still ending the calls with things to catch up on as I wasn't able to answer directly on the phone. The more calls I had about different subjects, the more I felt capable. I was also noticing my English level improving. Today I'm able to follow a complete call with those Irish folks and it makes me proud to know how far I have come learning a new language.</p>
    <div>
      <h4>Things I learnt:</h4>
      <a href="#things-i-learnt">
        
      </a>
    </div>
    <ul><li><p>A customer has NO reason to challenge you, make fun of you, or judge in any way what you say. The vision you have of your own presentation is ALWAYS perceived worse than what the customer/audience/colleague is observing. Keep this in mind when you need to do a presentation, or in general talk in public.</p></li><li><p>Cloudflare trusts you and when the company hires you. Don't doubt your capabilities, you ARE capable.</p></li><li><p>No need to postpone the opportunities. Put yourself in a challenging situation, make mistakes, that's the way we all learn.</p></li><li><p>Never assume. Ask or verify with someone if you are unsure. You'll never be expected to know everything about everything but just to be able to produce the work needed to get a valuable answer.</p></li></ul>
    <div>
      <h3>Chapter 3 - Mess around and enjoy to be part of the Rocketship</h3>
      <a href="#chapter-3-mess-around-and-enjoy-to-be-part-of-the-rocketship">
        
      </a>
    </div>
    <p>It took me about 4 months before feeling confident in myself and autonomous, I mean autonomous in a sense that I was not discovering a new subject for any new customer or researching general questions, I knew the global subject and that there was one, to be able to dig for myself and to get to the solution I was looking for.</p><p>I started to be by myself, taking the lead on things, being confident (what a sentiment). I started to do things not especially related to my work with customers or prospects like taking time to improve my LUA skills, HTTP knowledge, Python, I wrote my first technical blog article and I even took part of the project of building a sound-level monitoring system based on a Raspberry PI and a decibel meter sending alerts to our internal chat system when the level was too high! Talking with engineers is also so great, discovering what's going on behind the scene, how the product is built and designed you're supposed to be the guru of the product in front of the customers.</p><p>I discovered that no matter the subject you pick-up at Cloudflare, mastering it will take a LONG time, which is quite exciting as I hate to be bored, really. As a Solutions Engineer, you're not asked to master every subject, that's why we're a team and we've our own preferences / natural abilities in terms of technical subjects. We then kind of provide consulting to each other when it's needed, and that's what's great.</p><p>I really enjoy my life at Cloudflare because I see me as my own boss, with deadlines, pipelines, objectives and no matter the path I take, the importance is to reach the target. Personal development is part of it, I was never asked to stop doing non-directly related to customer things, you're even advised to do so. It will give you the satisfaction of doing something that makes sense and challenges you.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/57jxjQMjVxceZnQzHlBYYf/a35e94b95ff4be5f2ba4b40209aff97a/image2018-3-22_15-20-36.png" />
            
            </figure><p>Sweets delivery when we started to <a href="/f-root/">roll-out the DNS F-root</a> (Yeah!)</p><p>The company itself now, and being part of a Rocketship has its advantages. It reassures me of the fact I took the correct decision 1 year and 3 months ago. I'm not saying that because I am career-obsessed but because I see the technical choices we make, how much we're growing, the fact we have such a smart team and we are able to keep it and that gives me the evidence that the fun at Cloudflare isn't going to stop.</p>
    <div>
      <h4>Things I learnt:</h4>
      <a href="#things-i-learnt">
        
      </a>
    </div>
    <ul><li><p>Take time to fill your gaps, you will never be reproached for it.</p></li><li><p>Spend time on what you like and share with the team, don't keep it a secret!</p></li><li><p>Don't carry the whole load on your shoulders because 1) you couldn't afford it for the long term and 2) we're a team and need coverage on subjects.</p></li></ul>
    <div>
      <h3>Conclusion:</h3>
      <a href="#conclusion">
        
      </a>
    </div>
    <p>Working at Cloudflare took a lot of energy at the beginning to keep up the pace with the team. A team which is knowledgeable and keen to share the information is priceless and gives you the mission of reproducing the same with the colleagues asking you for something.</p>
    <div>
      <h4>During the 1 year and 3 months I have been:</h4>
      <a href="#during-the-1-year-and-3-months-i-have-been">
        
      </a>
    </div>
    <ul><li><p>part of the 70th class,</p></li><li><p>we only had at the time <a href="https://www.cloudflare.com/network/">100 data centers</a>,</p></li><li><p>I have visited 3 countries I've never been</p></li><li><p>I've seen the release of</p><ul><li><p><a href="https://www.cloudflare.com/products/argo-smart-routing/">Argo</a>,</p></li><li><p><a href="https://www.cloudflare.com/rate-limiting/">Rate limiting</a>,</p></li><li><p><a href="https://www.cloudflare.com/load-balancing/">Load balancing</a>,</p></li><li><p><a href="https://www.cloudflare.com/website-optimization/ampersand/">Ampersand</a>,</p></li><li><p><a href="https://www.cloudflare.com/products/cloudflare-access/">Access</a>,</p></li><li><p><a href="https://www.cloudflare.com/products/cloudflare-workers/">Workers</a>,</p></li><li><p><a href="https://www.cloudflare.com/products/cloudflare-stream/">Stream</a>,</p></li><li><p><a href="https://www.cloudflare.com/website-optimization/firebolt/">FireBolt</a>,</p></li><li><p><a href="https://1.1.1.1/">1.1.1.1 DNS resolver</a></p></li><li><p><a href="https://www.cloudflare.com/products/cloudflare-spectrum/">Spectrum</a></p></li><li><p><a href="/cloudflare-apps-2/">Cloudflare Apps Store</a></p></li><li><p><a href="https://www.cloudflare.com/products/mobile-sdk/">Mobile SDK</a></p></li></ul></li></ul><p>Furthermore, I'm still excited delivering my best, day after day, to create a better internet.</p><p>If you’re willing to join an impressive team and work for a very dynamic company to help creating a better internet, <a href="https://www.cloudflare.com/careers/">we’re looking</a> for many different profiles in our different offices over the planet! Let's have a look!</p> ]]></content:encoded>
            <category><![CDATA[Life at Cloudflare]]></category>
            <category><![CDATA[Careers]]></category>
            <guid isPermaLink="false">yCdIhGHLZJCG8i4KsI93M</guid>
            <dc:creator>Stephane Nouvellon</dc:creator>
        </item>
    </channel>
</rss>