<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: bg</title>
    <description>The latest articles on DEV Community by bg (@benzguo).</description>
    <link>https://dev.to/benzguo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F332161%2F619573ec-7009-4b16-9b08-bcb1908d09ca.jpg</url>
      <title>DEV Community: bg</title>
      <link>https://dev.to/benzguo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/benzguo"/>
    <language>en</language>
    <item>
      <title>🔥 Firebase: Onboarding 📸</title>
      <dc:creator>bg</dc:creator>
      <pubDate>Sun, 09 Feb 2020 20:25:22 +0000</pubDate>
      <link>https://dev.to/benzguo/firebase-onboarding-381e</link>
      <guid>https://dev.to/benzguo/firebase-onboarding-381e</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/benzguo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqs4rpvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--CXW6N1Uz--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/332161/619573ec-7009-4b16-9b08-bcb1908d09ca.jpg" alt="benzguo image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/benzguo/getting-started-with-next-js-now-firebase-4ejg" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt; ▲🔥 Getting started with Next.js, ZEIT Now, and Firebase&lt;/h2&gt;
      &lt;h3&gt;bg ・ Feb  9 ・ 7 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#zeit&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#firebase&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;blockquote&gt;
&lt;p&gt;In this sub-post, I'll share some screenshots from Firebase's docs 📸&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--38c71uRO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r3b2tud0uw3flqn71bbi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--38c71uRO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r3b2tud0uw3flqn71bbi.png" alt="Firebase – docs"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fF_U-ny1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/524if1nd24cz9w4hocl6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fF_U-ny1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/524if1nd24cz9w4hocl6.png" alt="Firebase - web quickstart"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;To get a feel for what it's like to set up a new Firebase project, check out this post:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/benzguo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqs4rpvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--CXW6N1Uz--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/332161/619573ec-7009-4b16-9b08-bcb1908d09ca.jpg" alt="benzguo image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/benzguo/firebase-setup-3320" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;🔥 Firebase: Staging &amp;amp; Production Projects&lt;/h2&gt;
      &lt;h3&gt;bg ・ Feb  9 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#firebase&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/benzguo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqs4rpvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--CXW6N1Uz--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/332161/619573ec-7009-4b16-9b08-bcb1908d09ca.jpg" alt="benzguo image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/benzguo/zeit-now-signup-flow-49le" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;▲ ZEIT Now: Onboarding 📸&lt;/h2&gt;
      &lt;h3&gt;bg ・ Feb  9 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#zeit&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#design&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#documentation&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>firebase</category>
      <category>design</category>
      <category>documentation</category>
    </item>
    <item>
      <title>🔥 Firebase: Staging &amp; Production Projects</title>
      <dc:creator>bg</dc:creator>
      <pubDate>Sun, 09 Feb 2020 02:31:34 +0000</pubDate>
      <link>https://dev.to/benzguo/firebase-setup-3320</link>
      <guid>https://dev.to/benzguo/firebase-setup-3320</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/benzguo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqs4rpvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--CXW6N1Uz--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/332161/619573ec-7009-4b16-9b08-bcb1908d09ca.jpg" alt="benzguo image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/benzguo/getting-started-with-next-js-now-firebase-4ejg" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt; ▲🔥 Getting started with Next.js, ZEIT Now, and Firebase&lt;/h2&gt;
      &lt;h3&gt;bg ・ Feb  9 ・ 7 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#zeit&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#firebase&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;blockquote&gt;
