
<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, 02 Apr 2026 15:19:32 GMT</lastBuildDate>
        <item>
            <title><![CDATA[Managing DNS Records For The People With Cloudflare Apps]]></title>
            <link>https://blog.cloudflare.com/managing-dns-records-for-the-people-with-cloudflare-apps/</link>
            <pubDate>Fri, 14 Dec 2018 13:00:00 GMT</pubDate>
            <description><![CDATA[ DNS records are hard.  Many people, even the technically competent, don’t bother to learn more than the basics.  Let Cloudflare Apps manage them for you. ]]></description>
            <content:encoded><![CDATA[ <p>DNS records are hard.  Many people, even the technically competent, don’t understand more than the basics.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2BNUOdCDAKCprD7JjTmFyJ/14dc300ae61602fc38b8824a4f77d3d4/oj1wkqP-2.jpg" />
            
            </figure><p>I'll speak for myself — as someone who always learned just enough about DNS to get it working, then immediately forgot everything until the next time it broke. It was a vicious cycle until I convinced myself to learn it in depth.  Meanwhile, non-technical folks wisely avoid meddling in such dangerous affairs all together.</p><p>Surely, there must be a better way (this is a blog post after all).</p><p>Every day, thousands of Cloudflare users add DNS records to their Internet properties to configure awesome tools like G Suite, Shopify, Wordpress, Ghost, and thousands of others.  A new Cloudflare Apps feature allows apps to <i>automatically set up and manage configurable DNS records</i> on more than 12 million registered domains on the Cloudflare network. In short, Cloudflare Apps are here to alleviate the Internet’s collective DNS woes.</p><p>Gone are the days of tribulating over whether it’s <code>A</code> or <code>CNAME</code> you should set.  Gone are the days of puzzling between <code>A</code> and <code>AAAA</code> records while wondering what the heck happened to <code>AA</code> and <code>AAA</code> records?  Unload your DNS dysphoria onto highly trained developers experienced at explicating these burdensome questions today!</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1TN3eQzdxYjWNti7lhW5Yy/33b375d3bc08c9d9c71c3413b29b3cf8/48380631_342147089944308_3701425961271558144_n.png" />
            
            </figure><p>Did you know?</p><p>Are you a highly trained developer?  Cloudflare now provides the tools to build robust, powerful apps that automate DNS record management saving countless developer hours that are currently spent fiddling with DNS.  Instead of manually configuring records to integrate with your solution provider, build a Cloudflare App that does it for you and <i>for everyone else on the Internet</i>.</p><p><a href="https://www.cloudflare.com/apps/pointless-dns-app">Pointless DNS</a> is a demo app that showcases the new DNS feature by installing a (pointless) <code>TXT</code> record on any root or subdomain of your choice.  The <code>TXT</code> record is configured and managed by the Pointless DNS app.  Go ahead and <a href="https://www.cloudflare.com/apps/uJ2Lfocw919J/install?version=1.0.2">install it</a> to see automated DNS record management with Cloudflare Apps.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7HWXhj18dbUik6DYmtzFWR/47f5b3ec49922c92e727bce382382461/Screen-Shot-2018-12-13-at-2.01.13-PM.png" />
            
            </figure><p>The TXT record name was set to "blog" during installation</p><p>After installation, head over to your <a href="https://dash.cloudflare.com/?zone=dns">DNS dashboard</a> and you'll see the app doing its thing.  If you really want to, you can uninstall it from your <a href="https://dash.cloudflare.com/?zone=apps/installed-apps">Installed Apps</a> page.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4yp3qzIBrOThljl9JBIE5Y/ca85d8d78d15758d3e58658c672c5961/dnsrecord.png" />
            
            </figure><p>Pointless DNS automatically manages its TXT record on my blog subdomain</p><p>To start building your own DNS app, download <a href="https://github.com/cloudflare-apps/create-cloudflare-app">create-cloudflare-app</a> and open it in your preferred text editor.  Below, I’ll explain how Pointless DNS manages its configurable <code>TXT</code> record.</p><p>In the <code>install.json</code> file, you’ll find a <code>dns</code> field that looks like this:</p>
            <pre><code># install.json

"dns": [{
    "type": "TXT",
    "content": "Managed TXT Record",
    "name": "Created by create-cloudflare-app",
    "ttl": 120
  }]</code></pre>
            <p>This says a <code>TXT</code> record will be set up and managed on the app installer's site, which can only be modified or deleted through the app’s configuration page.  Apps can create or modify any type of Cloudflare DNS record available in Cloudflare's <a href="https://api.cloudflare.com/#dns-records-for-a-zone-create-dns-record">DNS API</a>.</p><p>Now let's add in some configuration. Add an install option and point it at your record — <code>options.subdomain</code> will be set to the installer's desire.</p>
            <pre><code># install.json

{
  "options": {
    "properties": {
      "subdomain": {
        "order": 1,
        "type": "string",
        "title": "TXT Record Subdomain",
        "description": "The subdomain of your DNS record",
        "placeholder": "*Required - e.g. [your_domain].com",
        "required": true
      }
    }
  },
  "dns": [{
    "type": "TXT",
    "name": "{{options.subdomain}}",
    "content": "{{options.subdomain}} was set"
  }]
}</code></pre>
            <p>That's all there is to it.  Check out the Cloudflare Apps <a href="https://www.cloudflare.com/apps/developer/docs/dns">docs</a> to learn more about about building DNS apps.  For additional inspiration, consider <a href="https://www.cloudflare.com/apps/mailchannels">Mailchannels</a> — a powerful <a href="https://www.cloudflare.com/zero-trust/products/email-security/">email security solution</a> that manages DNS records to fight off pesky spammers and phishermen.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7AzbUOvIrjUh1J4JEoIFew/109aa50d4bbab4f6d1729a1cc38050c8/unnamed.png" />
            
            </figure><p>Woof!</p><p>DNS records used to be hard, but a new breed of Cloudflare Apps makes them <i>easy</i>.  Cloudflare Apps-based automated DNS configuration gives developers the opportunity to be the hero people want <i>and</i> the hero they need.</p><p><i>NOTE: This post was updated 5 hours after initial publication to include additional, relevant details.</i></p> ]]></content:encoded>
            <category><![CDATA[DNS]]></category>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Speed & Reliability]]></category>
            <category><![CDATA[Developers]]></category>
            <guid isPermaLink="false">2eWRUE7pYbMXswKxKYflHk</guid>
            <dc:creator>Michael Pinter</dc:creator>
        </item>
        <item>
            <title><![CDATA[How my team wrote 12 Cloudflare apps with fewer than 20 lines of code]]></title>
            <link>https://blog.cloudflare.com/how-my-team-wrote-12-cloudflare-apps-with-fewer-than-20-lines-of-code/</link>
            <pubDate>Thu, 13 Dec 2018 01:00:00 GMT</pubDate>
            <description><![CDATA[ I like my code the same way I like my team of POWr Rangers… DRY. And no, I don’t mean dull and unexciting! (If you haven’t heard this acronym before, DRY stands for Don’t Repeat Yourself) ]]></description>
            <content:encoded><![CDATA[ <p><i>This is a guest post by</i> <a href="https://www.linkedin.com/in/benmross/"><i>Ben Ross</i></a><i>. Ben is a Berkeley PhD, serial entrepreneur, and Founder and CTO and</i> <a href="http://www.powr.io?src=cloudflareblog"><i>POWr.io</i></a><i>, where he spends his days helping small businesses grow online.</i></p><p>I like my code the same way I like my <a href="http://www.powr.io/about">team of POWr Rangers</a>… <b>DRY</b>.</p><p>And no, I don’t mean dull and unexciting! (If you haven’t heard this acronym before, DRY stands for Don’t Repeat Yourself, the single most important principle in software engineering. Because, as a mentor once told me, “when someone needs to re-write your code, at least they only need to do it once.”)</p><p>At <a href="https://www.powr.io?src=cloudflareblog">POWr</a>, being DRY is not just a way to write code, it’s a way of life. This is true whether you’re an Engineer, a Customer Support agent, or an Office Manager; if you find you’re repeating yourself, we want to find a way to automate that repetition away. Our employees’ time is our company’s most valuable resource. Not to mention, who wants to spend all day repeating themselves?</p><p>We call this process becoming a <b>Scaled Employee</b>. A Scaled Employee leverages their time and resources to make a multifold impact compared to an average employee in their field. Building a culture of scaled employees plays a large part in how we have been able rapidly grow our company over the past 4 years without raising any VC funding.</p><p>So when we recently integrated <a href="https://www.cloudflare.com/apps/list/powr">12 POWr apps into Cloudflare</a>, you might think that we had to write code for 12 different apps. This would have required months of tedious building and QA testing.</p><p>Instead, we built a single integration template. Then, we wrote a few lines of code to automatically generate 12 apps in about as long as it takes to enjoy a sumptuous sip of California Cab. Ready for a quick overview? Begin swirling...</p><p>First we defined a “replacements” object with the important attributes of each app (which is already available in our database in an AppDetail model):</p>
            <pre><code>replacements = {
    APP_COMMON_NAME: app_detail.common_name, #eg “Form Builder”
    APP_SLUG: app_detail.slug, #e.g. “form-builder”
    APP_DESCRIPTION: app_detail.short_description #e.g. “Increase conversions and get more sign-ups.”
    …
}</code></pre>
            <p>Using these replacements, we then duplicated and renamed each file of our Cloudflare App accordingly:</p>
            <pre><code>replacements.each do |key, val|
  `find #{parent_dir} -name "*#{key}*" -exec rename 's/#{key}/#{val}/' * -v {} +`
end</code></pre>
            <p>And finally, we moved into each file and made the corresponding replacements:</p>
            <pre><code>Dir.glob("lib/cloudflare/powr-#{replacements[:APP_SLUG]}/**/*").reject{|fn| File.directory?(fn)}.each do |file_name|
  text = File.read(file_name)
  replacements.each do |key, val|
    text = text.gsub(key.to_s, val)
   end
   File.open(file_name, "w") {|file| file.puts text }
end</code></pre>
            <p>Delicious, right?</p><p>At this point, you may be wondering, “what are POWr Apps, anyway?” I’m glad you asked. They are a customizable and easy-to-use set of tools to supercharge any website… from forms to galleries to social media integrations to eCommerce.</p><p>Could you build a custom form for your website, a backend to handle and graph responses, and an integration with Zapier to turn on a lightbulb every time someone presses submit? Probably. Is that a good use of your time? Probably not. Instead, you can install <a href="https://www.cloudflare.com/apps/powr-form-builder">POWr Form Builder</a> in about 2 minutes, pass it off to your Marketing Intern to make it look pretty, and get back to the hard problems.</p><p><i>Adding POWr Form Builder to Cloudflare</i></p><p><i>Customize your app in the POWr Editor</i></p><p>If YOU want to be a Scaled Engineer, it’s not about knowing everything there is to know. The geekiest engineers that spend their lunches vehemently discussing the pros and cons of bubble vs selection sort often do not make the best Scaled Engineers. Scaled Engineers know when to avoid going down Rabbit Holes and use whatever tools are at their disposal to maximize impact.</p><p>So if you want to add some dynamic content to your site, take a look at <a href="https://www.cloudflare.com/apps/list/powr">POWr Apps for Cloudflare</a>. I’d tell you that again, but I don’t want to repeat myself.</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Programming]]></category>
            <guid isPermaLink="false">5nhgUhQERSNwQtVcCDoYTp</guid>
            <dc:creator>Guest Author</dc:creator>
        </item>
        <item>
            <title><![CDATA[OAuth Auth Server through Workers]]></title>
            <link>https://blog.cloudflare.com/oauth-2-0-authentication-server/</link>
            <pubDate>Tue, 11 Dec 2018 23:48:12 GMT</pubDate>
            <description><![CDATA[ Services need to talk to each other safely without inconveniencing users. Let’s pretend I own a service with users and I want to grant other services access to my service on behalf of my users.  ]]></description>
            <content:encoded><![CDATA[ <p>Let’s pretend I own a service and I want to grant other services access to my service on behalf of my users. The familiar OAuth 2.0 is the industry standard used by the likes of <a href="https://developers.google.com/identity/protocols/OAuth2">Google sign in</a>, Facebook, etc. to communicate safely without inconveniencing users.</p><p>Implementing an OAuth Authentication server is conceptually simple but a pain in practice. We can leverage the power of <a href="https://cloudflareworkers.com">Cloudflare Workers</a> to simplify the implementation, reduce latency, and segregate our service logic from the authentication layer.</p><p>For those unfamiliar with OAuth, I highly recommend reading a more in depth <a href="https://aaronparecki.com/oauth-2-simplified/">article</a>.</p><p>The steps of the OAuth 2.0 workflow are as follows:</p><ol><li><p>The consumer service redirects the user to a callback URL that was setup by the auth server. At this callback URL, the auth server asks the user to sign in and accept the consumer permissions requests.</p></li><li><p>The auth server redirects the user to the consumer service with a code.</p></li><li><p>The consumer service asks to exchange this code for an access token. The consumer service validates their identity by including their client secret in the callback URL.</p></li><li><p>The auth server gives the consumer the access token.</p></li><li><p>The consumer service can now use the access token to get resources on behalf of the user.</p></li></ol><p>In the rest of this post, I will be walking through my implementation of an OAuth Authentication server using a Worker. For simplicity, I will make the assumption the user has already logged in and obtained a session token in the form of a JWT that I will refer to as “token” herein. My <a href="https://github.com/victoriabernard92/OAuth-Server">full implementation</a> has a more thorough flow that includes initial user login and registration.</p>
    <div>
      <h3>Setup</h3>
      <a href="#setup">
        
      </a>
    </div>
    <p>We must be able to reference valid user sessions, codes and login information. Because Workers do not maintain state between executions, we will store this information using <a href="https://developers.cloudflare.com/workers/writing-workers/storing-data/">Cloudflare Storage</a>. We setup up three namespaces called: USERS, CODES, and TOKENS .</p><p>On your OAuth server domain, create two empty worker scripts called auth and token. Bind the three namespaces to the two workers scripts. Then configure the namespaces to the scripts so that your resources end up looking like:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1VFGcOfkTKZXNuEHBDlReT/4ca67344666d87c20215defd524a9b70/Screen-Shot-2018-12-11-at-3.46.15-PM.png" />
            
            </figure><p>To put and get items from storage using KV Storage syntax:</p>
            <pre><code>// @ts-ignore 
CODES.get(“user@ex.com”) </code></pre>
            <p>We include <code>// @ts-ignore</code> preceding all KV storage commands. We do not have type definitions for these variables locally, so Typescript would throw an error at compile time otherwise.</p><p>To set up a project using Typescript and the Cloudflare Previewer, follow this <a href="/using-webpack-to-bundle-workers/">blog post</a>. Webpack will allow us to <code>import</code> which we will need to use the JWT library <code>jsonwebtoken</code>.</p>
            <pre><code>import * as jwt from "jsonwebtoken";</code></pre>
            <p>Remember to run:</p>
            <pre><code>npm install jsonwebtoken &amp;&amp; npm install @types/jsonwebtoken</code></pre>
            <p>Optionally, we can set up a file to specify endpoints and credentials.</p>
            <pre><code>import { hosts } from "./private";

export const credentials = {/* for demo purposes, ideally use KV to store secrets */
  clients: [{
    id: "victoriasclient",
    secret: "victoriassecret"
  }],
  storage: {
    secret: "somesecrettodecryptfromtheKV"
  }

};

export const paths = {
  auth: {
    authorize: hosts.auth + "/authorize",
    login: hosts.auth + "/login",
    code: hosts.auth + "/code",
  },
  token: {
    resource: hosts.token + "/resource",
    token: hosts.token + "/authorize",
  }
}</code></pre>
            
    <div>
      <h4>1. Accept page after callback</h4>
      <a href="#1-accept-page-after-callback">
        
      </a>
    </div>
    <p>The consumer service generates some callback URL that redirects the user to our authentication server. The authentication server then presents the user with a login or accept page to generate a code. The authentication server thus must listen on the <code>authorize</code> url endpoint and return <code>giveLoginPageResponse</code>.</p>
            <pre><code>addEventListener("fetch", (event: FetchEvent) =&gt; {
 const url = new URL(event.request.url);
 if (url.pathname.includes("/authorize"))
  return event.respondWith(giveLoginPageResponse(event.request));
}

export async function giveLoginPageResponse(request: Request) {
 ...checks for cases where I am not necessarily logged in... 
 let token = getTokenFromRequest(request)
 if (token) { //user already signed in
  return new Response(giveAcceptPage(request)
 }</code></pre>
            <p>Since the user already has a stored session, we can use a method <code>giveAcceptPage</code>. To display the accept page and return a redirect to generate the code.</p>
            <pre><code>export function giveAcceptPage(request: Request) {
  let req_url = new URL(request.url);
  let params = req_url.search
  let fetchCodeURL = paths.auth.code + params
  return `&lt;!DOCTYPE html&gt;
  &lt;html&gt;
    &lt;body&gt;
      &lt;a href="${fetchCodeURL}"&gt; Accept&lt;/button&gt;
    &lt;/body&gt;
  &lt;/html&gt;
    `;
}</code></pre>
            
    <div>
      <h4>2. Redirect back to consumer</h4>
      <a href="#2-redirect-back-to-consumer">
        
      </a>
    </div>
    <p>At the endpoint for <code>fetchCodeURL</code>, the authentication server will redirect the user’s browser to the consumer’s page as specified by <code>redirect_uri</code> in the original URL params of the callback with the code.</p>
            <pre><code>addEventListener("fetch", (event: FetchEvent) =&gt; {
 ...
 if (url.pathname.includes("/code"))
  return event.respondWith(redirectCodeToConsumer(event.request));
}
export async function redirectCodeToConsumer(request: Request) {
 let session = await verifyUser(request)

 if (session.msg == "403") return new Response(give403Page(), { status: 403 })
 if (session.msg == "dne") return registerNewUser(session.email, session.pwd)
 let code = Math.random().toString(36).substring(2, 12)
 try {
  let req_url = new URL(request.url)
  let redirect_uri = new URL(encodeURI(req_url.searchParams.get("redirect_uri")))
  let client_id = new URL(encodeURI(req_url.searchParams.get("client_id")))
  // @ts-ignore
  await CODES.put(client_id + email, code)
  redirect_uri.searchParams.set("code", code);
  redirect_uri.searchParams.set("response_type", "code");
  return Response.redirect(redirect_uri.href, 302);
 } catch (e) {
  // @ts-ignore
  await CODES.delete(email, code)
  return new Response(
   JSON.stringify(factoryIError({ message: "error with the URL passed in" + e})),
  { status: 500 });
 }
}</code></pre>
            
    <div>
      <h4>3. Code to Token Exchange</h4>
      <a href="#3-code-to-token-exchange">
        
      </a>
    </div>
    <p>Now the consumer has the code. They can use this code to request a token. On our token worker, configure the endpoint to exchange the code for the consumer service to grant a token.</p>
            <pre><code>addEventListener("fetch", (event: FetchEvent) =&gt; {
...
 if (url.pathname.includes("/token"))
  return event.respondWith(giveToken(event.request));</code></pre>
            <p>Grab the code from the request and validate this code matches the code that is stored for this client. Once the code is verified, deliver the token by grabbing the existing token from the KV storage or by signing the user information to generate a new token.</p>
            <pre><code>export async function giveToken(request: Request) {
 let req_url = new URL(request.url);
 let code = req_url.searchParams.get("code");
 let email = req_url.searchParams.get("email");
 if (code){
   if(!validClientSecret(request) return errorResponse()
  // @ts-ignore
  let storedCode = await CODES.get(email)
  if(code != storedCode) return new Response(give403Page(), { status:403})

  let tokenJWT = jwt.sign(email, credentials.client.secret);
  ... return token</code></pre>
            
    <div>
      <h4>4. Give the token to the consumer</h4>
      <a href="#4-give-the-token-to-the-consumer">
        
      </a>
    </div>
    <p>Continuing where step 3 left off from the <code>giveToken</code> method, respond to the consumer with this valid token.</p>
            <pre><code>  ...
  headers.append("set-cookie", "token=Bearer " + tokenJWT);
  // @ts-ignore
  await TOKENS.put(email, tokenJWT)
  var respBody = factoryTokenResponse({
   "access_token": tokenJWT,
   "token_type": "bearer",
   "expires_in": 2592000,
   "refresh_token": token,
   "token": token
  })
 } else {
  respBody.errors.push(factoryIError({ message: "there was no code sent to the authorize token url" }))
 }
 return new Response(JSON.stringify(respBody), { headers });
}</code></pre>
            
    <div>
      <h4>5. Accepting the token</h4>
      <a href="#5-accepting-the-token">
        
      </a>
    </div>
    <p>At this point voila, your duty as an OAuth 2.0 Authentication server is complete! The consumer service that wishes to use your service has the token that you have not so magically generated.</p><p>The consumer server would send a request including the token:</p>
            <pre><code>GET /resource/some-goods
Authorization: Bearer eyJhbGci..bGAqA</code></pre>
            <p>Authentication server would validate the token and give the goods:</p>
            <pre><code>export async function giveResource(request: Request) {
 var respBody: HookResponse = factoryHookResponse({})
 let token = ""
 let decodedJWT = factoryJWTPayload()
 try { //validate request is who they claim
  token = getCookie(request.headers.get("cookie"), "token")
  if (!token) token = request.headers.get("Authorization").substring(7)
  decodedJWT = jwt.verify(token, credentials.storage.secret)
  // @ts-ignore
  let storedToken = await TOKENS.get(decodedJWT.sub)
  if (isExpired(storedToken)) throw new Error("token is expired") /* TODO instead of throwing error send to refresh */
  if (storedToken != token) throw new Error("token does not match what is stored")
 }
 catch (e) {
  respBody.errors.push(factoryIError({ message: e.message, type: "oauth" }))
  return new Response(JSON.stringify(respBody), init)
 }
 respBody.body = getUsersPersonalBody(decodedJWT.sub)
 return new Response(JSON.stringify(respBody), init)
}</code></pre>
            <p>The boundaries of serverless are pushed everyday, though if your app just needs to authorize users, you may be better off using <a href="https://www.cloudflare.com/products/cloudflare-access/">Cloudflare Access</a>. We've demonstrated that a full blown OAuth 2.0 authentication server implementation can be achieved with Cloudflare Workers and Storage.</p><p>Stay tuned for a follow-up blog post on an OAuth consumer implementation.</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Cloudflare Workers]]></category>
            <category><![CDATA[Serverless]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <guid isPermaLink="false">3DMym5hzg83QDRvOxJCSTo</guid>
            <dc:creator>Victoria Bernard</dc:creator>
        </item>
        <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[The Rise of Edge Compute: The Video]]></title>
            <link>https://blog.cloudflare.com/rise-of-edge-compute-the-video/</link>
            <pubDate>Tue, 08 May 2018 21:28:44 GMT</pubDate>
            <description><![CDATA[ At the end of March, Kenton Varda, tech lead and architect for Cloudflare Workers, traveled to London and led a talk about the Rise of Edge Compute where he laid out our vision for the future of the Internet as a platform. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>At the end of March, <a href="https://twitter.com/KentonVarda">Kenton Varda</a>, tech lead and architect for <a href="https://developers.cloudflare.com/workers/">Cloudflare Workers</a>, traveled to London and led a talk about the <a href="https://edgecomputelondon.eventbrite.com">Rise of Edge Compute</a> where he laid out our vision for the future of the Internet as a platform.</p><p>Several of those who were unable to attend on-site asked for us to produce a recording. Well, we've completed the audio edits, so here it is!</p><hr /><p>Visit the Workers category on Cloudflare's community forum to learn more about Workers and share questions, answers, and ideas with other developers.</p><p><a href="https://community.cloudflare.com/c/developers/workers">Visit the Community Forum Here »</a></p> ]]></content:encoded>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Community]]></category>
            <category><![CDATA[Events]]></category>
            <category><![CDATA[Video]]></category>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Cloudflare Meetups]]></category>
            <category><![CDATA[Serverless]]></category>
            <category><![CDATA[Cloudflare Workers]]></category>
            <category><![CDATA[MeetUp]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <guid isPermaLink="false">6l0Dh2IH2d2guyxlXTwE40</guid>
            <dc:creator>Andrew Fitch</dc:creator>
        </item>
        <item>
            <title><![CDATA[Custom Page Selection for Cloudflare Apps]]></title>
            <link>https://blog.cloudflare.com/custom-page-selection/</link>
            <pubDate>Thu, 03 May 2018 17:00:00 GMT</pubDate>
            <description><![CDATA[ In July 2016, Cloudflare integrated with Eager - an apps platform. During this integration, several decisions were made to ensure an optimal experience installing apps. We wanted to make sure site owners on Cloudflare could customize and install an app with the minimal number of clicks possible.  ]]></description>
            <content:encoded><![CDATA[ <p>In July 2016, Cloudflare <a href="/cloudflare-acquires-eager/">integrated with Eager</a> - an apps platform. During this integration, several decisions were made to ensure an optimal experience installing apps. We wanted to make sure site owners on Cloudflare could customize and install an app with the minimal number of clicks possible. Customizability often adds complexity and clicks for the user. We’ve been tinkering to find the right balance of user control and simplicity since.</p><p>When installing an app, a site owner must select <i>where</i> - what URLs on their site - they want <i>what</i> apps installed. Our original plan for selecting the URLs an app would be installed on took a few twists and turns. Our end decision was to utilize our <a href="https://support.cloudflare.com/hc/en-us/articles/200168006-How-does-Always-Online-work-">Always Online</a> crawler to pre-populate a tree of the user’s site. Always Online is a feature that crawls Cloudflare sites and serves pages from our cache if the site goes down.</p><p>The benefits to this original setup are:<b>1. Only valid pages appear</b>An app only allows installations on html pages. For example, since injecting Javascript into a JPEG image isn’t possible, we would prevent the installer from trying it by not showing that path. Preventing the user from that type of phony installation prevents the user from being confused later when it doesn’t work.<b>2. The user was not required to know any URL of their site</b>The URLs are available right there in the UI. With the click of a check mark, the user would not have to type a thing.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/wzvhWE2cwXANxwwAc6mzs/17d385f4cfc893f54dd46a25dc8b85b3/Screen-Shot-2018-04-16-at-3.10.53-PM.png" />
            
            </figure><p>The disadvantage of this setup is the dependency of the Always Online crawler.</p><p>First off, some users do not wish to have Always Online turned on. Without the consent of the site owner to crawl the site via Always Online, the page loader tree will not load and the user had no options of pages to install an app on.</p><p>When a user does have Always Online enabled properly, the crawler might not crawl every page the site owner wishes to install an app on.</p><p>The duty of Always Online is to make sure in the most catastrophic event for a site owner - their site being down - users can still see a version of the site via cached static HTML. Once upon a time before <a href="/always-online-v2/">Always Online v2</a>, we actually used the Google bot and other search engine crawlers’ activity to decide what to cache for the Always Online feature. We found that implementing our own crawler made more sense. Our goal is to make sure the most vital pages of a site are crawled and stored on our cache, contrasting with search engine crawler’s priority of get the most information possible from the site, thus going “deep” into the depths of a site map.</p><p>The duty of an app install on Cloudflare’s Apps platform is to seamlessly enable users to select pages in which to inject Javascript, HTML, CSS, and in the near future, <a href="https://developers.cloudflare.com/workers/about/">Cloudflare Service Workers</a> into. Since the objectives of the Always Online crawler differ from that of the Cloudflare Apps platform, there were inevitable consequences. Here are some examples where a page would not be crawled:</p><ul><li><p>The page’s subdomain was not "<a href="https://support.cloudflare.com/hc/en-us/articles/200169626">orange-clouded</a>".</p></li><li><p>The page was not be accessible from the site's homepage via links.</p></li><li><p>The site’s homepage had too many links for us to follow.</p></li><li><p>The page was password-protected, preventing us from accessing it and adding it to your site map.</p></li><li><p>The page was added before we had a chance to crawl the site.</p></li></ul><p>Although our custom crawler works well for the Always Online feature, this limited control for our customers who are installing apps. We decided to do something about it. Combining the advantages of the crawler data we already had implemented <i>with</i> the ability to enter any URL in an install, we created the best of both worlds.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2COMbJNiEM9kdDsOxNAlgI/76d2b6474cb7f9b6d1da6157d96377b5/Screen-Shot-2018-04-16-at-3.08.24-PM.png" />
            
            </figure><p>Now, site owners can type in whatever URL they wish to install an app. There is also an option for selecting an entire directory or strictly that page. For simplicity, no regex patterns are supported.</p><p>As the apps on the Cloudflare Apps platform advance, it is vital that the platform itself advance. In the near future, the App’s platform will have the power of Cloudflare Workers, local testing, and much more to come.</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[JavaScript]]></category>
            <category><![CDATA[Always Online]]></category>
            <category><![CDATA[Developers]]></category>
            <guid isPermaLink="false">7jZsGav4RDfLIfoIVVXfU</guid>
            <dc:creator>Victoria Bernard</dc:creator>
        </item>
        <item>
            <title><![CDATA[London & Barcelona developers, we want to meet you this week]]></title>
            <link>https://blog.cloudflare.com/london-barcelona/</link>
            <pubDate>Sat, 24 Mar 2018 12:00:00 GMT</pubDate>
            <description><![CDATA[ Are you based in London or Barcelona? My Developer Relations teammates and I are visiting these cities over the next two weeks. I would love to meet you and invite you to the three events I'm hosting.  ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Photo by <a href="https://unsplash.com/@jamie452?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Jamie Street</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a></p><p>Are you based in London or Barcelona? Drop by the Cloudflare London office to meet Kenton Varda, lead architect of Cloudflare Workers, front end developers Marta Bondyra and David Sancho from Typeform, or drop by the Typeform office in Barcelona to hear from Jason Harmon, Typeform’s Chief Platform Officer. My Developer Relations teammates and I are visiting these cities over the next two weeks. We’d love to meet you and invite you to the three events we’re hosting.</p><p>Our first stop is the Cloudflare London office. Developers from our <a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a> partner, <a href="https://www.cloudflare.com/apps/typeform">Typeform</a>, are leading a talk on Tuesday, March 27th. The lead architect of <a href="https://www.cloudflare.com/products/cloudflare-workers/">Cloudflare Workers</a>, Kenton Varda, is going to lead a follow-up talk about edge computing on Wednesday, March 28th.</p>
    <div>
      <h3>Event #1: Building for a tech audience: Great dev lessons for adventurous makers</h3>
      <a href="#event-1-building-for-a-tech-audience-great-dev-lessons-for-adventurous-makers">
        
      </a>
    </div>
    
            <figure>
            <a href="https://typeformandcloudflare.eventbrite.com">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3nIKmsU8cyzqx77EhwI4MS/30b3bce42835cf0db295fc080cb76d55/Typeform---Cloudflare.jpg" />
            </a>
            </figure><p><b>Tuesday, March 27th</b>: 18:00-20:00</p><p><b>Location</b>: Cloudflare London - 25 Lavington St, Second floor | SE1 0NZ London</p><p>Creating software from scratch, although fun, can be time consuming and expensive. Marta and David, both developers at Typeform, will tell you why their teams built tools to make the lives of developers a little easier and what they learned along the way.</p><p><a href="https://typeformandcloudflare.eventbrite.com">View Event Details &amp; Register Here »</a></p>
    <div>
      <h3>Event #2: The Rise of Edge Compute</h3>
      <a href="#event-2-the-rise-of-edge-compute">
        
      </a>
    </div>
    
            <figure>
            <a href="https://edgecomputelondon.eventbrite.com">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4rxCl0oGGrL3qtsmvHlJnH/6653cb223f6ae4aded6ecf7eeb2a004d/Workers-image.jpg" />
            </a>
            </figure><p><b>Wednesday, March 28th</b>: 18:00-20:00</p><p><b>Location</b>: Cloudflare London - 25 Lavington St, Second floor | SE1 0NZ London</p><p>Edge Compute is the future of how complex software systems will be designed and built. Join Kenton Varda, the tech lead and architect for the Cloudflare Workers project, as he lays out our vision for the future of the Internet as a platform and provides a detailed look at the architecture of Workers.</p><p><a href="https://edgecomputelondon.eventbrite.com">View Event Details &amp; Register Here »</a></p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1dKlKoJ6a6gzgQsD16HlPA/5765b9b2655149f5afb9aa1d0510d431/photo-1517659649778-bae24b8c2e26" />
            
            </figure><p>Photo by <a href="https://unsplash.com/@javier_bosch?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Javier Bosch</a> / <a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit">Unsplash</a></p><p>Our second stop of the trip is <a href="https://developer.typeform.com/">Typeform</a>'s office in Barcelona. Here, the Cloudflare team will speak about performance and security after an introductory talk by Typeform's Chief Platform Officer on Tuesday, April 3rd.</p>
    <div>
      <h3>Event #3: Cyber Security &amp; Web Performance: The New Landscape</h3>
      <a href="#event-3-cyber-security-web-performance-the-new-landscape">
        
      </a>
    </div>
    
            <figure>
            <a href="https://cybersecurityperformance.eventbrite.com">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2bImzL4EMPxGYqHFTQ4ihG/a3a2d03a8b00269fb5c13a85f35c9626/Typeform---Cloudflare.jpg" />
            </a>
            </figure><p><b>Tuesday, April 3rd</b>: 18:00-20:15</p><p><b>Location</b>: Typeform - Carrer de Bac de Roda, 163 | 08018 Barcelona</p><p>Learn about the technologies behind cutting-edge performance, security, and edge development solutions. Jason Harmon, the Chief Platform Officer at Typeform, will open with a keynote talk. Connor Peshek and Jade Wang, both from Cloudflare, will cover topics relating to the way a network stays connected, web acceleration, mobile network optimization, and the future of edge compute.</p><p><a href="https://cybersecurityperformance.eventbrite.com">View Event Details &amp; Register Here »</a></p><p>We'll hope to meet you soon!</p> ]]></content:encoded>
            <category><![CDATA[Serverless]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Cloudflare Workers]]></category>
            <category><![CDATA[Speed & Reliability]]></category>
            <category><![CDATA[Events]]></category>
            <category><![CDATA[Cloudflare Meetups]]></category>
            <category><![CDATA[MeetUp]]></category>
            <category><![CDATA[Developer Platform]]></category>
            <guid isPermaLink="false">7i0uAWPBrCl6tNzCc3UuD0</guid>
            <dc:creator>Andrew Fitch</dc:creator>
        </item>
        <item>
            <title><![CDATA[Lessons learned from adapting Site Search 360 for Cloudflare Apps]]></title>
            <link>https://blog.cloudflare.com/site-search-360-on-cloudflare-apps/</link>
            <pubDate>Sat, 27 Jan 2018 01:58:00 GMT</pubDate>
            <description><![CDATA[ As a startup founder, there are always key product decisions to be made when Site Search 360, our key product, is embedded in one context versus another. I’d like to share some experiences, choices, and challenges in our process packaging Site Search 360 for Cloudflare Apps. ]]></description>
            <content:encoded><![CDATA[ <p><i>This is a guest post by </i><a href="https://www.linkedin.com/in/davidurbansky/"><i>David Urbansky</i></a><i>, CEO and Co-Founder of </i><a href="https://semknox.com"><i>SEMKNOX</i></a><i> and </i><a href="https://sitesearch360.com/"><i>Site Search 360</i></a><i>. David is a search enthusiast having built natural language search experiences for e-commerce sites and </i><a href="https://spoonacular.com"><i>recipe search engines</i></a><i>.</i></p><p>As a startup founder, there are always key product decisions to be made when Site Search 360, our key product, is embedded in one context versus another. I’d like to share some experiences, choices, and challenges in our process packaging Site Search 360 for Cloudflare Apps.</p>
    <div>
      <h3>What is Site Search 360?</h3>
      <a href="#what-is-site-search-360">
        
      </a>
    </div>
    <p><a href="https://www.cloudflare.com/apps/site-search-360">Site Search 360</a> is a search solution for websites. Offering a search bar on a website improves user experience tremendously if the site has more than just a handful of pages. According to a <a href="https://econsultancy.com/blog/10407-site-search-for-e-commerce-13-best-practice-tips#i.e6bb0iahterern">eConsultancy study</a>, up to <b>30% of web visitors use the search feature on e-commerce sites</b> and searchers sometimes make up 40% of the revenue. Additionally, <a href="https://www.nngroup.com/articles/search-visible-and-simple/">Nielsen Group</a> found that 51% of people who did not find what they were looking for with the first query, gave up without refining the search - the search had better work very well then.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/site-search-360">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1omNz05H9LswOnHn9p8Pl2/ec5d81762d5083f93315855931a6c4cd/cloudflare-pic1.png" />
            </a>
            </figure>
    <div>
      <h3>Why use the <a href="https://www.cloudflare.com/apps/site-search-360">Cloudflare App</a>?</h3>
      <a href="#why-use-the">
        
      </a>
    </div>
    <p>Considering these facts, almost every website should have a search feature. However, implementing that functionality is not trivial. Developers are faced with multiple non-obvious decisions to make, such as:</p><ul><li><p>What content should and should not be indexed (do you need the header and footer of every page in the index? Probably not!)</p></li><li><p>How do I keep my index up to date when I add new pages or change something?</p></li><li><p>What storage engine should I use and how do I handle complex queries?</p></li><li><p>How to maintin the additional codebase, especially if non-technical leadership wants to change a decision on what to index?</p></li></ul><p>Thus, <b>for most sites, a highly customizable off-the-shelf search solution is the fastest and lowest maintenance way to go</b>. Site Search 360 offers that along with additional features, such as:</p><ul><li><p>Autocomplete and search suggestions</p></li><li><p>High speed</p></li><li><p>Mobile capability</p></li><li><p>Full control over search results</p></li><li><p>Analytics about user behavior and search trends</p></li></ul>
    <div>
      <h3>In-depth configuration</h3>
      <a href="#in-depth-configuration">
        
      </a>
    </div>
    <p>To make a search solution fit perfectly into the style and theme of a website, one has to be able to customize it. Site Search 360 offers over <b>60 parameters</b> developers can tinker with to make the search behave and consistently fit the brand and style of the rest of the site.</p><p><a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a> are configured visually though, and 60 input fields, radio buttons, check lists, select boxes, and sliders would be too much for the average Cloudflare user. Applying the Pareto Principle, we were able to identify the <b>7 parameters</b> most frequently used that have the highest impact on a website's look and feel. We chose these for our Cloudflare app.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/site-search-360">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3Khe8kpOWXCxSINJ6K3euG/740a9655372629a44097d3ffd1caa7fa/cloudflare-pic2.png" />
            </a>
            </figure>
    <div>
      <h3>Experience developing the Cloudflare Apps</h3>
      <a href="#experience-developing-the-cloudflare-apps">
        
      </a>
    </div>
    <p>We have integrated Site Search 360 with other platforms, such as <a href="https://zapier.com">Zapier</a> (<a href="https://sitesearch360.com/docs/en/zapier-integration">read more</a>), <a href="https://www.integromat.com/en/integrations/site-search-360">Integromat</a>, <a href="https://wordpress.org/plugins/site-search-360/">WordPress</a>,and <a href="https://www.drupal.org/project/sitesearch_360">Drupal</a>, so we’ve seen multiple interfaces and experienced many different processes of getting an integration working and approved.</p><p>Where Cloudflare stood out is the <b>declaration-driven approach to app development</b>. Using only the form elements provided by Cloudflare required us to think about how to map our configuration parameters to Cloudflare components and make them as simple as possible. Just this process alone made us reconsider some of our configuration options and how we could make them easier to use, even outside the Cloudflare use case. For example, instead of letting the user choose between a set of icons for the search bar, we opted for picking one. This allowed us to embed it directly in CSS and minimize the CSS file size that would otherwise get considerably bigger with every Base64 encoded icon choice we could have provided.</p><p>The <b>single best thing I have to say about the process is the support</b>. No matter how good the documentation, developers always have questions, so it was crucial for us that we could get quick and thorough feedback every step along the way. Cloudflare takes the approval process very seriously and only allows high quality apps into their store. Their eye for detail challenged us to go back to the drawing board more than once and rethink certain design choices, e.g. did we really need sliders for the margin of an element or can we simplify it to a choice between "none", "little", and "more"?</p>
    <div>
      <h3>Challenges</h3>
      <a href="#challenges">
        
      </a>
    </div>
    <p>We encountered two main challenges:</p><ul><li><p><b>jQuery had to die</b>: Since we have no idea on which of 7+ million sites the Cloudflare app will be installed we had to move away from jQuery completely to avoid possible conflicts. This is another example of a push that came through the platform that benefits our product also outside of Cloudflare.</p></li><li><p><b>Account &amp; Sign Up</b>: In order for the user to see the search working, we have to have some indexed data. However, if a user without a Cloudflare account just previews the app, there is no indexed data. We therefore created a preview account that shows search results from Wikipedia, making registration unnecessary to preview the app.</p></li></ul><p><a href="https://www.cloudflare.com/apps/site-search-360">Preview Site Search 360 on any site with Cloudflare Apps »</a></p><p>If you have questions or feedback, it is easy to reach us in Site Search 360’s <a href="https://gitter.im/site-search-360/Lobby">community chat</a>, via Twitter <a href="https://twitter.com/sitesearch360">@sitesearch</a>, or by email <a>mail@sitesearch360.com</a>.</p><p>Happy Searching!</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Programming]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[JavaScript]]></category>
            <guid isPermaLink="false">180XRpmt8VDSvpGOpwFRNp</guid>
            <dc:creator>Guest Author</dc:creator>
        </item>
        <item>
            <title><![CDATA[Highlights from Cloudflare's Weekend at YHack]]></title>
            <link>https://blog.cloudflare.com/cloudflare-at-yhack/</link>
            <pubDate>Sat, 16 Dec 2017 17:00:00 GMT</pubDate>
            <description><![CDATA[ Along with four other Cloudflare colleagues, I traveled to New Haven, CT last weekend to support 1,000+ college students from Yale and beyond at YHack hackathon. ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Along with four other <a href="https://www.cloudflare.com/">Cloudflare</a> colleagues, I traveled to <a href="https://www.google.com/maps/place/New+Haven,+CT/data=!4m2!3m1!1s0x89e7d8443a8070e5:0xf6a354c659b264ed?sa=X&amp;ved=0ahUKEwjTlOyDlfvXAhVH8GMKHc4xB1AQ8gEImAEwDg">New Haven, CT</a> last weekend to support 1,000+ college students from Yale and beyond at <a href="https://www.yhack.org/">YHack</a> hackathon.</p><p>Throughout the weekend-long event, student attendees were supported by mentors, workshops, entertaining performances, tons of food and caffeine breaks, and a lot of air-mattresses and sleeping bags. Their purpose was to create projects to solve real world problems and to learn and have fun in the process.</p>
    <div>
      <h3>How Cloudflare contributed</h3>
      <a href="#how-cloudflare-contributed">
        
      </a>
    </div>
    <p>Cloudflare sponsored YHack. Our team of five wanted to support, educate, and positively impact the experience and learning of these college students. Here are some ways we engaged with students.</p>
            <figure>
            <a href="https://www.cloudflare.com/">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2hL6LsEAzD8LWtp8zarSG9/c4039c4df953386c2174435cc6d3031c/Screen-Shot-2017-12-08-at-11.55.59-AM.png" />
            </a>
            </figure><h6>1. Mentoring</h6><p>Our team of five mentors from three different teams and two different Cloudflare locations (San Francisco and Austin) was available at the Cloudflare table or via Slack for almost every hour of the event. There were a few hours in the early morning when all of us were asleep, I'm sure, but we were available to help otherwise.</p><h6>2. Providing challenges</h6><p>Cloudflare submitted two challenges to the student attendees, encouraging them to protect and improve the performance of their projects and/or create an opportunity for exposure to 6 million+ potential users of their apps.</p><p><b>Challenge 1</b>: Put Cloudflare in front of your hackathon project</p><p><b>Challenge 2</b>. Make a Cloudflare App</p><p>Prizes were awarded to all teams which completed these challenges. Cloudflare awarded a total of ten teams for completing the challenges. The team which was judged to have created the best Cloudflare app won free admission to Cloudflare's 2018 <a href="https://www.cloudflare.com/internet-summit/">Internet Summit</a> as well as several swag items and introductions to Cloudflare teams offering internships next summer.</p><h6>3. Distributing swag &amp; cookies</h6><p>Over 3,000 swag items (t-shirts, laptop stickers, and laptop camera covers) were distributed to almost every attendee. When the Cloudflare team noticed student attendees were going without snacks after dinner, I made a trip to a local grocery store and bought hundreds of cookies to distribute as well. After about an hour, none remained.</p>
            <figure>
            <a href="https://www.cloudflare.com/">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/p0q51OvPWdhYOEiuOnO22/f69e7f62b33caf2a2f9b6a600c8567c9/Cookies-1.JPG.jpeg" />
            </a>
            </figure><h6>4. Sponsoring</h6><p>As with most any hackathon, costs for food, A/V, venue rental, and other expenses are considerable. Cloudflare decided to financially support YHack to help offset some of these costs and be sure student participants were able to attend, learn, and build meaningful projects without having to pay admission fees.</p>
    <div>
      <h3>Results of the hackathon</h3>
      <a href="#results-of-the-hackathon">
        
      </a>
    </div>
    <p>In groups of up to four, students teamed up to create projects. There was no set project theme, so students could focus on subject areas they were most passionate about. Judging criteria were "practical and useful", "polish", "technical difficulty", and "creativity" and several sponsors, such as <a href="https://www.intuit.com/">Intuit</a>, <a href="https://www.cloudflare.com/">Cloudflare</a>, <a href="https://www.jetblue.com">JetBlue</a>, and Yale's <a href="https://communications.yale.edu/poynter">Poynter Fellowship in Journalism</a> submitted suggested challenges for teams to work on.</p><p>I saw a lot of cool projects that could help college students save money on food or other expenses, projects that could help identify fake news sources, and apps that would work great on <a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a>.</p><p>There were dozens of great completed projects by the end of the Hackathon. I'd like to highlight a few great ones which used Cloudflare best.</p>
    <div>
      <h3>The Winner: <a href="https://devpost.com/software/tl-dr-cg50p2">TL;DR</a></h3>
      <a href="#the-winner">
        
      </a>
    </div>
    
            <figure>
            <a href="https://devpost.com/software/tl-dr-cg50p2">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3Pv9nHcj4HMoDDCdMbXMMm/a63547d5c4a9395f7b035db04952f2cf/72.JPG.jpeg" />
            </a>
            </figure><p><a href="linkedin.com/in/akramamirza">Akrama Mirza</a>, a second year student at <a href="https://uwaterloo.ca/">University of Waterloo</a>, created an app for Cloudflare Apps which allows a website owner to automatically generate a TL;DR summary of the content on their pages and place it anywhere on their site. This app could be used to give a TL;DR summary of a blog post, article, report, etc.</p>
            <figure>
            <a href="https://devpost.com/software/tl-dr-cg50p2">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4YrOHsm8OCRnNmMxpxkbIU/67f0b306c8261bd8bbeaca60f9ad88c1/TLDR.jpg" />
            </a>
            </figure><p>Read more about TL;DR on Akrama's <a href="https://devpost.com/software/tl-dr-cg50p2">Devpost page</a>.</p><p><b>Other great projects which used Cloudflare</b></p><p>Of the completed projects which put Cloudflare in front of their projects, there were three I most wanted to feature.</p>
    <div>
      <h3><a href="https://devpost.com/software/k2">K2</a></h3>
      <a href="#">
        
      </a>
    </div>
    
            <figure>
            <a href="https://devpost.com/software/k2">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2e3ytubJtMJxReXTVWnVhY/ecf29be0d99f226b22479f3498a82e29/111.JPG.jpeg" />
            </a>
            </figure><p>"Bringing Wall Street to Main Street through an accessible trading and back-testing platform."</p><p>K2 is a comprehensive backtesting platform for currency data, specializing in cryptocurrency and offering users the opportunity to create trading algorithms and simulate them in real-time.</p><p>The K2 team sought to equalize the playing field by enabling the general public to develop and test trading strategies. Users may specify a trading interval, time frame, and currency symbol, and the K2 backend will visualize the cumulative returns and generate financial metrics.</p><p>Read more about K2 on the team's <a href="https://devpost.com/software/k2">Devpost page</a> or <a href="http://everestcapital.io/k2/">website</a>.</p>
    <div>
      <h3><a href="https://devpost.com/software/finralyze">Money Moves</a></h3>
      <a href="#">
        
      </a>
    </div>
    
            <figure>
            <a href="https://devpost.com/software/finralyze">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4vFcT9AdDRZ9thxoMDslPI/c94fcf3f2f3a05140b907443299d7bca/44.JPG.jpeg" />
            </a>
            </figure><p>Money Moves analyzes data about financial advisors and their attributes and uses machine's deep learning unsupervised algorithms to predict if certain financial advisors will most likely be beneficial or detrimental to an investor's financial standing. Ultimately, Money Moves will help investors select the best possible financial advisor in their region.</p><p>The Money Moves team liked that they could easily use Cloudflare to protect and improve the performance of their site. One of the team members, Muyiwa Olaniyan, already used Cloudflare to run his personal server at home, so the team decided to use Cloudflare, from the start.</p><p>Read more about Money Moves on the team's <a href="https://devpost.com/software/finralyze">Devpost page</a> or <a href="https://www.finralyze.com/">website</a>.</p>
    <div>
      <h3><a href="https://devpost.com/software/mad-invest">Mad Invest</a></h3>
      <a href="#">
        
      </a>
    </div>
    
            <figure>
            <a href="https://devpost.com/software/mad-invest">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2zit5IiefevizKY5Q7DSff/d413709220a405f884e2f4ef77c9ccb2/158.JPG.jpeg" />
            </a>
            </figure><p>"Smart Bitcoin Investing Chatbot"</p><p>When the Facebook messenger chatbot is asked when it is best to invest in Bitcoin, current market trends are observed and a Mad Invest's model predicts how likely it is for the price to go up or down. A conclusion as to when it would be a good time to invest or sell is drawn and delivered by message to users.</p><p>Moving forward, the team intends to improve their model's predictions by developing a way to analyze the Chinese market, which represents 70% of Bitcoin traffic.</p><p>When telling me about their experience using Cloudflare and how it saved them time, the team delivered my favorite quote from the whole weekend. “We spent half an hour setting up Let's Encrypt for the SSL and we realized we could just put Cloudflare in front of it.” Exactly.</p><p>Read more about Mad Invest on the team's <a href="https://devpost.com/software/mad-invest">Devpost page</a>.</p>
    <div>
      <h3>Final thoughts:</h3>
      <a href="#final-thoughts">
        
      </a>
    </div>
    <p>I was honored to be part of a team that supported so many awesome students in the development of their projects at YHack. I was pleased to hear many attendees had already heard of or used Cloudflare before and many teams interacted with Cloudflare to protect and improve the performance of their projects and develop new apps. I look forward to being involved many more events in 2018 as well.</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Hackathon]]></category>
            <category><![CDATA[JavaScript]]></category>
            <category><![CDATA[Careers]]></category>
            <guid isPermaLink="false">4yuGNQkUwLbdpXXbetqnM5</guid>
            <dc:creator>Andrew Fitch</dc:creator>
        </item>
        <item>
            <title><![CDATA[The FCC Wants to Terminate Net Neutrality - Use Battle for the Net on Cloudflare Apps to Fight Back]]></title>
            <link>https://blog.cloudflare.com/battleforthenet/</link>
            <pubDate>Tue, 12 Dec 2017 03:00:00 GMT</pubDate>
            <description><![CDATA[ The Federal Communications Commission (FCC) has scheduled a vote to kill its net neutrality rules this Thursday, December 14th.  ]]></description>
            <content:encoded><![CDATA[ 
            <figure>
            <a href="https://www.cloudflare.com/apps/net-neutrality">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5DGonL2HNtOZ6xte5NNIhZ/bfde4c08d53f58312ae7e4e403932640/JPG-FFNN.jpg" />
            </a>
            </figure><p><b>TL;DR</b> - Net neutrality is under attack. There's <a href="https://www.cloudflare.com/apps/net-neutrality">an app</a> on <a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a> that empowers site owners to host a popup on their sites, encouraging users to contact their congresspeople to fight back. Everyone should be doing this right now, before the December 14th FCC vote.</p><p><a href="https://www.cloudflare.com/apps/net-neutrality">Use Battle for the Net to Call your Congressperson »</a></p><p><a href="https://www.eventbrite.com/e/save-the-internet-net-neutrality-call-a-thon-cloudflare-tickets-39998496580?aff=blog">Attend Cloudflare's Save the Internet! Net Neutrality Call-A-Thon »</a></p><p>The <a href="https://www.fcc.gov/">Federal Communications Commission (FCC)</a> has scheduled a vote to terminate its net neutrality rules this Thursday, December 14th. Unfortunately, the expectation is that the FCC will vote to repeal its net neutrality rules. Read about this on <a href="http://www.businessinsider.com/fcc-net-neutrality-repeal-will-lead-to-higher-prices-fewer-choices-2017-12">Business Insider</a>, <a href="https://www.bloomberg.com/news/articles/2017-11-15/killing-net-neutrality-rules-is-said-readied-for-december-vote">Bloomberg</a>, or <a href="https://techcrunch.com/2017/11/16/fcc-reportedly-planning-vote-that-could-kill-net-neutrality-next-month/">TechCrunch</a>.</p><p>Net neutrality is the principle that networks should not discriminate against content that passes through them. The FCC’s net neutrality rules protect the Internet, users, and companies from abusive behavior by the largest Internet Service Providers (ISPs). Without net neutrality rules in place, ISPs may be able to legally create a "pay to play" system and charge websites to provide content to their customers more quickly. This will create a disadvantage for startups, bloggers, and everyone else who cannot afford to pay fees for their websites to offer faster service.</p><p><a href="https://www.cloudflare.com/">Cloudflare</a> founders and employees strongly believe in the principle of network neutrality. Cloudflare co-founder and COO <a href="https://twitter.com/zatlyn">Michelle Zatlyn</a>, sat on the FCC's Open Internet Advisory Committee, which guided the FCC to vote to preserve net neutrality in 2015. Cloudflare co-founder and CEO <a href="https://twitter.com/eastdakota">Matthew Prince</a> and other employees have written four blog posts <a href="/moving-beyond-the-dc-circuit-court-decision-on-the-fccs-open-internet-order/">1</a>, <a href="/net-neutrality/">2</a>, <a href="/net-neutrality-day-of-action/">3</a>, <a href="/netneutrality-cloudflare-fftf/">4</a>, describing Cloudflare’s views on net neutrality.</p><p>I am extremely disappointed that net neutrality is under threat. I am extremely grateful that I work at a company made of people who are fighting for it and I'm hopeful our community (you) can make a difference.</p><p><b>Read, watch, listen, and learn much more about net neutrality and its importance below.</b></p><p>For now, here is my <a href="https://youtu.be/fpbOEoRrHyU">favorite video explanation</a> of net neutrality, by <a href="http://iamjohnoliver.com/">John Oliver</a>, host of <a href="https://www.hbo.com/last-week-tonight-with-john-oliver">Last Week Tonight</a> on HBO.</p><p>---------------- ### Battle for the Net</p><p>Because net neutrality is under attack, the <a href="https://www.cloudflare.com/apps/net-neutrality">Battle for the Net</a> app is once again live on <a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a>. The app can be used to “Break the Internet” for the two days before the FCC’s vote, as part of an internet-wide protest.</p><p>This app allows site owners to add a pop-up to their sites that will directly connect users to their respective US congresspeople so they may articulate their stance for net neutrality.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/dvNRF2bh1fgh/install?version=2.0.1">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2DcbwJFLFoY9zu0w2X6SzE/eb44d424eeac78e3c05a17a3be179a3d/Screen-Shot-2017-11-16-at-6.38.51-PM.png" />
            </a>
            </figure><p>On a site that uses the Battle for the Net app, users are greeted with a pop-up which briefly explains that net neutrality is under attack, displays a countdown to the day and time (Thursday, December 14th) the FCC will vote to terminate the net neutrality rules, and provides an entry field for the user to enter their phone number.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/dvNRF2bh1fgh/install?version=2.0.1">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3apRHBYmQLSIBTJ8KbtGsv/178472d50f3c16790e226370a6206087/Screen-Shot-2017-11-16-at-7.10.17-PM.png" />
            </a>
            </figure><p>When a user enters their phone number and clicks the "CALL CONGRESS" button, they'll immediately receive an automated phone call from Battle for the Net. The recording instructs the user to enter their zip code, so they'll be connected to their specific congressperson.</p><p>Users may select the option to become a daily caller by pressing 1. This will initiate a process where users will receive calls at the same time each day, connecting them to their congresspeople.</p><p>To make one-time calls, users can just stay on the line. The recording delivers a recommended script to inform the congressperson on the line that the user supports net neutrality and wants the congressperson to contact FCC Chairman Pai and oppose the repeal.</p><p>Here's the written script:</p><p><b>Be polite, introduce yourself, and say: “I support the </b><i><b>existing</b></i><b> Title II net neutrality rules and I would like you to publicly oppose the FCC’s plan to repeal them.”</b></p><p>When done with the first call, users may press * to be directed to another call to their next congressperson.</p><p>I live in San Francisco, so my first call was directed to <a href="https://pelosi.house.gov/">Representative Nancy Pelosi</a>. My second call was directed to <a href="https://www.feinstein.senate.gov/public/">Senator Dianne Feinstein</a>.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/dvNRF2bh1fgh/install?version=2.0.1">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5ZXM0Q6YErbvD5HznJZyG6/53716f2f9a2db006cecb6400c60067ed/Net-Neutrality.gif" />
            </a>
            </figure><p>On Cloudflare Apps, you can <a href="https://www.cloudflare.com/apps/dvNRF2bh1fgh/install?version=2.0.1">preview</a> Battle for the Net and see how it'd look on a site. Cloudflare users can install the app on their site with the click of a button. You can see how a user can enter a phone number into the pop-up. Users are given share links on their screens, so they may share the action they take on Facebook or Twitter. They are also given the option to donate to the cause.</p><p>Though the pop-up covers a significant portion of the page, it can be easily discarded by clicking the "x" in the upper right corner.</p><p><a href="https://www.cloudflare.com/apps/net-neutrality">Use Battle for the Net to Call your Congressperson »</a></p><p>Learn more about Battle for the Net and the Break the Internet protest on <a href="https://www.battleforthenet.com/">their site</a>.</p><hr />
    <div>
      <h3>Are you in San Francisco? Attend Cloudflare’s <i>Save the Internet!</i> Net Neutrality Call-A-Thon</h3>
      <a href="#are-you-in-san-francisco-attend-cloudflares-save-the-internet-net-neutrality-call-a-thon">
        
      </a>
    </div>
    <p>Join us at Cloudflare (or remotely) in the fight for net neutrality</p><p>The event will kick off with an introduction to net neutrality and why we think it's important. We'll preview the Battle for the Net app and use it to find our local representatives and call and tweet at them, letting them know we want them to take a stand for net neutrality.</p><p>Pizza will be provided for callers. Bring your own cell phone.</p><p>Tuesday, December 12th: 12:00pm-1:00pm</p><p>Cloudflare San Francisco101 Townsend StreetSan Francisco, CA 94107</p><p><a href="https://www.eventbrite.com/e/save-the-internet-net-neutrality-call-a-thon-cloudflare-tickets-39998496580?aff=blog">Register Here »</a></p><p>If you can't make it on-site, join the effort by calling through the app, remotely.</p>
    <div>
      <h3>Further reading about net neutrality</h3>
      <a href="#further-reading-about-net-neutrality">
        
      </a>
    </div>
    <p><b>Key moments for </b><a href="https://en.wikipedia.org/wiki/Net_neutrality_in_the_United_States"><b>Net Neutrality</b></a></p><ul><li><p>The 1990's: The issue of net neutrality has been a discussion since the early days of the Internet in the 1990s, between users and service providers. There were no clear legal protections requiring net neutrality until 2015.</p></li><li><p>2015: The FCC classified broadband as a Title II communication service with providers being "common carriers", not "information providers", under former <a href="https://twitter.com/tomwheelerfcc?lang=en">Chairman Tom Wheeler</a>. Adoption of this notion would reclassify Internet service from one of information to one of telecommunications and ensure net neutrality. Wheeler stated, "This is no more a plan to regulate the Internet than the First Amendment is a plan to regulate free speech. They both stand for the same concept." Read more about the 2015 rules in <a href="http://www.newsweek.com/fcc-passes-new-rules-net-neutrality-and-municipal-broadband-309715">this Newsweek article</a>.</p></li><li><p>January, 2017: Ajit Pai was named the new Chairman of the FCC by President Trump. Pai opposed the 2015 <a href="https://apps.fcc.gov/edocs_public/attachmatch/FCC-15-24A1.pdf">Open Internet Order</a> which protects and promotes the open Internet and stated the he planned to modernize FCC policies. Read about Pai's October Senate confirmation in <a href="https://techcrunch.com/2017/10/02/senate-confirms-ajit-pai-as-fcc-chairman/">this TechCrunch article</a>.</p></li><li><p>April/May, 2017: Pai <a href="https://apps.fcc.gov/edocs_public/attachmatch/DOC-344614A1.pdf">proposed</a> Net neutrality rules be rolled back and service providers instead should voluntarily commit to net neutrality principles. On May 18, 2017 the FCC voted to move forward with the proposal. Over 1,000 companies and investors signed an open letter, opposing the proposal and millions of public pro net neutrality comments were submitted on the FCC website. Read more about the vote in <a href="http://money.cnn.com/2017/05/18/technology/fcc-net-neutrality-vote/index.html">this CNN article</a>.</p></li><li><p>June/July, 2017: The Battle for the Net coalition created a <a href="https://www.pcworld.com/article/3207564/internet/net-neutrality-the-july-12-internet-wide-day-of-action-protest.html">Day of Action</a> during which over 50,000 websites participated in the largest online protest in history. Internet companies, CEOs, politicians, and users spoke out in support of net neutrality.</p></li><li><p>Now: It's time to make a statement again. Use <a href="https://www.cloudflare.com/apps/net-neutrality">Battle for the Net</a> to contact your congressperson and find other ways to make a statement to protect net neutrality.</p></li></ul><p><b>Here are five more great videos, explaining net neutrality and why it's important.</b></p><ol><li><p><a href="https://vimeo.com/223504176">Video</a> created by <a href="https://twitter.com/elisolinas">Elisa Solinas</a>, Senior Creative at Vimeo, explaining why net neutrality is so important for video makers, viewers, and all-around Internet video lovers.</p></li><li><p><a href="https://www.youtube.com/watch?v=njVzRph3JJs">Video</a> of <a href="http://www.europarl.europa.eu/meps/en/124816/JULIA_REDA_home.html">Julia Reda</a>, a Member of the European (EU) Parliament from Germany, discussing the importance of net neutrality and new EU legislation designed to reinforce the principle.</p></li><li><p><a href="https://www.youtube.com/watch?v=77V2Xu_AtXc">Video</a> of <a href="https://www.sanders.senate.gov/">Bernie Sanders</a>, US Senator for Vermont, explaining how it's imperative that we have net neutrality.</p></li><li><p><a href="https://www.youtube.com/watch?time_continue=1&amp;v=siULdpCMU3M">Video</a> of FCC Commissioner <a href="https://www.fcc.gov/general/commissioner-mignon-clyburn">Mignon Clyburn</a> speaking about how "net neutrality is doomed if we're silent."</p></li><li><p><a href="https://www.youtube.com/watch?v=92vuuZt7wak">Video</a> of <a href="http://iamjohnoliver.com/">John Oliver</a>, host of <a href="https://www.hbo.com/last-week-tonight-with-john-oliver">Last Week Tonight</a> on HBO, giving a second commentary on net neutrality.</p></li></ol><p><b>The argument against net neutrality</b></p><p>Watch or read <a href="https://www.pbs.org/newshour/show/fcc-chair-ajit-pai-explains-wants-scrap-net-neutrality">an interview</a> with Ajit Pai by PBS about why he wants to do away with net neutrality.</p>
    <div>
      <h3>More about the FCC</h3>
      <a href="#more-about-the-fcc">
        
      </a>
    </div>
    <ul><li><p>The FCC is a 5-member Commission, made up of three Republicans, including <a href="https://www.fcc.gov/about/leadership/ajit-pai">Pai</a>, and two Democrats, including <a href="https://www.fcc.gov/general/commissioner-mignon-clyburn">Clyburn</a>.</p></li><li><p>Its purpose is to regulate interstate and international communications by radio, television, wire, satellite, and cable in all 50 states, the District of Columbia and U.S. territories.</p></li><li><p>It's an independent agency of the US government, overseen by Congress. The Commission is responsible for implementing and enforcing America’s communications law and regulations. It has over 1,700 employees and a budget of almost $400 Million.</p></li></ul><p>Read more on the <a href="https://www.fcc.gov/">FCC website</a>.</p><p>Read more on the <a href="https://en.wikipedia.org/wiki/Federal_Communications_Commission">FCC Wikipedia page</a>.</p>
    <div>
      <h3>Conclusion</h3>
      <a href="#conclusion">
        
      </a>
    </div>
    <p>I was encouraged, for a moment, when I read <a href="https://techcrunch.com/2017/10/26/fcc-wont-vote-on-net-neutrality-in-november/">an article</a>, claiming that the FCC would not be voting on the repeal of net neutrality in November. But now net neutrality is under attack again, just one month later. We need to fight for it. Join the fight.</p><p><a href="https://www.cloudflare.com/apps/net-neutrality">Call your Congressperson »</a></p><p><a href="https://www.eventbrite.com/e/save-the-internet-net-neutrality-call-a-thon-cloudflare-tickets-39998496580?aff=blog">Attend Cloudflare's Save the Internet! Net Neutrality Call-A-Thon »</a></p> ]]></content:encoded>
            <category><![CDATA[Net Neutrality]]></category>
            <category><![CDATA[FCC]]></category>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Policy & Legal]]></category>
            <category><![CDATA[Politics]]></category>
            <guid isPermaLink="false">2qPc738xhDNh8nIfY25Vze</guid>
            <dc:creator>Andrew Fitch</dc:creator>
        </item>
        <item>
            <title><![CDATA[Cloudflare Apps Platform Update: November Edition]]></title>
            <link>https://blog.cloudflare.com/cloudflare-apps-platform-update-november-edition/</link>
            <pubDate>Tue, 28 Nov 2017 18:00:00 GMT</pubDate>
            <description><![CDATA[ Since our last newsletter, dozens of developers like you have reached out with ideas for new kinds of apps that weren’t yet possible.  ]]></description>
            <content:encoded><![CDATA[ <p>Since our last newsletter, dozens of developers like you have reached out with ideas for new kinds of apps that weren’t yet possible. These are some of my favorite conversations because they help us find out which features should be prioritized. With your guidance, we’ve spent this month meticulously converting our supply of Halloween candy into those ideas. Let’s dive in and see what’s new!</p>
    <div>
      <h3>? Paid App Product Enhancements</h3>
      <a href="#paid-app-product-enhancements">
        
      </a>
    </div>
    <p>We’ve made it easier to upsell premium features with product specific options. Customers can try out exclusive features before making a purchase, on any site, even without Cloudflare account! Here’s an example of Lead Box using <a href="https://www.cloudflare.com/apps/developer/docs/install-json/options#limiting-radio-options-to-a-set-of-products">product specific radio buttons</a>:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2RJXwYv56e20NI57m2ZR5d/ce05000817f1d7ebc1e688d77d6ecc99/Screen-Shot-2017-11-22-at-5.31.19-AM.png" />
            
            </figure><p>Previewing premium features in <a href="https://www.cloudflare.com/apps/lead-box/install">Lead Box</a></p><p>In this example, a customer can choose to see the newsletter option after choosing the "Pro" plan. Developers can now update the <a href="https://www.cloudflare.com/apps/developer/docs/install-json/preview">Live Preview</a> in response to this choice. We’ve added new <code>"_product"</code> keyword for this event. Here’s a snippet on how Lead Box handles a customer <a href="https://github.com/cloudflare-apps/lead-box/blob/68a914ab58e526aa62572e2e16b9cb631f4cdfff/install.json#L14-L29">changing products</a> without refreshing the page:</p>
            <pre><code>{
  "preview": {
    "handlers": [
      {
        "options": ["_default"],
        "execute": "INSTALL_SCOPE.setOptions(INSTALL_OPTIONS)"
      },
      {
        "options": ["_product"],
        "execute": "INSTALL_SCOPE.setProduct(INSTALL_PRODUCT)"
      }
    ]
  }
}</code></pre>
            
            <pre><code>let options = INSTALL_OPTIONS
let product = INSTALL_PRODUCT

function renderApp () {/*...*/}

window.INSTALL_SCOPE = {
  setOptions (nextOptions) {
    options = nextOptions
    renderApp()
  },
  setProduct (nextProduct) {
    product = nextProduct
    renderApp()
  }
}</code></pre>
            
    <div>
      <h3>? Comments &amp; Ratings</h3>
      <a href="#comments-ratings">
        
      </a>
    </div>
    <p>Our previous newsletter included two of our most requested features: customer feedback, and install metrics. Together these features have helped developers reach out to their customers and track down issues. Customers can now share their feedback publically with comments and ratings:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4RcAjLum5hUPeNquIAxxyt/c5ea9a22dd11eb02647f4959af02d4ab/previous-comments-1.png" />
            
            </figure><p>Revealing older comments.</p><p>Comments for previous releases are initially hidden to emphasize the most recent feedback. As customers send in new feedback, previous ratings will have less of an impact on your app’s sentiment. Apps that score well with customers will gradually increase your visibility in the public listing as well!</p>
    <div>
      <h3>? Mananging DNS via Apps</h3>
      <a href="#mananging-dns-via-apps">
        
      </a>
    </div>
    <p>We’ve saved the best for last! App developers can now manage a customer’s DNS records. The simplest way to define a DNS record is directly in your app’s <code>install.json</code> file. This for example, would allow a customer to create a CNAME to send traffic to your domain, and insert a <code>A</code> record on their root domain:</p>
            <pre><code>{
  "resources": [/*...*/],
  "hooks": [/*...*/],
  "options": {
    "properties": {
      "subdomain": {
        "type": "string"
      }
    }
  },
  "dns": [
    {
      "type": "CNAME",
      "name": "{{subdomain}}",
      "content": "shops.myservice.com"
    },
    {
      "type": "A",
      "content": "1.2.3.4",
      "ttl": 60,
      "proxied": true
    }
  ]
}</code></pre>
            <p>The customer can then confirm your changes after before completing their installation.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5ZzXNIl4h8JiMvf8Bxqoqo/56ceadab6ec4fa446b4673cec76d08b2/DNS.png" />
            
            </figure><p>Requesting permission to access a customer’s email address and DNS entries.</p><p>DNS records make it possible to add new records to a customer’s account for your email services, blogging platforms, customer management systems, <a href="https://www.cloudflare.com/apps/developer/docs/dns">and much, much more</a>!</p>
    <div>
      <h4>⚙ Other Platform Improvements</h4>
      <a href="#other-platform-improvements">
        
      </a>
    </div>
    <p>We’ve made hundreds of changes since our last newsletter, some more visible than others. Here’s a quick recap of some our favorites:</p><ul><li><p>New Cloudflare customers are onboarded with apps after registration</p></li><li><p>Updated docs on <a href="https://www.cloudflare.com/apps/developer/docs/webhooks#item-add-event">“item add” event</a></p></li><li><p>Developers can now optionally link to their public GitHub repository</p></li><li><p>A new input type: Numbers <a href="https://www.cloudflare.com/apps/developer/docs/install-json/options#number-with-unit">with units</a>!</p></li></ul>
    <div>
      <h2>Thank you ?</h2>
      <a href="#thank-you">
        
      </a>
    </div>
    <p>In the spirit of Thanksgiving, we raise a gravy boat to everyone who made this winter a little warmer. To the all the Cloudflarians and developers who sent in feedback, we say <b>thank you!</b></p><p>Reach out at <a href="https://twitter.com/CloudflareApps">@CloudflareApps</a> and let us know what you’d like to see next!!!</p><p>Until next time! ⛄️️</p><p>— Teffen</p><p>Powerful tools built by world-class developers, delivered by Cloudflare, easily added to your website.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/2IAzPTMTwhimAtCSIAY7SJ/2379d80b1dedcc9afcfe0ab00dbdb0b5/gcp-logo-2.png" />
            
            </figure><p>Up to $100k in Cloud Credits</p><p>Cloudflare Apps makes it easy to get what you build installed, but building a great app also requires great infrastructure. We’ve partnered with Google to offer app developers like you up to $100,000 in free Google Cloud credits to support the apps you build.</p><p><a href="https://www.cloudflare.com/apps/developer/offers/google">Check it out ›</a></p><p>.content-box { margin: 1em auto; max-width: 100%; box-sizing: border-box; } .content-box img { padding: .5em; border: 1px solid #ddd; border-radius: 3px; max-height: 100%; box-sizing: border-box; } .content-box[data-image="1"] img { background-color: #f3f3f3; padding: 0; } .content-box[data-image="2"] img { background-color: #fff; padding: 0; } .content-box[data-image="3"] img { background-color: #eee; padding: 0; } @media (min-width: 768px) { .content-box[data-image="1"] img { height: 314px; } .content-box[data-image="2"] img { height: 449px; } .content-box[data-image="3"] img { height: 428px; } } .content-footer { display: flex; align-items: center; justify-content: center; flex-flow: column; padding: 1em .5em; background: #272727; color: #f1f1f1; line-height: 1.533; position: absolute; left: 0; right: 0; } .content-footer .email-pitch { text-align: center; } .content-footer #mc-embedded-subscribe-form { display: flex; align-items: center; } .content-footer #mce-responses { margin-left: .5em; } .content-footer #mce-EMAIL { flex: 0 1 auto !important; width: 245px; margin: 0; } .content-footer #mce-EMAIL, .content-footer #mc-embedded-subscribe { height: 2.4em; font-size: 1.2em; line-height: 1; } .content-footer #mc-embedded-subscribe { padding: .55em 1em; font-weight: 500; } .content-footer #mc-embedded-subscribe-form, .content-footer #mc-embedded-subscribe-form &gt; * { flex: 0 0 auto; } .content-footer .email-container { display: flex; } .content-footer .playbook-container { display: flex; align-items: center; } .content-footer .content-accent { flex: 0 0 auto; } .content-footer .content-accent img { height: 145px; margin-right: 2em; } .content-footer .content-headline { font-size: 2.1em; font-weight: bold; } .content-footer .content-description { font-size: .9em; max-width: 600px; margin-bottom: 1em; } @media (max-width: 768px) { .content-footer .email-container { flex: 1 1 auto; width: 100%; } .content-footer .playbook-container { flex-flow: column; } } /* Floating Sidebar */ body.floating-sidebar .primary-content, body.floating-sidebar .post-content { width: 100% !important; } body.floating-sidebar aside.sidebar { float: right !important; margin-bottom: 0.5em; } .post-content, .post-header { max-width: 36em; } body.floating-sidebar .post-content, body.floating-sidebar .post-header { max-width: none; } body.floating-sidebar .footer-nav { width: 100% !important; } /* Social */ .social { display: flex; align-items: center; } /*.fb_iframe_widget { padding-top: 3px; padding-right: 1px; }*/ .social &gt; * + * { margin-right: 0 !important; margin-left: 7px !important; } .social &gt; .IN-widget { margin-bottom: -2px !important; margin-left: 9px !important; } /* Hide period after author */ .post-header .meta a { border-right: 5px solid white; margin-right: -5px; position: relative; } /* Post */ body { background-color: white; } .post-header, .post-content p, .post-content h1, .post-content h2, .post-content h3, .post-content h4, .post-content h5, .post-content pre, .post-content ul, .post-content figcaption { display: block; margin-left: auto; margin-right: auto; width: 75%; } .post-content pre { width: 55%; font-size: .7em; margin-bottom: 1.9em; } .post-content figcaption { text-align: center; font-style: italic; opacity: .8; margin-top: 0.2em; margin-bottom: 1.9em; font-size: .9em; } pre, code { font-size: inherit; line-height: inherit; } section.primary-content { font-size: 16px; line-height: 1.6; color: black; } blockquote { padding-bottom: 1.5em; padding-top: 1em; font-style: italic; font-size: 1.2rem; } blockquote.pull-quote-centered { font-size: 1.2em; text-align: center; max-width: 100%; margin-left: auto; margin-right: auto; } blockquote blockquote { margin-left: 1em; padding-left: 1em; border-left: 5px solid rgba(0, 0, 0, 0.2); padding-bottom: 0.5em; padding-top: 0.5em; margin-bottom: 0.5em; margin-top: 0.5em; } p.attribution { color: #666; font-size: 0.8em; padding-bottom: 1em; } a code.year { text-decoration: underline; } .closing-cards #mc_embed_signup .mc-field-group { margin: 0.75em 0; } .closing-cards #mc_embed_signup input { font-size: 1.5em; height: auto; } .closing-cards #mc_embed_signup input[type="email"] { border: 1px solid #bcbcbc; border-radius: 2px; margin-bottom: 0; } .closing-cards #mc_embed_signup input[type="submit"] { background: #f38020; color: #fff; padding: .8em 1em .8em 1em; white-space: nowrap; line-height: 1.2; text-align: center; border-radius: 2px; border: 0; display: inline-block; text-rendering: optimizeLegibility; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: subpixel-antialiased; user-select: none; -webkit-appearance: none; appearance: none; letter-spacing: .04em; text-indent: .04em; cursor: pointer; } .closing-cards #mc_embed_signup div.mce_inline_error { background-color: transparent; color: #C33; padding: 0; display: inline-block; font-size: 0.9em; } .closing-cards #mc_embed_signup p:not(:empty) { line-height: 1.5; margin-bottom: 2em; } .closing-cards #mc_embed_signup input[type="email"] { font-size: 20px !important; width: 100% !important; padding: .6em 1em !important; } .closing-cards #mc_embed_signup .mc-field-group { margin: 0 !important; } .closing-cards #mc_embed_signup input[type="submit"] { font-size: 20px !important; margin-top: .5em !important; padding: .6em 1em !important; } .closing-cards #mc_embed_signup div.mce_inline_error { padding: 0; margin: 0; color: #F38020 !important; } aside.section.learn-more { display: none; } .closing-cards { background: #eee; width: 100%; list-style-type: none; margin-left: 0; } .closing-card { width: calc(50% - 10px) !important; font-size: 20px; padding: 1.5em; display: inline-block; box-sizing: border-box; vertical-align: top; } #mc_embed_signup { max-width: 400px; margin: 1em auto; } @media (min-width: 768px) { #mc_embed_signup { margin-left: 1em; } } @media (max-width: 788px){ .closing-card { width: 100% !important; } .closing-card + .closing-card { border-top: 10px solid white; } }</p><p>(function () {
'use strict'</p><p>document.body.style.visibility = 'hidden'</p><p>function fakeReady (fn) {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', fn)
} else {
fn()
}
}</p><p>window.$ = window.jQuery = function fakejQuery () {
return {
ready: fakeReady,
fitVids: function () {
// if (window.$.fn.fitVids) {
//   window.$.fn.fitVids.apply(window.$.fn, arguments)
// }
}
}
}</p><p>window.$.fn = window.$.fn || {}</p><p>function restyleBlog () {
'use strict'</p>
            <pre><code>if (window.innerWidth &gt;= 800) {
  var sidebar = document.querySelector('aside.sidebar')
  var header = document.querySelector('header.post-header')
  var post = document.querySelector('article.post')

  try {
    post.insertBefore(sidebar, header)
    document.body.className += ' floating-sidebar'
  } catch (e) { console.log('Style Error', e)}
}

try {
  document.querySelector('body &gt; .wrapper .sidebar').style.display = 'none'
} catch (e) { console.log('Style Error', e)}

try {
  var tagFooter = document.querySelector('.post-content + footer')
  tagFooter.appendChild(document.querySelector('.post-header .social'))
} catch (e) { console.log('Style Error', e)}

function resizeFooter () {
  post.style.paddingBottom = footer.clientHeight + 'px'
}

try {
  var signup = document.querySelector('#mc\_embed\_signup')
  signup.querySelector('#mce-EMAIL').placeholder = 'email@example.com'
  signup.querySelector('#mc-embedded-subscribe').textContent = 'Get Updates'
  signup.querySelector('#mc-embedded-subscribe').className += ' btn-warning'

  var post = document.querySelector('.post-content')
  var footer = post.querySelector('.content-footer')
  footer.querySelector('.email-container').appendChild(signup)

  window.addEventListener('resize', resizeFooter)
  resizeFooter()
} catch (e) { console.log('Style Error', e)}

document.body.style.visibility = ''</code></pre>
            <p>}</p><p>fakeReady(restyleBlog)
})()</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Product News]]></category>
            <category><![CDATA[Speed & Reliability]]></category>
            <category><![CDATA[Developers]]></category>
            <guid isPermaLink="false">3jBuK4LEDOzQTBpI07oKKA</guid>
            <dc:creator>Teffen Ellis</dc:creator>
        </item>
        <item>
            <title><![CDATA[Releasing AddThis on Cloudflare Apps: Making Disciplined Product Design Decisions]]></title>
            <link>https://blog.cloudflare.com/addthis/</link>
            <pubDate>Wed, 22 Nov 2017 13:00:00 GMT</pubDate>
            <description><![CDATA[ When our team learned about the opportunity to build an AddThis app on Cloudflare Apps, I was ready to pounce.  ]]></description>
            <content:encoded><![CDATA[ <p><i>This is a guest post by </i><a href="https://twitter.com/emilykendall"><i>Emily Schwartz</i></a><i>, Product Manager for the </i><a href="http://addthis.com/"><i>AddThis</i></a><i> team at </i><a href="https://www.oracle.com/index.html"><i>Oracle</i></a><i>. With a background in digital media that has spanned across NPR, WaPo Labs, Trove, and others, Emily cares deeply about helping publishers leverage data and technology for success.</i></p>
            <figure>
            <a href="https://www.cloudflare.com/apps/addthis-share-buttons">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7vhQFf9Qrc3oHim4t3Yd3B/437635dd7f6e0d84d651a80615f08abd/AddThis-Blog-Header.png" />
            </a>
            </figure>
    <div>
      <h3>The Process of Paring Down</h3>
      <a href="#the-process-of-paring-down">
        
      </a>
    </div>
    <p>When our team learned about the opportunity to build an <a href="https://www.cloudflare.com/apps/addthis-share-buttons">AddThis app</a> on <a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a>, I was ready to pounce. Building for distribution platforms is a core part of our business and product strategy, and I knew AddThis could bring a lot to the table for Cloudflare users. With a <a href="https://twitter.com/emilykendall">media background</a> in my pocket, I understand the necessity of making content easily and quickly distributable -- and I wanted to get our tools in front of new users so we could learn more about the critical needs of publishers, merchants, and website owners.</p>
    <div>
      <h4>The decision to build was the easy part. What to build was the challenging part.</h4>
      <a href="#the-decision-to-build-was-the-easy-part-what-to-build-was-the-challenging-part">
        
      </a>
    </div>
    
            <figure>
            <a href="https://www.cloudflare.com/apps/addthis-share-buttons">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/23itfgU0GPdCVZpxD2c17W/2655dbc6cd5827319f2dc86e522bd460/-2-AddThis.png" />
            </a>
            </figure><p>With time and resources tight, I knew building an app that offered our full suite of website tools wouldn’t be immediately feasible—or even make sense. Share buttons, follow buttons, related posts, list building, link promotion, and tip jar are all useful products, but launching with a more narrow tool and feature set meant we could reach the market sooner, learn from user behaviors, and identify needs unique to Cloudflare Apps publishers. I opted to forge ahead with our most popular tool: share buttons.</p><p>If you try to configure share buttons from <a href="http://www.addthis.com/">addthis.com</a>, there are a lot of ways to do this: Floating, Inline, Expanded, Image Sharing, Popup, Banner, and Slider. Seven options just for share buttons! My goal with Cloudflare Apps was to launch something simple, useful, and closer to drag-and-drop than code-and-configure. With this in mind, I made a hard decision: pare down our app to the simplest version of our floating sharing sidebar—our most popular share buttons type—and cut many of the advanced configuration options. Instead, I decided to serve auto-personalized buttons and limit settings to cosmetic changes like number of services displayed and bordered styling. Perhaps the biggest change: users don’t even need to register an AddThis account to use our share buttons on Cloudflare Apps or work with any code. We created the simplest version of our share buttons to date.</p>
    <div>
      <h4>With the scope trimmed down to “Share Buttons Lite,” we got to work.</h4>
      <a href="#with-the-scope-trimmed-down-to-share-buttons-lite-we-got-to-work">
        
      </a>
    </div>
    
            <figure>
            <a href="https://www.cloudflare.com/apps/addthis-share-buttons">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/31kXlgWFK40AloZW1LfRmx/f6e6a4f3407f26a86bebb15ce73f33c5/-3-AddThis.png" />
            </a>
            </figure><p>The AddThis team is no stranger to building for third-party platforms. Our tools are found on platforms like WordPress, Shopify, Magento, and others. Building for Cloudflare Apps turned out to be more of a dream, better than we could have imagined. There was one wrinkle to figure out: if we weren’t asking users to create or log in to an addthis.com account, how would we save unique configuration settings?</p>
    <div>
      <h4>Some background</h4>
      <a href="#some-background">
        
      </a>
    </div>
    <p>Every website with AddThis tools has a configuration object where on-page tool settings are stored. This includes configuration data such as layout, color, theme, and social media handles. This data needs to be stored each time tools are updated via the Cloudflare portal and loaded each time a website visitor lands on a page with AddThis tools. Ideally, this information is stored in a database and read each time tools are rendered. While this approach is feasible when users configure tools through the addthis.com dashboard, it’s not an option in Cloudflare Apps.</p><p>How to store and render sidebar settings for each user became an anticipated hurdle. Luckily, there was a good solution: save the tool configuration data on a JS global variable using Cloudflare’s suggested <a href="https://www.cloudflare.com/apps/developer/docs/techniques/scripts">INSTALL_SCOPE JS technique</a> and, <a href="https://www.addthis.com/academy/smart-layers-api/">using the AddThis Smart Layers API</a>, render the tools from this global variable to display in the preview portal. When the user saves their configuration, we call and serve the settings stored on that global variable each time tools need to be rendered.</p><p>Anyone can check out this method in action by <a href="https://www.cloudflare.com/apps/addthis-share-buttons">previewing the AddThis Share Buttons app</a> from Cloudflare Apps and playing around with the tools’ positioning, styling, and other settings.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/addthis-share-buttons">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/37H0N8saLP6KluG5BeyVBV/6ea752ac82a5303b592bbe77b59693ac/AddThis-preview.png" />
            </a>
            </figure><p>In the few weeks since our launch, we’ve received a lot of useful feedback—good, bad, and ugly. The Cloudflare Apps developer portal allows developers to view basic metrics and user comments that keep third parties up-to-date about what’s important to websites and publishers. In the future, we’re considering connecting the app to the addthis.com dashboard and including other tool styles or types. We’ve heard a lot about page speed scores and mobile performance being important to users, and I’m pleased to report these are both areas of continued investment for AddThis. Paring down Share Buttons—AddThis’ flagship product—was a risk, and it’s one we’re happy we took.</p><p><a href="https://www.cloudflare.com/apps/addthis-share-buttons">Check out a live preview of AddThis in Cloudflare Apps »</a></p><p>Want to shape the future of content and sharing? We’re all ears at <a href="help@addthis.com">help@addthis.com</a> and <a href="https://twitter.com/addthissupport">@addthissupport</a>. Happy sharing.</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[JavaScript]]></category>
            <category><![CDATA[Developers]]></category>
            <guid isPermaLink="false">4bG1m0QPmCLuHfholgIYu0</guid>
            <dc:creator>Guest Author</dc:creator>
        </item>
        <item>
            <title><![CDATA[7 Cloudflare Apps Which Increase User Engagement on Your Site]]></title>
            <link>https://blog.cloudflare.com/7cloudflareappsengagement/</link>
            <pubDate>Tue, 14 Nov 2017 20:21:00 GMT</pubDate>
            <description><![CDATA[ Cloudflare Apps now lists 95 apps from apps which grow email lists to apps which acquire new customers to apps which help site owners make more money.  ]]></description>
            <content:encoded><![CDATA[ <p></p><p><a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a> now lists 95 apps from apps which grow email lists to apps which acquire new customers to apps which help site owners make more money. The great thing about these apps is that users don't have to have any coding or development skills. They can just sign up for the app and start using it on their sites.</p><p>Let’s take a moment to highlight some apps which increase a site’s user engagement. Check out more Cloudflare Apps which <a href="https://www.cloudflare.com/apps/category/grow-your-email-list">grow your email list</a>, <a href="https://www.cloudflare.com/apps/category/make-money-on-your-site">make money on your site</a>, and <a href="https://www.cloudflare.com/apps/category/get-more-customers">get more customers</a>.</p><p>I hope you enjoy them and I hope you build (or use) great apps like these too.</p><p><a href="https://www.cloudflare.com/apps/">Check out other Cloudflare Apps »</a></p><p><a href="https://www.cloudflare.com/apps/developers">Build an app on Cloudflare Apps »</a></p>
    <div>
      <h3>1. <a href="https://www.cloudflare.com/apps/privy">Privy</a></h3>
      <a href="#1">
        
      </a>
    </div>
    
            <figure>
            <a href="https://www.cloudflare.com/apps/privy">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/70S0SvPTVtya0jwgbOw8Ee/6c3e4a1b5fa79fe7b3e909a619d87635/Screen-Shot-2017-11-10-at-10.44.53-AM.png" />
            </a>
            </figure><p>Over 100,000 businesses use Privy to capture and convert website visitors. Privy offers a free suite of email capture tools, including exit-intent driven website popups &amp; banners, email list sign-up, an online store, social media channels, mobile capability, and in-store traffic.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/privy/install">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/biMo8zV3xPSrF57GQjbdM/03493288ac1f708d7a1e74ed8264f337/Screen-Recording-2017-11-10-at-04.13-PM.gif" />
            </a>
            </figure><p>In the left preview pane, you can view the different packages and their features users may sign up for from free to "growth" ($199/month) options.</p><p>In the right pane, you can preview your choices, seeing how Privy's functionality interacts with the site and users and even play around with the popups yourself. I personally love the confetti.</p>
    <div>
      <h3>2. <a href="https://www.cloudflare.com/apps/add-this-share-buttons">AddThis Share Buttons</a></h3>
      <a href="#2">
        
      </a>
    </div>
    
            <figure>
            <a href="https://www.cloudflare.com/apps/add-this-share-buttons">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3cz3qFb9kbFGswrhuAoSXc/101fa7d8d2c79927ff2f9cd4016d038c/Screen-Shot-2017-11-10-at-1.05.28-PM.png" />
            </a>
            </figure><p>The Share Buttons app from AddThis is a super easy way to add sidebar share buttons to a website and get the site's content distributed to over 200 social media channels, auto-personalized for users. Site owners can display between 1-10 share services, customized for their users. Site owners are able to control the size and style of buttons as well.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/add-this-share-buttons">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4GXFs1yq0i1RloFInf73Fm/825d512940a13884bfd3578c80d7dd82/-2.gif" />
            </a>
            </figure><p>In the left pane, you can see the install options where you can customize the size, theme and position of the banner. You can adjust the number of social platforms listed and choose to list the number of content shares per platform or total.</p><p>In the right pane, you can preview choices, seeing what they’d look like on any website and experiment with placement and how it flows with the site. This is very similar to the tool that the app developer uses to test the app for how it behaves on a wide range of web properties.</p>
    <div>
      <h3>3. <a href="https://www.cloudflare.com/apps/vimeo">Vimeo</a></h3>
      <a href="#3">
        
      </a>
    </div>
    
            <figure>
            <a href="https://www.cloudflare.com/apps/vimeo">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4lwKX3fENkBtpb7lerUgtv/d1a159de5aef44df063a276a892ccd77/Screen-Shot-2017-11-10-at-10.59.04-AM.png" />
            </a>
            </figure><p>This app embeds Vimeo videos directly onto sites, so people can easily find a view videos the site owners made, or maybe just a few of their favorites. The Vimeo app supports autoplay and multiple videos on one page, in multiple locations on the page. A site owner can put videos almost all over their site, if they wish.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/add-this-share-buttons">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3xkDwBwh8Y0WJBJxPgKNLB/d7f4937a44577112261c8fdc0835ff90/-3.gif" />
            </a>
            </figure><p>In the left pane, you can change the location of the video on the page, change its orientation in each location, switch Vimeo video links, and add multiple videos to the page.</p><p>In the right pane, you can preview your choices, seeing where each video will be displayed.</p>
    <div>
      <h3>4. <a href="https://www.cloudflare.com/apps/soundcloud">SoundCloud</a></h3>
      <a href="#4">
        
      </a>
    </div>
    
            <figure>
            <a href="https://www.cloudflare.com/apps/soundcloud">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/SDks8j7DIQI5NvYgvRXIn/0dcac7a6d07e832a71a74cd73af3fe94/Screen-Shot-2017-11-10-at-11.02.03-AM.png" />
            </a>
            </figure><p>You can't grow as a musician or podcaster or influencer if your favorite tracks are not heard. The SoundCloud app embeds SoundCloud tracks or playlists directly on sites to grow a site owner's audience, help them find fans, or gives the reader a taste of the music being reviewed in a blog post, all of which work towards engaging users on their sites longer.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/add-this-share-buttons">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1QFgIiOI9rLjuWDEnsggb5/3e3030d931f6fde6556d5aa47c2c9b8a/-4.gif" />
            </a>
            </figure><p>This preview works very similarly to the Vimeo preview. You can change the location of the track/playlist on the page, its orientation in each location, switch audio tracks/playlists, and add multiple tracks/playlists to the page.</p>
    <div>
      <h3>5. <a href="https://www.cloudflare.com/apps/drift">Drift</a></h3>
      <a href="#5">
        
      </a>
    </div>
    
            <figure>
            <a href="https://www.cloudflare.com/apps/drift">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7IarNsrwBmhqishth748jg/7644c93768b0cceba622a54f7ea0b809/Screen-Shot-2017-11-10-at-1.08.36-PM.png" />
            </a>
            </figure><p>Drift uses messaging and artificial intelligence to catch leads that are falling through the cracks in sales funnels. Billions of people around the world are using messaging apps like Slack and HipChat to communicate in real-time these days and customers often don't want to wait for follow-up emails or calls.</p><p>After installing Drift, site owners are able to engage with leads when they’re at their most interested - while they’re actually live on their sites. Using intelligent bots, qualified leads can be captured 24/7, even when no human is available to chat.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/drift">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6LP1HJtTEz5Jn30sGIAvZx/499fc058ba3c8ee6c014bfcf1fd2821f/-5-Drift.gif" />
            </a>
            </figure><p>In Drift's preview, you can view how the styling and messaging of the chat box may be adjusted. You can change the organization name, welcome message, and away message. You can also select the "automatically open chat" to give users a more visible chat invitation.</p>
    <div>
      <h3>6. <a href="https://www.cloudflare.com/apps/skype-live-chat">Skype Live Chat</a></h3>
      <a href="#6">
        
      </a>
    </div>
    
            <figure>
            <a href="https://www.cloudflare.com/apps/skype-live-chat">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6bYa8fObwaGtkW9AVXWrux/465b74a41fb105d911769aa2ecdbf088/Screen-Shot-2017-11-10-at-1.10.27-PM.png" />
            </a>
            </figure><p>Skype Live Chat installs on websites easily. Site owners just add their Skype usernames or bot IDs to start chatting with their customers. Considering there are over 74 million Skype users, this app allows users to chat in a way that they're comfortable and familiar with.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/skype-live-chat">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5Xw3IgVJOrGYnf6Yh1FuFO/bfb8b7dabeacbee16354b330325545c1/-6-Skype.gif" />
            </a>
            </figure><p>In the left pane, you can see options to change the color of the chat button and message bubble. In the right pane, you can see the results and how users will be prompted to log into their Skype accounts, if they aren't already.</p>
    <div>
      <h3>7. <a href="https://www.cloudflare.com/apps/weather-widget">Weather Widget</a></h3>
      <a href="#7">
        
      </a>
    </div>
    
            <figure>
            <a href="https://www.cloudflare.com/apps/weather-widget">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/WrfkaPtQV6MNplfogBmJV/7b41a00fc101dd3589a7b03872a29c91/Screen-Shot-2017-11-10-at-1.12.37-PM.png" />
            </a>
            </figure><p>WeatherWidget.io provides an easy, interactive interface which site owners can create and customize a weather widget for any website. WeatherWidget.io is highly customizable. The labels, font, theme, number of forecast days, and icon sets, may all be edited to maximize user engagement. The app is responsive to the size of its container and available in 20 languages with more languages on their way.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/weather-widget">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/41t7OAnErK1eUIpM8AH5jD/4cdcf86b9e8db7cbec40bb6140fdc720/-7-Weather.gif" />
            </a>
            </figure><p>There are a lot of options to play with here. In the left pane, you can see the location of the banner can be changed. The weather location can be adjusted and custom labels assigned to it. I chose "SF, CA" in the preview. The language and units (celsius vs fahrenheit) can be switched. Next, the font, icon type (I chose animated climacons) and option to choose forecast vs. current weather can be changed. Finally you can play with theme with options from "orange" to "blue mountains" and adjust the widget's margins.</p><p>In the right pane, you can see your options come to life.</p><hr /><p>I hope you enjoy playing with and using these apps. Cloudflare is encouraging app authors to write their apps on the app platform. I hope you'll consider developing one of your own.</p><hr /><p><a href="https://www.cloudflare.com/apps/developers">Build an app on Cloudflare Apps »</a></p><p>© 2017 Cloudflare, Inc. All rights reserved. The Cloudflare logo and marks are trademarks of Cloudflare. All other company and product names may be trademarks of the respective companies with which they are associated.</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Developers]]></category>
            <guid isPermaLink="false">6cGOVdTbzaUoup1ROcPbEi</guid>
            <dc:creator>Andrew Fitch</dc:creator>
        </item>
        <item>
            <title><![CDATA[5 Strategies to Promote Your App]]></title>
            <link>https://blog.cloudflare.com/5-strategies-to-best-promote-your-app/</link>
            <pubDate>Fri, 27 Oct 2017 17:30:00 GMT</pubDate>
            <description><![CDATA[ Brady Gentile from Cloudflare's product team wrote an App Developer Playbook, embedded within the developer documentation page.  ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Brady Gentile from Cloudflare's product team wrote an <a href="https://www.cloudflare.com/apps/assets/Cloudflare%20Apps%20Developer%20Playbook.pdf">App Developer Playbook</a>, embedded within the developer documentation <a href="https://www.cloudflare.com/apps/developer/docs/getting-started">page</a>. He decided to write it after he and his team conducted several app developer interviews, finding that many developers wanted to learn how to better promote their apps.</p><p>They wanted to help app authors out in the areas outside of developer core expertise. Social media posting, community outreach, email deployment, SEO, blog posting and syndication, etc. can be daunting.</p><p>I wanted to take a moment to highlight some of the tips from the App Developer Playbook because I think Brady did a great job of providing clear ways to approach promotional strategies.</p>
    <div>
      <h3>5 Promotional Strategies</h3>
      <a href="#5-promotional-strategies">
        
      </a>
    </div>
    <hr />
    <div>
      <h4>1. Share with online communities</h4>
      <a href="#1-share-with-online-communities">
        
      </a>
    </div>
    <p>Your app’s potential audience likely reads community-aggregated news sites such as <a href="https://news.ycombinator.com/">HackerNews</a>, <a href="https://www.producthunt.com/">Product Hunt</a>, or <a href="https://www.reddit.com/">reddit</a>. Sharing your app across these websites is a great way for users to find your app.</p>
            <figure>
            <a href="https://news.ycombinator.com/">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6XnoCKWlUMSfUxDVJvIF5q/e325d5efba8522fb30fcf0db285a0feb/hacker-news.jpg" />
            </a>
            </figure><p>For apps that are interesting to developers, designers, scientists, entrepreneurs, etc., be sure to share your work with the Hacker News community. Be sure to follow the <a href="https://news.ycombinator.com/newsguidelines.html">official guidelines</a> when posting and when engaging with the community. It may be tempting to ask your friends to upvote you, but honesty is the best policy, and the vote-ring detector will bury your post if you try to game it. Instead, if you don’t frontpage on the first try, consider re-posting on another day, with any of these options: the frontpage of your site, the blog post about the launch of your app, a demo of your app in action, a github repo. It may be worth taking into consideration the rate at which new posts are being added to /newest per minute or per hour, which impacts the likelihood of your post making it to the frontpage.</p><p>Since you’re sharing a project that people can play with, be sure to: 1) use “Show HN” and follow <a href="https://news.ycombinator.com/showhn.html">Show HN guidelines</a>, and 2) be available to answer questions in the comments.</p><p>Be sure to start your title with the words ‘Show HN:’ (this indicates that you’ll be sharing something interesting that you’ve built with the HN community with a live demo people can try), then briefly explain your app within the same field. Rather than just use the name of your app, consider adding something informative, like the short description you use in your Cloudflare Apps marketplace tile. For instance, “Show HN: Trebble (embed voice and music on your site)” is more informative than “Show HN: Trebble” as a post title. Next, you’ll have the option of either submitting the URL of your app or explaining a little bit about yourself, the app, and pasting a link to the app itself.</p><p>Lastly, you should probably take the time to explain yourself and what you're all about in a first comment, as it helps build good rapport with the community. Block off some time on your calendar so you’re available to answer questions and engage with the community for however long your post is on the frontpage. In addition to gathering their valuable feedback, a signal that the app author is there (“Hi, I’m <b>Name</b> and I made this app to solve <b>this problem</b> -- I’d love to get your feedback.”) will often make your project more approachable and put a face on a product.</p>
            <figure>
            <a href="https://www.producthunt.com/">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5cBCwVUlhNEO4roRrLRCgH/4c8694efed570d1281707ecf6e2d177b/Product-Hunt.svg" />
            </a>
            </figure><p>Product Hunt has released <a href="https://blog.producthunt.com/how-to-launch-on-product-hunt-7c1843e06399">a blog post</a> which outlines how to properly submit your app or product to their community. I highly recommended you review this post in its entirety prior to launching your Cloudflare App.</p>
            <figure>
            <a href="https://www.reddit.com/">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/36KOnCDO8hM5Qvg7RsOFNi/dbf986230b19b64e353103c966e7a0d7/Reddit.png" />
            </a>
            </figure><p>Submit a link to your app, along with some screenshots/videos, and a descriptive title for your post, and select a subreddit to post into. For the title of your post, you’ll want to use something descriptive about your app; for example you could say “I just built an app that does [X].”</p><p>If your app isn't relevant to the subreddit in which you post, it'll likely be removed by a moderator, so think carefully about which subreddits would find your app genuinely useful. I also recommend you take some time to engage with that community prior to posting your app, in part because their feedback is valuable, and in part so that you’re not a stranger. Here are two subreddits you should definitely include, though: <a href="https://www.reddit.com/r/apps/">Apps</a>, <a href="https://www.reddit.com/r/Cloudflare/">Cloudflare</a>.</p>
    <div>
      <h4>2. Optimize your app for discoverability</h4>
      <a href="#2-optimize-your-app-for-discoverability">
        
      </a>
    </div>
    <p>One of the most important steps of the Cloudflare app deployment process is ensuring that both visitors browsing <a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a> and anyone doing a search on the web may quickly and easily find your app. By optimizing your Cloudflare app for discoverability, you’ll receive a greater number of views, installations, and revenue.</p>
    <div>
      <h4>Title and description</h4>
      <a href="#title-and-description">
        
      </a>
    </div>
    <p>Your app’s title and short description are the first thing millions of website owners are going to see when coming across your Cloudflare app, whether it’s through browsing <a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a> or on a search engine. It’s important that an app’s title is unique, descriptive, and identifiable.</p><p><a href="https://www.cloudflare.com/apps/noadblock">NoAdBlock</a> is a great example.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/noadblock">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1tJau7uPvNc7W1WRxLLDRL/1392d227dd674c452a7737782a869c16/NoAdBlock-example.png" />
            </a>
            </figure>
    <div>
      <h4>Screenshots</h4>
      <a href="#screenshots">
        
      </a>
    </div>
    <p>Showcasing how your app might appear on a user’s website gives confidence to users thinking about previewing and installing. Include a variety of screenshots, showing multiple ways in which the software can be configured on a user’s website.</p><p>Read more about how to configure your full app description and categories in the <a href="https://www.cloudflare.com/apps/assets/Cloudflare%20Apps%20Developer%20Playbook.pdf">App Developer Playbook</a>.</p>
    <div>
      <h4>3. Promote through your properties</h4>
      <a href="#3-promote-through-your-properties">
        
      </a>
    </div>
    <p>Once your app has launched on <a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a>, it’s important that users are able to envision how your app will work for them and that they're easily able to use it.</p>
    <div>
      <h4>Building an app preview link</h4>
      <a href="#building-an-app-preview-link">
        
      </a>
    </div>
    <p>Preview links allow you to generate a link to the install page for your app, which includes customization options for users to play around with.</p><p>Check out this preview for the <a href="https://www.cloudflare.com/apps/spotify/install">Spotify app</a>:</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/spotify/install">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/49j9hnvytMvtqocDsKhsRC/007beca2030f9ef655347a69c88d9bc2/Screen-Recording-2017-10-20-at-12.01-PM.gif" />
            </a>
            </figure>
    <div>
      <h4>Install badge and placement</h4>
      <a href="#install-badge-and-placement">
        
      </a>
    </div>
    <p>Make it easy and obvious for users. The Cloudflare Install Button is an interactive badge which can be embedded in any online assets, including websites and emails.</p><p>To use the full Cloudflare App install badge, you can paste the code listed in the Playbook onto your website or marketing page.You just need to replace [ appTitle ] and [ appId or appAlias ] with the appropriate details for your app. You can choose a standard button or customize it to your app.</p><p>Here's what <a href="https://www.cloudflare.com/apps/NoAdBlock">NoAdBlock</a> used:</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/NoAdBlock">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/5orFHu4BRSHz2ll6ixfEWP/4d8d7816371bf65addae801c78fb24df/Install-button.png" />
            </a>
            </figure>
    <div>
      <h4>4. Spread word to existing users</h4>
      <a href="#4-spread-word-to-existing-users">
        
      </a>
    </div>
    <p>A quick and easy way to announce your app’s availability is to notify your user base that the app is now available for them to preview and install. Read more in the Playbook on how to grow your user base before the launch.</p><p>Here's a good starting template for an email announcement:</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/assets/Cloudflare%20Apps%20Developer%20Playbook.pdf">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1DshQbe5MzECR3AGMlSdJZ/aedcbdcc12f848d65894915427ed10c2/Email-Template.png" />
            </a>
            </figure>
    <div>
      <h4>5. Form a presence on social media</h4>
      <a href="#5-form-a-presence-on-social-media">
        
      </a>
    </div>
    <p>Targeting users across multiple channels is a pretty easy way to ensure that website owners know your app is now available. Cloudflare can help you with this. Tag @Cloudflare in your posts, so your post will be retweeted and reshared.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/assets/Cloudflare%20Apps%20Developer%20Playbook.pdf">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7hNt3pTVZmStDmaMwVWqS4/8ef2fa8195208cf0797417cd43788510/Twitter-Announcementsw.png" />
            </a>
            </figure>
            <figure>
            <a href="https://www.cloudflare.com/apps/assets/Cloudflare%20Apps%20Developer%20Playbook.pdf">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1yOVoMAV90FDsbGPbNwhV3/7ea04b0c043bad5e3b10e85994c22abd/Facebook-Announcements.png" />
            </a>
            </figure>
    <div>
      <h4>Blog Stuff</h4>
      <a href="#blog-stuff">
        
      </a>
    </div>
    <p>Another way to promote the release of your app is by writing a blog post (or several) on your app’s website, delving into the features and benefits that your app brings to users. In addition to your launch post, you can enumerate the new features and bug fixes in a new and improved release, highlight different use cases from your own user base, or deep dive into a fascinating aspect of how you implemented your app.</p><p>Here's a <a href="https://blog.getadmiral.com/admiral-launches-adblock-solution-for-cloudflare-publishers/">well-written launch blog post</a>, from the makers of <a href="https://www.cloudflare.com/apps/Admiral">Admiral</a>.</p><p>Other blogs may help you with this as well. Syndication is a great way to gain significant exposure for your posts. Brainstorm a list of blogs facing the core audience for your app, and reach out and ask if you can contribute a guest blog post. If developers are the core audience, drop a line to <a>community@cloudflare.com</a>. I’d love to have a conversation about whether a guest post featuring your app would be right for the Cloudflare blog.</p><hr /><p>Again, this is just a glimpse into the guidance that the <a href="https://www.cloudflare.com/apps/assets/Cloudflare%20Apps%20Developer%20Playbook.pdf">App Developer Playbook</a> provides. Check it out and share it with your community of app developers.</p><p>Happy, productive app launching to you!</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Best Practices]]></category>
            <category><![CDATA[SEO]]></category>
            <category><![CDATA[Community]]></category>
            <guid isPermaLink="false">1XiY3FmKSA7yqFwNVlB0pS</guid>
            <dc:creator>Andrew Fitch</dc:creator>
        </item>
        <item>
            <title><![CDATA[Spotify's Cloudflare App is open source: fork it for your next project]]></title>
            <link>https://blog.cloudflare.com/spotify-highlight/</link>
            <pubDate>Wed, 25 Oct 2017 17:00:00 GMT</pubDate>
            <description><![CDATA[ Earlier this year, Cloudflare Apps was launched so app developers may leverage our global network of 6 million+ websites, applications, and APIs.  ]]></description>
            <content:encoded><![CDATA[ <p></p><p>Earlier this year, <a href="https://www.cloudflare.com/apps/">Cloudflare Apps</a> was launched so app developers may leverage our global network of 6 million+ websites, applications, and APIs. I’d like to take a moment to highlight Spotify, which was a launch partner for Cloudflare Apps, especially since they have elected to open source the code to their Cloudflare App.</p><p><a href="https://github.com/CloudflareApps/Spotify">Spotify Github repo »</a></p>
    <div>
      <h4>About Spotify</h4>
      <a href="#about-spotify">
        
      </a>
    </div>
    <p>Spotify is the leading digital service for streaming music, serving more than 140 million listeners.</p>
    <div>
      <h4>What does the Spotify app do?</h4>
      <a href="#what-does-the-spotify-app-do">
        
      </a>
    </div>
    <p>Recently, Spotify launched a Cloudflare App to instantly and easily embed the Spotify player onto your website without having to copy / paste anything.</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/spotify/install">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4kB6BTV56o10E7upCD5D8S/c9de2e2e016a287ce71a2ccab99524b1/Screen-Shot-2017-10-20-at-11.46.19-AM.png" />
            </a>
            </figure>
    <div>
      <h4>Who should install the Spotify app?</h4>
      <a href="#who-should-install-the-spotify-app">
        
      </a>
    </div>
    <p>A musician who runs a site for their band - they can now play samples of new tracks on their tour calendar page and psych up their fans.</p><p>A game creator who wants to share their game's soundtrack with their fans.</p><p>An activewear company which wants to deliver popular running playlists to its customers.</p><p>Web properties that install the Spotify app have the ability to increase user engagement.</p><p>Add Spotify widgets to your web pages and let your users play tracks and follow Spotify profiles. Add a Spotify Play Button to your blog, website, or social page; all your fans have to do is hit “Play” to enjoy the music. You can create Play Buttons for albums, tracks, artists, or playlists.</p>
    <div>
      <h4>How it works for the user</h4>
      <a href="#how-it-works-for-the-user">
        
      </a>
    </div>
    <p>When a logged-in Spotify user clicks the button on your page, the music will start playing in the Spotify player. If the user isn’t logged into their Spotify account, the play button will play a 30-second audio preview of the music and they will be prompted to login or sign up.</p>
    <div>
      <h4>How it works for the website owner</h4>
      <a href="#how-it-works-for-the-website-owner">
        
      </a>
    </div>
    <p>You can customize your button as well as link to any song or album you prefer in Spotify’s music catalog or to a playlist you’ve generated. Take a look at the preview of how the Spotify app would appear on a site here:</p>
            <figure>
            <a href="https://www.cloudflare.com/apps/spotify/install">
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3qwZeukPwV918vmYvKAuOB/e6a837e65a54f68691b09d89d43ee5f8/Screen-Recording-2017-10-20-at-12.01-PM.gif" />
            </a>
            </figure><p>The Cloudflare App creator allows you to preview the app on your site without making any changes to your code.</p><p>In the left pane, you can see the install options where you can select what kind of widget you’d like displayed: a playlist, a track, or a follow button. You can customize the size, theme and position of the banner on your site. The “Pick a location” tool uses CSS selectors to allow you to pinpoint the location on your site where it’s displayed.</p><p>In the right pane, you can preview your choices, seeing what they’d look like on your website and experiment with placement and how it flows with the site. This is very similar to the tool that the app developer uses to test the app for how it behaves on a wide range of web properties.</p><p><a href="https://www.cloudflare.com/apps/spotify/install">Play with the Spotify Preview now »</a></p>
    <div>
      <h4>Fork this App</h4>
      <a href="#fork-this-app">
        
      </a>
    </div>
    <p>Our friends at Spotify made their code available on GitHub. You can clone and fork the repository <a href="https://github.com/CloudflareApps/Spotify">here</a>. It’s a great way to get some practice developing Cloudflare Apps and to start with some basic scaffolding for your app.</p><p>Check out the documentation for Cloudflare Apps <a href="https://www.cloudflare.com/apps/developer/docs/getting-started">here</a>.</p><p>Check out Cloudflare’s new App Developer Playbook, a step-by-step marketing guide for Cloudflare app developers <a href="https://www.cloudflare.com/apps/assets/Cloudflare%20Apps%20Developer%20Playbook.pdf">here</a>.</p> ]]></content:encoded>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Best Practices]]></category>
            <category><![CDATA[Cloudflare Apps]]></category>
            <guid isPermaLink="false">5gbSGQSwIjDSHNUWvUmG8m</guid>
            <dc:creator>Andrew Fitch</dc:creator>
        </item>
        <item>
            <title><![CDATA[Cloudflare London Meetup Recap]]></title>
            <link>https://blog.cloudflare.com/cloudflare-london-meetup-recap/</link>
            <pubDate>Thu, 12 Oct 2017 14:17:00 GMT</pubDate>
            <description><![CDATA[ Cloudflare helps make over 6 million websites faster and more secure. In doing so, Cloudflare has a vast and diverse community of users throughout the world.  ]]></description>
            <content:encoded><![CDATA[ <p>Cloudflare helps make over 6 million websites faster and more secure. In doing so, Cloudflare has a vast and diverse community of users throughout the world. Whether discussing Cloudflare on social media, browsing our community forums or following Pull Requests on our open-source projects; there is no shortage of lively discussions amongst Cloudflare users. Occasionally, however, it is important to move these discussions out from cyberspace and take time to connect in person.</p><p>A little while ago, we did exactly this and ran a meetup in the Cloudflare London office. Ivan Rustic from Hardenize was our guest speaker, he demonstrated how Hardenize developed a Cloudflare App to help build a culture of security. I presented two other talks which included a primer on how the Cloudflare network is architected and wrapped up with a discussion on how you can build and monetise your very own Cloudflare App.</p><p>Since we presented this meet-up, I've received a few requests to share the videos of all the talks. You can find all three of the talks from our last London office meet-up in this blog post.</p>
    <div>
      <h3>How Cloudflare Works</h3>
      <a href="#how-cloudflare-works">
        
      </a>
    </div>
    
    <div>
      <h3>App Highlight: Hardenize by Ivan Ristić</h3>
      <a href="#app-highlight-hardenize-by-ivan-ristic">
        
      </a>
    </div>
    
    <div>
      <h3>Introduction to Building with Cloudflare Apps</h3>
      <a href="#introduction-to-building-with-cloudflare-apps">
        
      </a>
    </div>
    <hr />
    <div>
      <h3>Learn More...</h3>
      <a href="#learn-more">
        
      </a>
    </div>
    <p>If you're interested in the kinds of Denial-of-Service attacks that Cloudflare faces, and how we help mitigate them; check out our Learning Centre for further information on <a href="https://www.cloudflare.com/learning/ddos/what-is-a-ddos-attack/">DDOS mitigation</a>.</p><p>The Cloudflare Apps platform allows developers to ship their code to any of the 6 million websites on the Cloudflare network. When building on our apps platform, your code can be previewed and deployed on any Cloudflare site in seconds. Browse the apps documentation to learn more about <a href="https://www.cloudflare.com/apps/developers">building on Cloudflare Apps</a></p><p>We'd love for you to join us at our next meet-up. To stay up-to-date on local events, you can join our Meetup groups in <a href="%5Bhttps://www.meetup.com/Cloudflare-Meetups/%5D">San Francisco</a>, <a href="https://www.meetup.com/Cloudflare-Austin/">Austin</a> and, of course, <a href="https://www.meetup.com/Cloudflare-London/">London</a>. Want to request a Cloudflare meetup or workshop in your city? Please drop a line to <a>community@cloudflare.com</a>.</p> ]]></content:encoded>
            <category><![CDATA[MeetUp]]></category>
            <category><![CDATA[Cloudflare Meetups]]></category>
            <category><![CDATA[Events]]></category>
            <category><![CDATA[Developers]]></category>
            <category><![CDATA[Cloudflare Apps]]></category>
            <guid isPermaLink="false">1bW6wU132PcLXvT2H6kvhG</guid>
            <dc:creator>Junade Ali</dc:creator>
        </item>
        <item>
            <title><![CDATA[Cloudflare Apps Platform Update: September Edition]]></title>
            <link>https://blog.cloudflare.com/cloudflare-apps-platform-update-september-edition/</link>
            <pubDate>Thu, 28 Sep 2017 19:13:27 GMT</pubDate>
            <description><![CDATA[ Since launch, we’ve received hundreds of feature requests from developers and users alike. Feedback has been the source of some our most popular features.  ]]></description>
            <content:encoded><![CDATA[ <p><i>This is the September edition of our blog series showcasing the latest platform improvements in developer analytics, user feedback, release notes, and more!</i></p><p>Since launch, we’ve received hundreds of feature requests from developers and users alike. Feedback has been the source of some our most popular features. This month’s post is celebration of the innovation achieved when great ideas are shared.</p><p>Let’s dive in!</p>
    <div>
      <h3>? Developer Analytics</h3>
      <a href="#developer-analytics">
        
      </a>
    </div>
    <p>Continuing with the theme of feedback, App developers can now track their apps’ popularity and growth:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1EBEwxFnbdjq0OFmII1Bse/69e652a0e0ff65f230e43a4162fd5661/installs.png" />
            
            </figure><p>App usage by month.</p><p>The usage charts help identify which changes have a positive impact on your app.</p><p>If you’ve created a paid app you can also track its financial performance:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/NQJYkkkbjKc1zFhPTfLV3/881ff17a8d8b974804bae5392f63e439/revenue-2.png" />
            
            </figure><p>App revenue &amp; churn.</p>
    <div>
      <h2>? User feedback</h2>
      <a href="#user-feedback">
        
      </a>
    </div>
    <p>Charts and graphs are great for tracking trends, but what do your users actually think of your app? Wonder no longer; users can now leave comments when adding and removing apps from their site. Each comment includes sentiment tags and an optional message from the user.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/3gH8mWi14uosszB0TroFVY/9d865fbc357f50209e4ac390e6c925bf/comments-1.png" />
            
            </figure><p>Comments left by users before and after installing an app.</p>
    <div>
      <h3>? Page Selectors</h3>
      <a href="#page-selectors">
        
      </a>
    </div>
    <p>Cloudflare users have always been able to select which routes their apps are active, though this was too coarse for apps with arrays of options. We've introduced <a href="https://www.cloudflare.com/apps/developer/docs/install-json/options#page-selector">Page Selectors</a> to limit entries to specific pages:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/QcHi0LsN1aadDJpg8l4D8/f9d4ec268e06e4804e6594019db5d2a1/Screen-Shot-2017-09-13-at-11.27.09-PM.png" />
            
            </figure><p>Limiting YouTube videos to specific routes on a site.</p><p>Page selectors are great for apps that create multiple elements such as arrays in <a href="https://www.cloudflare.com/apps/youtube/install">YouTube’s</a> videos, or <a href="https://www.cloudflare.com/apps/cssgram/install">CSSGram’s</a> image filters. Developers can also use them to target existing elements on specific pages. Apps like <a href="https://www.cloudflare.com/apps/shepherd">Shepherd</a> can use Page Selectors to insert user guides on specific pages too!</p>
    <div>
      <h3>? Improved updates</h3>
      <a href="#improved-updates">
        
      </a>
    </div>
    <p>We've included some updates — on App updates! Developers can now add release notes in their submissions:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6P1Bl4zwudIign92RC4C0h/c728601d8644893ef951aaeed91e34cb/release-notes-1.png" />
            
            </figure><p>Communicating your recent changes to users.</p><p>Your release notes will appear alongside other pending updates in the user’s Cloudflare Dashboard:</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4BxDQpfFs44kzKb9uIoH1S/6ed3a948b3bbaa000741a7b62553f80b/Screen-Shot-2017-09-13-at-2.02.25-AM.png" />
            
            </figure><p>Users are notified of pending updates when visiting Cloudflare.</p>
    <div>
      <h4>?? Developers. Developers. Developers. Developers...</h4>
      <a href="#developers-developers-developers-developers">
        
      </a>
    </div>
    <p>I want to give a huge shout-out to the developers who have sent us their feedback and suggestions. Thank you again for joining us on this amazing adventure. Reach out at <a href="https://twitter.com/CloudflareApps">@CloudflareApps</a> and let us know what you’d like to see next!!!</p><p>Until next time! ?</p><p>— Teffen</p><p>Powerful tools built by world-class developers, delivered by Cloudflare, easily added to your website.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/4x098wOjfPxuM6qdbir23g/5e7da2529301aae597da9e6c93a882d7/playbook.png" />
            
            </figure><p>Just for you</p><p>The new App Developer Playbook features a step-by-step marketing guide showing you how to make money selling your Cloudflare Apps. It was written using all of the knowledge and experience we’ve gained releasing Apps to Cloudflare users.</p><p><a href="https://www.cloudflare.com/apps/assets/Cloudflare%20Apps%20Developer%20Playbook.pdf">Check it out ›</a></p><p>.content-box { margin: 1em auto; max-width: 100%; box-sizing: border-box; } .content-box img { padding: .5em; border: 1px solid #ddd; border-radius: 3px; max-height: 100%; box-sizing: border-box; } .content-box[data-image="1"] img { background-color: #fff; } .content-box[data-image="2"] img { background-color: #fff; } .content-box[data-image="3"] img { background-color: #eee; } .content-box[data-image="4"] img { background-color: #f3f3f3; } .content-box[data-image="5"] img { background-color: #f3f3f3; } .content-box[data-image="6"] img { background-color: #ebebeb; } @media (min-width: 768px) { .content-box[data-image="1"] img { height: 270px; } .content-box[data-image="2"] img { height: 270px; } .content-box[data-image="3"] img { height: 250px; } .content-box[data-image="4"] img { height: 460px; } .content-box[data-image="5"] img { height: 280px; } .content-box[data-image="6"] img { height: 250px; } } .content-footer { display: flex; align-items: center; justify-content: center; flex-flow: column; padding: 1em .5em; background: #272727; color: #f1f1f1; line-height: 1.533; position: absolute; left: 0; right: 0; } .content-footer .email-pitch { text-align: center; } .content-footer #mc-embedded-subscribe-form { display: flex; align-items: center; } .content-footer #mce-responses { margin-left: .5em; } .content-footer #mce-EMAIL { flex: 0 1 auto !important; width: 245px; margin: 0; } .content-footer #mce-EMAIL, .content-footer #mc-embedded-subscribe { height: 2.4em; font-size: 1.2em; line-height: 1; } .content-footer #mc-embedded-subscribe { padding: .55em 1em; font-weight: 500; } .content-footer #mc-embedded-subscribe-form, .content-footer #mc-embedded-subscribe-form &gt; * { flex: 0 0 auto; } .content-footer .email-container { display: flex; } .content-footer .playbook-container { display: flex; align-items: center; } .content-footer .content-accent { flex: 0 0 auto; } .content-footer .content-accent img { height: 260px; margin-right: 2em; } .content-footer .content-headline { font-size: 2.1em; font-weight: bold; } .content-footer .content-description { font-size: .9em; max-width: 600px; margin-bottom: 1em; } @media (max-width: 768px) { .content-footer .email-container { flex: 1 1 auto; width: 100%; } .content-footer .playbook-container { flex-flow: column; } } /* Floating Sidebar */ body.floating-sidebar .primary-content, body.floating-sidebar .post-content { width: 100% !important; } body.floating-sidebar aside.sidebar { float: right !important; margin-bottom: 0.5em; } .post-content, .post-header { max-width: 36em; } body.floating-sidebar .post-content, body.floating-sidebar .post-header { max-width: none; } body.floating-sidebar .footer-nav { width: 100% !important; } /* Social */ .social { display: flex; align-items: center; } /*.fb_iframe_widget { padding-top: 3px; padding-right: 1px; }*/ .social &gt; * + * { margin-right: 0 !important; margin-left: 7px !important; } .social &gt; .IN-widget { margin-bottom: -2px !important; margin-left: 9px !important; } /* Hide period after author */ .post-header .meta a { border-right: 5px solid white; margin-right: -5px; position: relative; } /* Post */ body { background-color: white; } .post-header, .post-content p, .post-content h1, .post-content h2, .post-content h3, .post-content h4, .post-content h5, .post-content figcaption { display: block; margin-left: auto; margin-right: auto; width: 75%; } .post-content figcaption { text-align: center; font-style: italic; opacity: .8; margin-top: 0.2em; margin-bottom: 1.9em; font-size: .9em; } pre, code { font-size: inherit; line-height: inherit; } section.primary-content { font-size: 16px; line-height: 1.6; color: black; } blockquote { padding-bottom: 1.5em; padding-top: 1em; font-style: italic; font-size: 1.2rem; } blockquote.pull-quote-centered { font-size: 1.2em; text-align: center; max-width: 100%; margin-left: auto; margin-right: auto; } blockquote blockquote { margin-left: 1em; padding-left: 1em; border-left: 5px solid rgba(0, 0, 0, 0.2); padding-bottom: 0.5em; padding-top: 0.5em; margin-bottom: 0.5em; margin-top: 0.5em; } p.attribution { color: #666; font-size: 0.8em; padding-bottom: 1em; } a code.year { text-decoration: underline; } .closing-cards #mc_embed_signup .mc-field-group { margin: 0.75em 0; } .closing-cards #mc_embed_signup input { font-size: 1.5em; height: auto; } .closing-cards #mc_embed_signup input[type="email"] { border: 1px solid #bcbcbc; border-radius: 2px; margin-bottom: 0; } .closing-cards #mc_embed_signup input[type="submit"] { background: #f38020; color: #fff; padding: .8em 1em .8em 1em; white-space: nowrap; line-height: 1.2; text-align: center; border-radius: 2px; border: 0; display: inline-block; text-rendering: optimizeLegibility; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: subpixel-antialiased; user-select: none; -webkit-appearance: none; appearance: none; letter-spacing: .04em; text-indent: .04em; cursor: pointer; } .closing-cards #mc_embed_signup div.mce_inline_error { background-color: transparent; color: #C33; padding: 0; display: inline-block; font-size: 0.9em; } .closing-cards #mc_embed_signup p:not(:empty) { line-height: 1.5; margin-bottom: 2em; } .closing-cards #mc_embed_signup input[type="email"] { font-size: 20px !important; width: 100% !important; padding: .6em 1em !important; } .closing-cards #mc_embed_signup .mc-field-group { margin: 0 !important; } .closing-cards #mc_embed_signup input[type="submit"] { font-size: 20px !important; margin-top: .5em !important; padding: .6em 1em !important; } .closing-cards #mc_embed_signup div.mce_inline_error { padding: 0; margin: 0; color: #F38020 !important; } aside.section.learn-more { display: none; } .closing-cards { background: #eee; width: 100%; list-style-type: none; margin-left: 0; } .closing-card { width: calc(50% - 10px) !important; font-size: 20px; padding: 1.5em; display: inline-block; box-sizing: border-box; vertical-align: top; } #mc_embed_signup { max-width: 400px; margin: 1em auto; } @media (min-width: 768px) { #mc_embed_signup { margin-left: 1em; } } @media (max-width: 788px){ .closing-card { width: 100% !important; } .closing-card + .closing-card { border-top: 10px solid white; } }</p><p>(function () {
'use strict'</p><p>document.body.style.visibility = 'hidden'</p><p>function fakeReady (fn) {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', fn)
} else {
fn()
}
}</p><p>window.$ = window.jQuery = function fakejQuery () {
return {
ready: fakeReady,
fitVids: function () {
// if (window.$.fn.fitVids) {
//   window.$.fn.fitVids.apply(window.$.fn, arguments)
// }
}
}
}</p><p>window.$.fn = window.$.fn || {}</p><p>function restyleBlog () {
'use strict'</p>
            <pre><code>if (window.innerWidth &gt;= 800) {
  var sidebar = document.querySelector('aside.sidebar')
  var header = document.querySelector('header.post-header')
  var post = document.querySelector('article.post')

  try {
    post.insertBefore(sidebar, header)
    document.body.className += ' floating-sidebar'
  } catch (e) { console.log('Style Error', e)}
}

try {
  document.querySelector('body &gt; .wrapper .sidebar').style.display = 'none'
} catch (e) { console.log('Style Error', e)}

try {
  var tagFooter = document.querySelector('.post-content + footer')
  tagFooter.appendChild(document.querySelector('.post-header .social'))
} catch (e) { console.log('Style Error', e)}

function resizeFooter () {
  post.style.paddingBottom = footer.clientHeight + 'px'
}

try {
  var signup = document.querySelector('#mc\_embed\_signup')
  signup.querySelector('#mce-EMAIL').placeholder = 'email@example.com'
  signup.querySelector('#mc-embedded-subscribe').textContent = 'Get Updates'
  signup.querySelector('#mc-embedded-subscribe').className += ' btn-warning'

  var post = document.querySelector('.post-content')
  var footer = post.querySelector('.content-footer')
  footer.querySelector('.email-container').appendChild(signup)

  window.addEventListener('resize', resizeFooter)
  resizeFooter()
} catch (e) { console.log('Style Error', e)}

document.body.style.visibility = ''</code></pre>
            <p>}</p><p>fakeReady(restyleBlog)
})()</p> ]]></content:encoded>
            <category><![CDATA[Cloudflare Apps]]></category>
            <category><![CDATA[Analytics]]></category>
            <category><![CDATA[Developers]]></category>
            <guid isPermaLink="false">7sJsTUPDnftbVIikXTiMSA</guid>
            <dc:creator>Teffen Ellis</dc:creator>
        </item>
        <item>
            <title><![CDATA[The History of Email]]></title>
            <link>https://blog.cloudflare.com/the-history-of-email/</link>
            <pubDate>Sat, 23 Sep 2017 16:00:00 GMT</pubDate>
            <description><![CDATA[ This was adapted from a post which originally appeared on the Eager blog. Eager has now become the new Cloudflare Apps. ]]></description>
            <content:encoded><![CDATA[ <p>This was adapted from a post which originally appeared on the Eager blog. Eager has now become the new <a href="https://www.cloudflare.com/apps">Cloudflare Apps</a>.</p><blockquote><p>QWERTYUIOP</p><p>— Text of the first email ever sent, 1971</p></blockquote><p>The ARPANET (a precursor to the Internet) was created “to help maintain U.S. technological superiority and guard against unforeseen technological advances by potential adversaries,” in other words, to avert the next Sputnik. Its purpose was to allow scientists to share the products of their work and to make it more likely that the work of any one team could potentially be somewhat usable by others. One thing which was not considered particularly valuable was allowing these scientists to communicate using this network. People were already perfectly capable of communicating by phone, letter, and in-person meeting. The purpose of a computer was to do <a href="http://www.kurzweilai.net/memorandum-for-members-and-affiliates-of-the-intergalactic-computer-network">massive computation</a>, to <a href="http://groups.csail.mit.edu/medg/people/psz/Licklider.html">augment our memories</a> and <a href="http://www.theatlantic.com/magazine/archive/1945/07/as-we-may-think/303881/">empower our minds</a>.</p><p>Surely we didn’t need a computer, this behemoth of technology and innovation, just to talk to each other.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1RJOCLGtgVm3eGa2QACMXd/b35b27f9fe2850bb744f2d5736bb4c10/posts-history-of-email-images-first-email-computers.jpg" />
            
            </figure><p>The computers which sent (and received) the first email.</p><p></p><p>The history of computing moves from massive data processing mainframes, to time sharing where many people share one computer, to the diverse collection of personal computing devices we have today. Messaging was first born in the time sharing era, when users wanted the ability to message other users of the same time shared computer.</p><p>Unix machines have a command called <code>write</code> which can be used to send messages to other currently logged-in users. For example, if I want to ask Mark out to lunch:</p>
            <pre><code>$ write mark
write: mark is logged in more than once; writing to ttys002

Hi, wanna grab lunch?</code></pre>
            <p>He will see:</p>
            <pre><code>Message from zack@Awesome-Mainframe.local on ttys003 at 10:36 ...
Hi, wanna grab lunch?</code></pre>
            <p>This is absolutely hilarious if your coworker happens to be using a graphical tool like vim which will not take kindly to random output on the screen.</p>
    <div>
      <h3>Persistant Messages</h3>
      <a href="#persistant-messages">
        
      </a>
    </div>
    <blockquote><p>When the mail was being developed, nobody thought at the beginning it was going to be the smash hit that it was. People liked it, they thought it was nice, but nobody imagined it was going to be the explosion of excitement and interest that it became. So it was a surprise to everybody, that it was a big hit.</p><p>— Frank Heart, director of the ARPANET infrastructure team</p></blockquote><p>An early alternative to Unix called <a href="https://en.wikipedia.org/wiki/TOPS-20">Tenex</a> took this capability one step further. Tenex included the ability to send a message to another user by writing onto the end of a file which only they could read. This is conceptually very simple, you could implement it yourself by creating a file in everyones home directory which only they can read:</p>
            <pre><code>mkdir ~/messages
chmod 0442 ~/messages</code></pre>
            <p>Anyone who wants to send a message just has to append to the file:</p>
            <pre><code>echo "??\n" &gt;&gt; /Users/zack/messages</code></pre>
            <p>This is, of course, not a great system because anyone could delete your messages! I trust the Tenex implementation (called <code>SNDMSG</code>) was a bit more secure.</p>
    <div>
      <h3>ARPANET</h3>
      <a href="#arpanet">
        
      </a>
    </div>
    <p>In 1971, the Tenex team had just gotten access to the ARPANET, the network of computers which was a main precursor to the Internet. The team quickly created a program called CPYNET which could be used to send files to remote computers, similar to FTP today.</p><p>One of these engineers, Ray Tomlinson, had the idea to combine the message files with <a href="https://tools.ietf.org/html/rfc310">CPYNET</a>. He added a command which allowed you to append to a file. He also wired things up such that you could add an <code>@</code> symbol and a remote machine name to your messages and the machine would automatically connect to that host and append to the right file. In other words, running:</p>
            <pre><code>SNDMSG zack@cloudflare</code></pre>
            <p>Would append to the <code>/Users/zack/messages</code> file on the host <code>cloudflare</code>. And email was born!</p>
    <div>
      <h3>FTP</h3>
      <a href="#ftp">
        
      </a>
    </div>
    <p>The CPYNET format did not have much of a life outside of Tenex unfortunately. It was necessary to create a standard method of communication which every system could understand. Fortunately, this was also the goal of another similar protocol, FTP. FTP (the File Transfer Protocol) sought to create a single way by which different machines could transfer files over the ARPANET.</p><p>FTP <a href="https://tools.ietf.org/html/rfc114">originally</a> didn’t include support for email. Around the time it was <a href="http://www.rfc-editor.org/rfc/rfc385.txt">updated</a> to use TCP (rather than the NCP protocol which ARPANET historically used) the <code>MAIL</code> command was added.</p>
            <pre><code>$ ftp
&lt; open bbn

&gt; 220 HELLO, this is the BBN mail service

&lt; MAIL zack

&gt; 354 Type mail, ended by &lt;CRLF&gt;.&lt;CRLF&gt;

&lt; Sup?
&lt; .

&gt; 250 Mail stored</code></pre>
            <p>These commands were ultimately <a href="https://tools.ietf.org/html/rfc772">borrowed from</a> FTP and formed the basis for the SMTP (Simple Mail Transfer Protocol) protocol in <a href="https://tools.ietf.org/html/rfc821">1982</a>.</p>
    <div>
      <h3>Mailboxes</h3>
      <a href="#mailboxes">
        
      </a>
    </div>
    <p>The format for defining how a message should be transmitted (and often how it would be stored on disk) was first <a href="https://tools.ietf.org/html/rfc733">standardized</a> in 1977:</p>
            <pre><code>Date     :  27 Aug 1976 0932-PDT
From     :  Ken Davis &lt;KDavis at Other-Host&gt;
Subject  :  Re: The Syntax in the RFC
To       :  George Jones &lt;Group at Host&gt;,
              Al Neuman at Mad-Host

There’s no way this is ever going anywhere...</code></pre>
            <p>Note that at this time the ‘at’ word could be used rather than the ‘@’ symbol. Also note that this use of headers before the message predates HTTP by almost fifteen years. This format remains nearly identical today.</p><p>The Fifth Edition of Unix used a very similar <a href="https://en.wikipedia.org/wiki/Mbox">format</a> for storing a users email messages on disk. Each user would have a file which contained their messages:</p>
            <pre><code>From MAILER-DAEMON Fri Jul  8 12:08:34 1974
From: Author &lt;author@example.com&gt;
To: Recipient &lt;recipient@example.com&gt;
Subject: Save $100 on floppy disks

They’re never gonna go out of style!

From MAILER-DAEMON Fri Jul  8 12:08:34 1974
From: Author &lt;author@example.com&gt;
To: Recipient &lt;recipient@example.com&gt;
Subject: Seriously, buy AAPL

You’ve never heard of it, you’ve never heard of me, but when you see
that stock symbol appear.  Buy it.

- The Future</code></pre>
            <p>Each message began with the word ‘From’, meaning if a message happened to contain From at the beginning of a line it needed to be escaped lest the system think that’s the start of a new message:</p>
            <pre><code>From MAILER-DAEMON Fri Jul  8 12:08:34 2011
From: Author &lt;author@example.com&gt;
To: Recipient &lt;recipient@example.com&gt;
Subject: Sample message 1

This is the body.
&gt;From (should be escaped).
There are 3 lines.</code></pre>
            <p>It was technically possible to interact with your email by simply editing your mailbox file, but it was much more common to use an email client. As you might expect there was a <a href="http://www.rfc-editor.org/rfc/rfc808.txt">diversity</a> of clients available, but a few are of historical note.</p><p>RD was an editor which was created by <a href="http://www.livinginternet.com/i/ii_roberts.htm">Lawrence Roberts</a> who was actually the program manager for the ARPANET itself at the time. It was a set of macros on top of the Tenex text editor (TECO), which itself would later become Emacs.</p><p>RD was the first client to give us the ability to sort messages, save messages, and delete them. There was one key thing missing though: any integration between receiving a message and sending one. RD was strictly for consuming emails you had received, to reply to a message it was necessary to compose an entirely new message in SNDMSG or another tool.</p><p>That innovation came from MSG, which itself was an improvement on a client with the hilarious name BANANARD. MSG added the ability to reply to a message, in the words of Dave Crocker:</p><blockquote><p>My subjective sense was that propagation of MSG resulted in an exponential explosion of email use, over roughly a 6-month period. The simplistic explanation is that people could now close the Shannon-Weaver communication loop with a single, simple command, rather than having to formulate each new message. In other words, email moved from the sending of independent messages into having a conversation.</p></blockquote><p>Email wasn’t just allowing people to talk more easily, it was changing how they talk. In <a href="http://www.livinginternet.com/References/Ian%20Hardy%20Email%20Thesis.txt">the words</a> of C. R. Linklider and Albert Vezza in 1978:</p><blockquote><p>One of the advantages of the message systems over letter mail was that, in an ARPANET message, one could write tersely and type imperfectly, even to an older person in a superior position and even to a person one did not know very well, and the recipient took no offense... Among the advantages of the network message services over the telephone were the fact that one could proceed immediately to the point without having to engage in small talk first, that the message services produced a preservable record, and that the sender and receiver did not have to be available at the same time.</p></blockquote><p>The most popular client from this era was called <a href="https://en.wikipedia.org/wiki/MH_Message_Handling_System">MH</a> and was composed of several command line utilities for doing various actions with and to your email.</p>
            <pre><code>$ mh

% show

(Message inbox:1)
Return-Path: joed
Received: by mysun.xyz.edu (5.54/ACS)
        id AA08581; Mon, 09 Jan 1995 16:56:39 EST
Message-Id: &lt;9501092156.AA08581@mysun.xyz.edu&gt;
To: angelac
Subject: Here’s the first message you asked for
Date: Mon, 09 Jan 1995 16:56:37 -0600
From: "Joe Doe" &lt;joed&gt;

Hi, Angela!  You asked me to send you a message.  Here it is.
I hope this is okay and that you can figure out how to use
that mail system.

Joe</code></pre>
            <p>You could reply to the message easily:</p>
            <pre><code>% repl

To: "Joe Doe" &lt;joed&gt;
cc: angelac
Subject: Re: Here’s the first message you asked for
In-reply-to: Your message of "Mon, 09 Jan 1995 16:56:37 -0600."
        &lt;9501092156.AA08581@mysun.xyz.edu&gt;
-------

% edit vi</code></pre>
            <p>You could then edit your reply in vim which is actually pretty cool.</p><p>Interestingly enough, in June of 1996 the guide “<a href="http://rand-mh.sourceforge.net/book/">MH &amp; xmh: Email for Users &amp; Programmers</a>” was actually the first book in history to be published on the Internet.</p>
    <div>
      <h3>Pine, Elm &amp; Mutt</h3>
      <a href="#pine-elm-mutt">
        
      </a>
    </div>
    <blockquote><p>All mail clients suck. This one just sucks less.</p><p>— Mutt Slogan</p></blockquote><p>It took several years until terminals became powerful enough, and perhaps email pervasive enough, that a more graphical program was required. In 1986 Elm was introduced, which allowed you to interact with your email more interactively.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/1TC1QcSpjdKD1OkLtaAPId/f0faa8605a8a6528ff4487fff3097fde/posts-history-of-email-images-elm.png" />
            
            </figure><p>Elm Mail Client</p><p>This was followed by more graphical <a href="https://en.wikipedia.org/wiki/Text-based_user_interface">TUI</a> clients like <a href="https://web.archive.org/web/19970126101209/http://www.cs.hmc.edu/~me/mutt/index.html">Mutt</a> and <a href="https://groups.google.com/forum/#!msg/comp.mail.misc/kqKQojTDVBM/kvYgyYbwfKoJ">Pine</a>.</p><p>In the words of the University of Washington’s <a href="http://www.washington.edu/pine/overview/project-history.html">Pine team</a>:</p><blockquote><p>Our goal was to provide a mailer that naive users could use without fear of making mistakes. We wanted to cater to users who were less interested in learning the mechanics of using electronic mail than in doing their jobs; users who perhaps had some computer anxiety. We felt the way to do this was to have a system that didn’t do surprising things and provided immediate feedback on each operation; a mailer that had a limited set of carefully-selected functions.</p></blockquote><p>These clients were becoming gradually easier and easier to use by non-technical people, and it was becoming clear how big of a deal this really was:</p><blockquote><p>We in the ARPA community (and no doubt many others outside it) have come to realize that we have in our hands something very big, and possibly very important. It is now plain to all of us that message service over computer networks has enormous potential for changing the way communication is done in all sectors of our society: military, civilian government, and private.</p></blockquote>
    <div>
      <h3>Webmail</h3>
      <a href="#webmail">
        
      </a>
    </div>
    <blockquote><p>Its like when I did the referer field. I got nothing but grief for my choice of spelling. I am now attempting to get the spelling corrected in the OED since my spelling is used several billion times a minute more than theirs.</p><p>— Phillip Hallam-Baker on his spelling of ’Referer’ <a href="https://groups.google.com/forum/#!original/alt.folklore.computers/7X75In21_54/JgV9Rw04f-EJ"><code>2000</code></a></p></blockquote><p>The first webmail client was created by Phillip Hallam-Baker at CERN in <a href="https://groups.google.com/forum/#!topic/comp.archives/vpWqUAmg8xU">1994</a>. Its creation was early enough in the history of the web that it led to the identification of the need for the <code>Content-Length</code> header in POST requests.</p><p>Hotmail was released in 1996. The name was chosen because it included the letters HTML to emphasize it being ‘on the web’ (it was original stylized as ‘HoTMaiL’). When it was launched users were limited to 2MB of storage (at the time a 1.6GB hard drive was $399).</p><p>Hotmail was originally implemented using FreeBSD, but in a decision I’m sure every engineer regretted, it was moved to Windows 2000 after the service was bought by Microsoft. In 1999, hackers revealed a security flaw in Hotmail that permitted anybody to log in to any Hotmail account using the password ‘<a href="http://archive.wired.com/science/discoveries/news/1999/08/21503">eh</a>’. It took until 2001 for ‘hackers’ to realize you could access other people’s messages by swap usernames in the URL and guessing at a valid message number.</p>
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/6LQJvosil4wqu6Ku3J6kqf/15c82c1105b2576396d88815402c86ce/posts-history-of-email-images-gmail.jpg" />
            
            </figure><p>Gmail was famously created in 2004 as a ‘20% project’ of Paul Buchheit. Originally it wasn’t particularly believed in as a product within Google. They had to launch using a few hundred Pentium III computers no one else wanted, and it took three years before they had the resources to accept users without an invitation. It was notable both for being much closer to a desktop application (using AJAX) and for the unprecedented offer of 1GB of mail storage.</p>
    <div>
      <h3>The Future</h3>
      <a href="#the-future">
        
      </a>
    </div>
    
            <figure>
            
            <img src="https://cf-assets.www.cloudflare.com/zkvhlag99gkb/7vOMbpChEaJ0JNHRgRr7hn/474dc2b8b40a5b77989c1ab30a7b7e70/posts-history-of-email-images-mail.gif" />
            
            </figure><p>US Postal Mail Volume, <a href="http://www.slideshare.net/jesserobbins/devops-change/14-US_Postal_Service_Mail_Volume">KPCB</a></p><p>At this point email is a ubiquitous enough communication standard that it’s very possible postal mail as an everyday idea will die before I do. One thing which has not survived well is any attempt to replace email with a more complex messaging tool like <a href="https://en.wikipedia.org/wiki/Apache_Wave">Google Wave</a>. With the rise of more targeted communication tools like Slack, Facebook, and Snapchat though, you never know.</p><p>There is, of course, a cost to that. The ancestors of the Internet were kind enough to give us a communication standard which is free, transparent, and standardized. It would be a shame to see the tech communication landscape move further and further into the world of locked gardens and proprietary schemas.</p><p>We’ll leave you with two quotes:</p><blockquote><p>Mostly because it seemed like a neat idea. There was no directive to ‘go forth and invent e-mail’.</p><p>— Ray Tomlinson, answering a question about why he invented e-mail</p></blockquote><hr /><blockquote><p>Permit me to carry the doom-crying one step further. I am curious whether the increasingly easy access to computers by adolescents will have any effect, however small, on their social development. Keep in mind that the social skills necessary for interpersonal relationships are not taught; they are learned by experience. Adolescence is probably the most important time period for learning these skills. There are two directions for a cause-effect relationship. Either people lacking social skills (shy people, etc.) turn to other pasttimes, or people who do not devote enough time to human interactions have difficulty learning social skills. I do not [consider] whether either or both of these alternatives actually occur. I believe I am justified in asking whether computers will compete with human interactions as a way of spending time? Will they compete more effectively than other pasttimes? If so, and if we permit computers to become as ubiquitous as televisions, will computers have some effect (either positive or negative) on personal development of future generations?</p><p>— Gary Feldman, <a href="http://www.livinginternet.com/References/Ian%20Hardy%20Email%20Thesis.txt"><code>1981</code></a></p></blockquote><ul><li><p>Use Cloudflare Apps to build tools which can be installed by millions of sites.</p><p><a href="https://www.cloudflare.com/apps/developer/docs/getting-started">Build an app →</a></p><p>If you're in San Francisco, London or Austin: <a href="https://boards.greenhouse.io/cloudflare/jobs/850951">work with us</a>.</p></li><li><p>Our next post is on the history of the URL!<b>Get notified when new apps and apps-related posts are released:</b></p><p>Email Address</p></li></ul><p>(function($) {window.fnames = new Array(); window.ftypes = new Array();fnames[0]='EMAIL';ftypes[0]='email';fnames[1]='FNAME';ftypes[1]='text';fnames[2]='LNAME';ftypes[2]='text';}(jQuery));var $mcj = jQuery.noConflict(true);  /* Social */ .social { margin-top: 1.3em; } .fb_iframe_widget { padding-right: 1px; } .IN-widget { padding-left: 11px; } /* Hide period after author */ .post-header .meta a { border-right: 5px solid white; margin-right: -5px; position: relative; } /* Post */ body { background-color: white; } pre, code { font-size: inherit; line-height: inherit; } section.primary-content { font-size: 16px; line-height: 1.6; color: black; } blockquote { padding-bottom: 1.5em; padding-top: 1em; font-style: italic; font-size: 1.25rem; } blockquote.pull-quote-centered { font-size: 1.2em; text-align: center; max-width: 100%; margin-left: auto; margin-right: auto; } blockquote blockquote { margin-left: 1em; padding-left: 1em; border-left: 5px solid rgba(0, 0, 0, 0.2); padding-bottom: 0.5em; padding-top: 0.5em; margin-bottom: 0.5em; margin-top: 0.5em; } figure.standard { position: relative; max-width: 100%; margin: 1em auto; text-align: center; z-index: -1; } .figcaption { padding-top: .5em; font-size: .8em; color: #888; font-weight: 300; letter-spacing: .03em; line-height: 1.35; } .figcontent { display: inline-block; } p.attribution { color: #666; font-size: 0.9em; padding-bottom: 1em; } a code.year { text-decoration: underline; } .closing-cards #mc_embed_signup .mc-field-group { margin: 0.75em 0; } .closing-cards #mc_embed_signup input { font-size: 1.5em; height: auto; } .closing-cards #mc_embed_signup input[type="email"] { border: 1px solid #bcbcbc; border-radius: 2px; margin-bottom: 0; } .closing-cards #mc_embed_signup input[type="submit"] { background: #f38020; color: #fff; padding: .8em 1em .8em 1em; white-space: nowrap; line-height: 1.2; text-align: center; border-radius: 2px; border: 0; display: inline-block; text-rendering: optimizeLegibility; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: subpixel-antialiased; user-select: none; -webkit-appearance: none; appearance: none; letter-spacing: .04em; text-indent: .04em; cursor: pointer; } .closing-cards #mc_embed_signup div.mce_inline_error { background-color: transparent; color: #C33; padding: 0; display: inline-block; font-size: 0.9em; } .closing-cards #mc_embed_signup p:not(:empty) { line-height: 1.5; margin-bottom: 2em; } .closing-cards #mc_embed_signup input[type="email"] { font-size: 20px !important; width: 100% !important; padding: .6em 1em !important; } .closing-cards #mc_embed_signup .mc-field-group { margin: 0 !important; } .closing-cards #mc_embed_signup input[type="submit"] { font-size: 20px !important; margin-top: .5em !important; padding: .6em 1em !important; } .closing-cards #mc_embed_signup div.mce_inline_error { padding: 0; margin: 0; color: #F38020 !important; } aside.section.learn-more { display: none; } .closing-cards { background: #eee; width: 100%; list-style-type: none; margin-left: 0; } .closing-card { width: calc(50% - 10px) !important; font-size: 20px; padding: 1.5em; display: inline-block; box-sizing: border-box; vertical-align: top; } @media (max-width: 788px){ .closing-card { width: 100% !important; } .closing-card + .closing-card { border-top: 10px solid white; } }</p> ]]></content:encoded>
            <category><![CDATA[History]]></category>
            <category><![CDATA[Cloudflare Apps]]></category>
            <guid isPermaLink="false">6sYYukjP53HPjvEZS6EiH7</guid>
            <dc:creator>Zack Bloom</dc:creator>
        </item>
    </channel>
</rss>