&lt;p&gt;In this sub-post, I'll walk through setting up a project in Firebase. The best way to create a production &amp;amp; staging environment for a new project in Firebase is to simply create two projects:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;your-project-staging&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;your-project-production&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  1. Create a project
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l2YTe-Is--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6aq91hlsn5yip0lroimc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l2YTe-Is--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6aq91hlsn5yip0lroimc.png" alt="Firebase – empty dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pwPpVVK---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g1ro5xbvyuak7d25sjdu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pwPpVVK---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g1ro5xbvyuak7d25sjdu.png" alt="Firebase – new project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Eavz58T_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zv5y9joqj5m17uun8duj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Eavz58T_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zv5y9joqj5m17uun8duj.png" alt="Firebase – project dashboard"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Add a web app
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4dd7IpJX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i92hos7q0inz9ou3rw8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4dd7IpJX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i92hos7q0inz9ou3rw8r.png" alt="Firebase – new web app"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Enable email/password authentication
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y1msT0Zh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/031xzw8q3797moac8g3u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y1msT0Zh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/031xzw8q3797moac8g3u.png" alt="Firebase – auth empty"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zkyv9Bd7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tpr3tp8i8yyrtjtyve6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zkyv9Bd7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tpr3tp8i8yyrtjtyve6l.png" alt="Firebase – auth enable"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Set up Firestore
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--al3r3gKP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mclyj4477ctceh7nggfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--al3r3gKP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mclyj4477ctceh7nggfa.png" alt="Firebase – Firestore empty"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jYfhteot--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wr0j8uqny13c3b61ctay.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jYfhteot--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wr0j8uqny13c3b61ctay.png" alt="Firebase – Firestore init"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0eZDEXp0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wsupdqu1glt5r4wq5q8x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0eZDEXp0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wsupdqu1glt5r4wq5q8x.png" alt="Firebase – Firestore region"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Run steps 1-4 twice, so that you end up with 2 projects:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kWTOnaqL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3fb0iadewxeiz6qe0qxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kWTOnaqL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3fb0iadewxeiz6qe0qxy.png" alt="Firebase – 2 projects"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="ltag__link"&gt;
  &lt;a href="/benzguo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqs4rpvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--CXW6N1Uz--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/332161/619573ec-7009-4b16-9b08-bcb1908d09ca.jpg" alt="benzguo image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/benzguo/getting-started-with-next-js-now-firebase-4ejg" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt; ▲🔥 Getting started with Next.js, ZEIT Now, and Firebase&lt;/h2&gt;
      &lt;h3&gt;bg ・ Feb  9 ・ 7 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#zeit&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#firebase&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/benzguo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqs4rpvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--CXW6N1Uz--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/332161/619573ec-7009-4b16-9b08-bcb1908d09ca.jpg" alt="benzguo image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/benzguo/firebase-onboarding-381e" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;🔥 Firebase: Onboarding 📸&lt;/h2&gt;
      &lt;h3&gt;bg ・ Feb  9 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#firebase&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#design&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#documentation&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>tutorial</category>
      <category>firebase</category>
      <category>beginners</category>
    </item>
    <item>
      <title> ▲🔥 Getting started with Next.js, ZEIT Now, and Firebase</title>
      <dc:creator>bg</dc:creator>
      <pubDate>Sun, 09 Feb 2020 02:24:52 +0000</pubDate>
      <link>https://dev.to/benzguo/getting-started-with-next-js-now-firebase-4ejg</link>
      <guid>https://dev.to/benzguo/getting-started-with-next-js-now-firebase-4ejg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This tutorial walks through setting up a minimal template project for Next.js, ZEIT Now, and Firebase. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I've included lots of screenshots, so even if you aren't interested in creating a project right now, you can get a feel for what working with these tools is like. I think this is a pretty good snapshot of &lt;strong&gt;the state of the art in 2020&lt;/strong&gt; for quick-start developer products.&lt;/li&gt;
&lt;li&gt;The template project is an extension of the official Next.js &lt;a href="https://github.com/zeit/next.js/tree/canary/examples/with-firebase-authentication-serverless"&gt;with-firebase-authentication-serverless&lt;/a&gt; example, with a bit more functionality.&lt;/li&gt;
&lt;li&gt;This tutorial provides some extra guidance on setting up staging &amp;amp; production environments in Firebase, and configuring ZEIT Now with your Firebase keys. &lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;p&gt;Recently, I started a new side project using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nextjs.org/"&gt;Next.js&lt;/a&gt;&lt;/strong&gt; (React framework for server-rendered applications) &lt;/li&gt;
&lt;li&gt;▲ &lt;strong&gt;&lt;a href="https://zeit.co/docs"&gt;ZEIT Now&lt;/a&gt;&lt;/strong&gt; (Hosting)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔥 Firebase&lt;/strong&gt; (&lt;a href="https://firebase.google.com/docs/auth/"&gt;Authentication&lt;/a&gt;, &lt;a href="https://firebase.google.com/docs/firestore/"&gt;Storage&lt;/a&gt;, &lt;a href="https://firebase.google.com/docs/functions/"&gt;Functions&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I like this combination of tools ✨ so I decided to put together this detailed tutorial.&lt;/p&gt;

&lt;p&gt;You can follow along using this template project:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/benzguo"&gt;
        benzguo
      &lt;/a&gt; / &lt;a href="https://github.com/benzguo/nextjs-now-firebase"&gt;
        nextjs-now-firebase
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Next.js + ZEIT Now + Firebase [template]
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The template also includes &lt;a href="https://tailwindcss.com/"&gt;Tailwind CSS&lt;/a&gt; (with ~zero styling). Here's what the sign up page looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GNzq-1UA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6rtjok6xjab61vlzz8or.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GNzq-1UA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6rtjok6xjab61vlzz8or.png" width="400px"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign up, log in, log out&lt;/li&gt;
&lt;li&gt;Update display name&lt;/li&gt;
&lt;li&gt;Add object to a Firestore collection&lt;/li&gt;
&lt;li&gt;List objects in a Firestore collection (using &lt;a href="https://github.com/bmcmahen/firestore-pagination-hook"&gt;firestore-pagination-hook&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Fetch data with a simple Firebase function (server-side rendering using &lt;a href="https://nextjs.org/docs/api-reference/data-fetching/getInitialProps"&gt;getInitialProps&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ▲ Sign up for ZEIT
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://zeit.co/signup?with-email=1"&gt;[ &amp;gt; Sign up for ZEIT ]&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I used the email signup flow, and thought it was pretty nice ✨ You can check out screenshots of the ZEIT onboarding flow &lt;a href="https://dev.to/benzguo/zeit-now-signup-flow-49le"&gt;[ ⤵️ here ]&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We'll set up a ZEIT Now project at the end of the tutorial – all you have to do for now is sign up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vBV8PbvG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/55wy84o7oy0vzmajs1cl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vBV8PbvG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/55wy84o7oy0vzmajs1cl.png" alt="ZEIT – empty dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🔥 Set up Firebase projects
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://console.firebase.google.com/"&gt;[ &amp;gt; Sign up for Firebase ]&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Sign into your Firebase account, and create &lt;strong&gt;two&lt;/strong&gt; projects (one for your &lt;strong&gt;staging&lt;/strong&gt; environment, and another for your &lt;strong&gt;production&lt;/strong&gt; environment).&lt;/p&gt;

&lt;p&gt;You'll have to do a bit of clicking around to fully configure a new Firebase project. Check out the full walkthrough here:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/benzguo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqs4rpvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--CXW6N1Uz--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/332161/619573ec-7009-4b16-9b08-bcb1908d09ca.jpg" alt="benzguo image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/benzguo/firebase-setup-3320" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;🔥 Firebase: Staging &amp;amp; Production Projects&lt;/h2&gt;
      &lt;h3&gt;bg ・ Feb  9 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#firebase&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kWTOnaqL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3fb0iadewxeiz6qe0qxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kWTOnaqL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3fb0iadewxeiz6qe0qxy.png" alt="Firebase – 2 projects"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ▲ Set up ZEIT Now CLI
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://zeit.co/download"&gt;Install the Now CLI&lt;/a&gt; and run &lt;code&gt;now login&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fV2OjrLq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pex7mfz3d29xsy5hdqw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fV2OjrLq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pex7mfz3d29xsy5hdqw1.png" alt="now login"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🔥 Set up Firebase CLI
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com/docs/cli#mac-linux-npm"&gt;Install the Firebase CLI&lt;/a&gt; and run &lt;code&gt;firebase login&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Pc5YSj01--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d62gved7hiqdnizsc79j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pc5YSj01--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d62gved7hiqdnizsc79j.png" alt="firebase login"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you haven't done this already: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generate a new project from the GitHub template repo&lt;/li&gt;
&lt;li&gt;clone it to your machine&lt;/li&gt;
&lt;li&gt;and navigate to the directory in your terminal. &lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/benzguo"&gt;
        benzguo
      &lt;/a&gt; / &lt;a href="https://github.com/benzguo/nextjs-now-firebase"&gt;
        nextjs-now-firebase
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Next.js + ZEIT Now + Firebase [template]
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Add projects to Firebase CLI
&lt;/h2&gt;

&lt;p&gt;Run &lt;code&gt;firebase use --add&lt;/code&gt; to add the two projects you created to the Firebase CLI. Use "staging" and "production" as your project &lt;a href="https://firebase.googleblog.com/2016/07/deploy-to-multiple-environments-with.html"&gt;aliases&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Under the hood, this configuration is stored in your &lt;code&gt;.firebaserc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YDly_ut1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x02qksb1bfohnm1r6hy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YDly_ut1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x02qksb1bfohnm1r6hy3.png" alt="firebase use --add"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ▲🔥 Set up Now with Firebase keys
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Staging environment
&lt;/h2&gt;

&lt;p&gt;First, we'll configure our project's staging environment with keys from Firebase.&lt;/p&gt;

&lt;p&gt;In the Firebase console, open your &lt;strong&gt;staging&lt;/strong&gt; project, navigate to the "Service accounts" tab, and click "Generate new private key" to download your admin SDK keys.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N0sjXF-z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4tb3z9h1fj0bcz6ttpco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N0sjXF-z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4tb3z9h1fj0bcz6ttpco.png" alt="Firebase – admin keys"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save the key file in the &lt;code&gt;functions&lt;/code&gt; directory as &lt;code&gt;serviceAccount-staging.json&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📁 functions&lt;br&gt;
├── serviceAccount-staging.json &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mM9FYb_d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/brwrosh6u4gvtrudjif2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mM9FYb_d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/brwrosh6u4gvtrudjif2.png" width="400px"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Your private key (in your service account key file) gives access to your project's Firebase services. Keep it confidential and &lt;strong&gt;never store it in a public repository&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Note that &lt;code&gt;serviceAccount*&lt;/code&gt; files are in the project's &lt;code&gt;.gitignore&lt;/code&gt;, so they won't be checked into your repository.  Make sure you &lt;a href="https://cloud.google.com/blog/products/gcp/help-keep-your-google-cloud-service-account-keys-safe"&gt;follow best practices for keeping these keys safe&lt;/a&gt;! 🔒&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next, find your &lt;strong&gt;app keys&lt;/strong&gt; (under Project settings).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d8_OLVWE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/di3le07v1bcs7to3cx74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d8_OLVWE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/di3le07v1bcs7to3cx74.png" alt="Firebase – app keys"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter these variables in the &lt;code&gt;.env&lt;/code&gt; and &lt;code&gt;.env.build&lt;/code&gt; files included in the template project.&lt;/p&gt;

&lt;p&gt;Create two &lt;code&gt;env&lt;/code&gt; files:&lt;br&gt;
&lt;code&gt;$ touch .env&lt;/code&gt;&lt;br&gt;
&lt;code&gt;$ touch .env.build&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt;: runtime environment variables&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env.build&lt;/code&gt;: build step environment variables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open your editor, and add the content below to the two new &lt;code&gt;.env&lt;/code&gt; files (filling in your Firebase keys):&lt;/p&gt;
&lt;h4&gt;
  
  
  .env
&lt;/h4&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;# .env
# == Firebase app keys (staging) ==
FIREBASE_API_KEY=■■■■■■■■-■■■■■■■■
FIREBASE_AUTH_DOMAIN=■■■■■■■■.firebaseapp.com
FIREBASE_DATABASE_URL=https://■■■■■■■■.firebaseio.com
FIREBASE_PROJECT_ID=■■■■■■■■
FIREBASE_STORAGE_BUCKET=■■■■■■■■.appspot.com
FIREBASE_MESSAGING_SENDER_ID=■■■■■■■■
FIREBASE_APP_ID=1:■■■■■■■■:web:■■■■■■■■
FIREBASE_MEASUREMENT_ID=G-■■■■■■■■
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  .env.build
&lt;/h4&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;# .env.build
# == Firebase app keys (staging) ==
FIREBASE_API_KEY=■■■■■■■■-■■■■■■■■
FIREBASE_AUTH_DOMAIN=■■■■■■■■.firebaseapp.com
FIREBASE_DATABASE_URL=https://■■■■■■■■.firebaseio.com
FIREBASE_PROJECT_ID=■■■■■■■■
FIREBASE_STORAGE_BUCKET=■■■■■■■■.appspot.com
FIREBASE_MESSAGING_SENDER_ID=■■■■■■■■
FIREBASE_APP_ID=1:■■■■■■■■:web:■■■■■■■■
FIREBASE_MEASUREMENT_ID=G-■■■■■■■■
# == Firebase admin keys (from serviceAccount-staging.json) ==
FIREBASE_CLIENT_EMAIL=firebase-adminsdk-■■■■@■■■■■■■■.iam.gserviceaccount.com
FIREBASE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\n■■■■■■■■\n-----END PRIVATE KEY-----\n
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;⚠️ These keys give access to your project's Firebase services. Keep them confidential and &lt;strong&gt;never store them in a public repository&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Note that &lt;code&gt;.env*&lt;/code&gt; files are in the project's &lt;code&gt;.gitignore&lt;/code&gt;, so they won't be checked into your repository. Make sure you &lt;a href="https://cloud.google.com/blog/products/gcp/help-keep-your-google-cloud-service-account-keys-safe"&gt;follow best practices for keeping these keys safe&lt;/a&gt;! 🔒&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, you're ready to try running the app locally.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ npm install&lt;/code&gt;&lt;br&gt;
&lt;code&gt;$ npm run dev&lt;/code&gt;&lt;/p&gt;


&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;


&lt;p&gt;When you open &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt; in your browser, you should see this page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GNzq-1UA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6rtjok6xjab61vlzz8or.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GNzq-1UA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6rtjok6xjab61vlzz8or.png" width="400px"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try creating an account! ✅&lt;/p&gt;

&lt;h2&gt;
  
  
  Production environment
&lt;/h2&gt;

&lt;p&gt;Now, we'll configure the project's production environment with keys from Firebase.&lt;/p&gt;

&lt;p&gt;Open your &lt;strong&gt;production&lt;/strong&gt; project in the Firebase console, and follow the same steps as above:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download your &lt;strong&gt;admin keys&lt;/strong&gt; to &lt;code&gt;/functions/serviceAccount-production.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Find your &lt;strong&gt;app keys&lt;/strong&gt; in the Firebase console's Project settings page.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Run the following commands to add your production Firebase keys to Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ now secrets add firebase-api-key ■■■■■■■■-■■■■■■■■

$ now secrets add firebase-auth-domain ■■■■■■■■.firebaseapp.com

$ now secrets add firebase-database-url https://■■■■■■■■.firebaseio.com

$ now secrets add firebase-project-id ■■■■■■■■

$ now secrets add firebase-storage-bucket ■■■■■■■■.appspot.com

$ now secrets add firebase-messaging-sender-id ■■■■■■■■

$ now secrets add firebase-app-id 1:■■■■■■■■:web:■■■■■■■■

$ now secrets add firebase-measurement-id G-■■■■■■■■

$ now secrets add firebase-client-email firebase-adminsdk-■■■■@■■■■■■■■.iam.gserviceaccount.com

$ now secrets add -- firebase-private-key "-----BEGIN PRIVATE KEY-----\n■■■■■■■■\n-----END PRIVATE KEY-----\n"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  🔥 Create a Firestore index
&lt;/h1&gt;

&lt;p&gt;Here, we'll walk through creating an index in Firestore. You'll go through this flow pretty often as you iterate on your app's data model.&lt;/p&gt;

&lt;p&gt;Navigate to &lt;a href="http://localhost:3000/spaces"&gt;http://localhost:3000/spaces&lt;/a&gt;, and open your browser's console. &lt;/p&gt;

&lt;p&gt;You should see an error in the console, with a link to create an index.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qki54sUB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/inxdrlvvaa952gp401py.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qki54sUB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/inxdrlvvaa952gp401py.png" alt="Firestore - create index error"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Following the link takes you to the Firestore dashboard, with a modal to create a new index:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_dEq8orN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8nk879f55kqrvbxf44w8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_dEq8orN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8nk879f55kqrvbxf44w8.png" width="400px"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This workflow is great for prototyping. As you solidify your data model, you can switch to deploying indexes &lt;a href="https://firebase.google.com/docs/firestore/query-data/indexing#use_the_firebase_cli"&gt;from the CLI&lt;/a&gt;. &lt;/p&gt;
&lt;h1&gt;
  
  
  🔥 Set up Firebase functions
&lt;/h1&gt;

&lt;p&gt;Here, we'll configure Firebase functions to support deploying to staging &amp;amp; production, and then deploy functions.&lt;/p&gt;

&lt;p&gt;Now, navigate to &lt;a href="http://localhost:3000/account"&gt;http://localhost:3000/account&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see an error! 🛑 &lt;/p&gt;

&lt;p&gt;This page makes a request to a Firebase function, and we haven't deployed functions yet.&lt;/p&gt;

&lt;p&gt;To set up functions, we'll configure our staging &amp;amp; production projects with an &lt;code&gt;environment&lt;/code&gt; config variable. Functions &lt;a href="https://github.com/benzguo/nextjs-now-firebase/blob/master/functions/src/index.ts#L6"&gt;use this config variable&lt;/a&gt; to decide which keys to use at runtime.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ firebase use staging
Now using alias staging (my-project-staging)

$ firebase functions:config:set app.environment="staging"
✔  Functions config updated.

$ firebase use production
Now using alias production (my-project-production)

$ firebase functions:config:set app.environment="production"
✔  Functions config updated.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now, we can deploy functions to staging and production. &lt;/p&gt;

&lt;p&gt;First, install dependencies:&lt;br&gt;
&lt;code&gt;$ cd functions &amp;amp;&amp;amp; npm install &amp;amp;&amp;amp; cd ..&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Deploy to staging:&lt;br&gt;
&lt;code&gt;$ firebase deploy -P staging --only functions&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Deploy to production:&lt;br&gt;
&lt;code&gt;$ firebase deploy -P production --only functions&lt;/code&gt;&lt;/p&gt;


&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;



&lt;p&gt;Open the account page again: &lt;a href="http://localhost:3000/account"&gt;http://localhost:3000/account&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;You should now be able to load the page without errors! ✅&lt;/p&gt;

&lt;h1&gt;
  
  
  ▲ Deploy to ZEIT Now
&lt;/h1&gt;

&lt;p&gt;You've reached the final step! 🏁🥳&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;now&lt;/code&gt; to set up a ZEIT Now project and deploy to production.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ now&lt;/code&gt;&lt;/p&gt;


&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PWVWuND8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uvh8duoe2cso3qq5cwfs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PWVWuND8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/uvh8duoe2cso3qq5cwfs.png" alt="final"&gt;&lt;/a&gt;&lt;/p&gt;
My ZEIT Now dashboard, after deploying the project



&lt;p&gt;In the future, you can deploy your app to production by running &lt;code&gt;now --prod&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To run the app locally, run &lt;code&gt;now dev&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  📌 Reference
&lt;/h1&gt;

&lt;h5&gt;
  
  
  Run app locally (using staging environment)
&lt;/h5&gt;

&lt;p&gt;&lt;code&gt;$ now dev&lt;/code&gt; &lt;/p&gt;

&lt;h5&gt;
  
  
  Deploy functions to staging
&lt;/h5&gt;

&lt;p&gt;&lt;code&gt;$ firebase deploy -P staging --only functions&lt;/code&gt; &lt;/p&gt;

&lt;h5&gt;
  
  
  Deploy functions to production
&lt;/h5&gt;

&lt;p&gt;&lt;code&gt;$ firebase deploy -P production --only functions&lt;/code&gt; &lt;/p&gt;

&lt;h5&gt;
  
  
  Run functions locally
&lt;/h5&gt;

&lt;p&gt;&lt;code&gt;$ cd functions &amp;amp;&amp;amp; npm run shell&lt;/code&gt; &lt;/p&gt;

&lt;h5&gt;
  
  
  Deploy to production
&lt;/h5&gt;

&lt;p&gt;&lt;code&gt;$ now --prod&lt;/code&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Running functions locally
&lt;/h3&gt;

&lt;p&gt;To run Firebase functions locally, navigate to the functions directory and run &lt;code&gt;npm run shell&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cd functions &amp;amp;&amp;amp; npm run shell
...
✔  functions: Emulator started at http://localhost:5000
i  functions: Loaded functions: getEnvironment
firebase &amp;gt; getEnvironment({})
Sent request to function.
firebase &amp;gt; 
RESPONSE RECEIVED FROM FUNCTION: 200, {
  "result": {
    "environment": "staging"
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This project &lt;a href="https://firebase.google.com/docs/functions/local-emulator#set_up_functions_configuration_optional"&gt;is configured&lt;/a&gt; to use the &lt;strong&gt;staging&lt;/strong&gt; environment when running functions locally.&lt;/p&gt;

&lt;p&gt;Running functions locally can be convenient for development, but handling authenticated functions can be tricky. Firebase has some &lt;a href="https://firebase.google.com/docs/emulator-suite"&gt;local emulators&lt;/a&gt;, but it's unclear what the story is for emulating authentication.&lt;/p&gt;

&lt;p&gt;Often, I'll just deploy functions directly to staging, and open &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt; to verify changes. &lt;/p&gt;
&lt;h1&gt;
  
  
  🔗 Related posts
&lt;/h1&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/thorwebdev" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2Lr-OnGk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--Ee6D1i2g--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/83859/fa3d26bd-a87e-43f8-91f9-229d746a66e4.JPG" alt="thorwebdev image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/stripe/type-safe-payments-with-next-js-typescript-and-stripe-4jo7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Type-safe Payments with Next.js, TypeScript, and Stripe 🔒💸&lt;/h2&gt;
      &lt;h3&gt;Thor 雷神 ・ Feb 11 ・ 11 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#typescript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#nextjs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#stripe&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;




&lt;div class="ltag__link"&gt;
  &lt;a href="/michaelfriedman" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5l0Yr0Rs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--eKsyZYi0--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/179111/65716c6a-253f-49d7-8dad-21ac6fb779a1.jpeg" alt="michaelfriedman image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/michaelfriedman/nextjs-vs-gatsbyjs-what-s-the-diff-47i2" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;NextJS vs GatsbyJS - What's the diff?&lt;/h2&gt;
      &lt;h3&gt;Michael Friedman ・ Aug 16 '19 ・ 5 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#nextjs&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#gatsby&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>tutorial</category>
      <category>zeit</category>
      <category>firebase</category>
      <category>react</category>
    </item>
    <item>
      <title>▲ ZEIT Now: Onboarding 📸</title>
      <dc:creator>bg</dc:creator>
      <pubDate>Sun, 09 Feb 2020 02:13:50 +0000</pubDate>
      <link>https://dev.to/benzguo/zeit-now-signup-flow-49le</link>
      <guid>https://dev.to/benzguo/zeit-now-signup-flow-49le</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/benzguo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqs4rpvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--CXW6N1Uz--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/332161/619573ec-7009-4b16-9b08-bcb1908d09ca.jpg" alt="benzguo image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/benzguo/getting-started-with-next-js-now-firebase-4ejg" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt; ▲🔥 Getting started with Next.js, ZEIT Now, and Firebase&lt;/h2&gt;
      &lt;h3&gt;bg ・ Feb  9 ・ 7 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#zeit&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#firebase&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;blockquote&gt;
&lt;p&gt;In this sub-post, I'll share some screenshots from ZEIT's onboarding flow 📸&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lzP-bauc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ul4j010jtgucx5g27u2i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lzP-bauc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ul4j010jtgucx5g27u2i.png" alt="ZEIT – signup"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f7Rg4loQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/95lg9anjvg0pvz58umly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f7Rg4loQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/95lg9anjvg0pvz58umly.png" alt="ZEIT – confirm email"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jvn4I23P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4wr9ns0995ru3j8zkqd1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jvn4I23P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4wr9ns0995ru3j8zkqd1.png" alt="ZEIT – signup success"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vBV8PbvG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/55wy84o7oy0vzmajs1cl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vBV8PbvG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/55wy84o7oy0vzmajs1cl.png" alt="ZEIT – empty dashboard"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OjxWnr3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/46k7c22bcwdheabar49x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OjxWnr3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/46k7c22bcwdheabar49x.png" alt="ZEIT – quickstart guide"&gt;&lt;/a&gt;&lt;/p&gt;
Next.js quickstart – guide






&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9zdqKS4T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dsfav91r4kk54fgrn5br.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9zdqKS4T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dsfav91r4kk54fgrn5br.png" alt="ZEIT – quickstart deploy"&gt;&lt;/a&gt;&lt;/p&gt;
Next.js quickstart – deploy






&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EVAJU09J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0w0ceh3wsfs29j7u19x8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EVAJU09J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0w0ceh3wsfs29j7u19x8.png" alt="ZEIT – quickstart live"&gt;&lt;/a&gt;&lt;/p&gt;
Next.js quickstart – live example






&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oal3j7AD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wbbo1e73tql88zgc2ma1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oal3j7AD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wbbo1e73tql88zgc2ma1.png" alt="ZEIT - dash overview"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bKTagIjO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i0dqbohxmfpbyiue1mon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bKTagIjO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i0dqbohxmfpbyiue1mon.png" alt="ZEIT – dash functions"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vwBy9UE8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i39h66h40rvxcrrbvwxt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vwBy9UE8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/i39h66h40rvxcrrbvwxt.png" alt="ZEIT – dash source"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A6-fWDkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/20xqa3gjvf73wxexq75z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A6-fWDkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/20xqa3gjvf73wxexq75z.png" alt="Next - tutorial"&gt;&lt;/a&gt;&lt;/p&gt;
Next.js tutorial







&lt;div class="ltag__link"&gt;
  &lt;a href="/benzguo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqs4rpvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--CXW6N1Uz--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/332161/619573ec-7009-4b16-9b08-bcb1908d09ca.jpg" alt="benzguo image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/benzguo/getting-started-with-next-js-now-firebase-4ejg" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt; ▲🔥 Getting started with Next.js, ZEIT Now, and Firebase&lt;/h2&gt;
      &lt;h3&gt;bg ・ Feb  9 ・ 7 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#zeit&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#firebase&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



&lt;div class="ltag__link"&gt;
  &lt;a href="/benzguo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqs4rpvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--CXW6N1Uz--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/332161/619573ec-7009-4b16-9b08-bcb1908d09ca.jpg" alt="benzguo image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/benzguo/firebase-onboarding-381e" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;🔥 Firebase: Onboarding 📸&lt;/h2&gt;
      &lt;h3&gt;bg ・ Feb  9 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#firebase&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#design&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#documentation&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>zeit</category>
      <category>design</category>
      <category>documentation</category>
    </item>
  </channel>
</rss>
