<?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: Fortune Ikechi</title>
    <description>The latest articles on DEV Community by Fortune Ikechi (@fortune_ikechi).</description>
    <link>https://dev.to/fortune_ikechi</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%2F588553%2F0c2d09e2-38ca-4746-aad8-4fe29f6e2efd.png</url>
      <title>DEV Community: Fortune Ikechi</title>
      <link>https://dev.to/fortune_ikechi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fortune_ikechi"/>
    <language>en</language>
    <item>
      <title>Live Loading Content is Now Available for Gatsby SDK v6.1.1! 🚀</title>
      <dc:creator>Fortune Ikechi</dc:creator>
      <pubDate>Fri, 04 Aug 2023 14:10:37 +0000</pubDate>
      <link>https://dev.to/storyblok/live-loading-content-is-now-available-for-gatsby-sdk-v611-1p2e</link>
      <guid>https://dev.to/storyblok/live-loading-content-is-now-available-for-gatsby-sdk-v611-1p2e</guid>
      <description>&lt;p&gt;We’re thrilled to share that the Live Loading Content feature for Gatsby SDK has been unleashed, elevating it from version v6.0.2 to v6.1.1. Prepare for an exceptional content experience with real-time updates as you edit and publish within Storyblok. Bid farewell to manual refreshes – your Gatsby site effortlessly stays current!&lt;/p&gt;

&lt;h3&gt;
  
  
  Advantages:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Real-time Updates 🔄&lt;/li&gt;
&lt;li&gt;Enhanced Efficiency ⚡&lt;/li&gt;
&lt;li&gt;Enhanced User Experience 📈&lt;/li&gt;
&lt;li&gt;Instant Error Handling 🛡️&lt;/li&gt;
&lt;li&gt;Unmatched Customization Flexibility 🎨&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Known Limitations:
&lt;/h3&gt;

&lt;p&gt;Cache forces to load the previous content by only hitting a save button on the visual editor. To solve it, after hitting a save button, hit the reload 🔃 button on the visual editor to load the most updated content.&lt;/p&gt;

&lt;p&gt;Ready to elevate your content management? Dive into the upgraded version today! For intricate specifics, peruse our refreshed documentation.&lt;br&gt;
Here’s to exhilarating Gatsby-ing with Storyblok! 🎉&lt;/p&gt;

</description>
      <category>storyblok</category>
      <category>gatsby</category>
      <category>react</category>
      <category>headles</category>
    </item>
    <item>
      <title>Storyblok Gatsby SDK Now Supports React Server Components and Gatsby 5! 🚀</title>
      <dc:creator>Fortune Ikechi</dc:creator>
      <pubDate>Fri, 14 Jul 2023 14:33:27 +0000</pubDate>
      <link>https://dev.to/storyblok/storyblok-gatsby-sdk-now-supports-react-server-components-and-gatsby-5-2g1g</link>
      <guid>https://dev.to/storyblok/storyblok-gatsby-sdk-now-supports-react-server-components-and-gatsby-5-2g1g</guid>
      <description>&lt;p&gt;We have some exciting news to share! The latest release of Storyblok's &lt;a href="https://github.com/storyblok/storyblok-react" rel="noopener noreferrer"&gt;React SDK&lt;/a&gt; (version 2.1.0) brings two major updates that will take your web development experience to new heights. Here's what's new:&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;a href="https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023#react-server-components" rel="noopener noreferrer"&gt;React Server Components (RSC)&lt;/a&gt; Support: We're thrilled to introduce support for React Server Components in the &lt;a href="https://github.com/storyblok/storyblok-react" rel="noopener noreferrer"&gt;Storyblok React SDK&lt;/a&gt;. Now, you can seamlessly integrate Storyblok into your apps created with the latest Gatsby 5 and lower versions of Gatsby. With RSC, you can enhance website performance.&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;a href="https://www.gatsbyjs.com/gatsby-5/" rel="noopener noreferrer"&gt;Gatsby 5&lt;/a&gt; Support with &lt;a href="https://www.gatsbyjs.com/docs/conceptual/partial-hydration/" rel="noopener noreferrer"&gt;Partial Hydration&lt;/a&gt;: We're delighted to announce that our Storyblok &lt;a href="https://github.com/storyblok/gatsby-source-storyblok" rel="noopener noreferrer"&gt;Gatsby SDK&lt;/a&gt; now supports &lt;a href="https://www.gatsbyjs.com/gatsby-5/" rel="noopener noreferrer"&gt;Gatsby version 5&lt;/a&gt;, complete with &lt;a href="https://www.gatsbyjs.com/docs/conceptual/partial-hydration/" rel="noopener noreferrer"&gt;Partial Hydration&lt;/a&gt;. This update brings many new features and improvements, such as an option to enable RSC and select client components to load minimal JavaScript to allow you to build better performance websites with dynamic content. Experience the power of Gatsby 5 and unleash the performance gains Partial Hydration offers.&lt;/p&gt;

&lt;p&gt;3️⃣ Included &lt;code&gt;useStoryblokState&lt;/code&gt; into &lt;code&gt;&amp;lt;StoryblokStory /&amp;gt;&lt;/code&gt; to keep the state for stories behind the scenes. It uses &lt;code&gt;StoryblokComponent&lt;/code&gt; to render the components dynamically, using the list of components loaded during the initialization inside the &lt;code&gt;storyblokInit&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;src/pages/index.tsx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;graphql&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gatsby&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StoryblokStory&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gatsby-source-storyblok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Layout&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../components/layout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;IndexPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storyblokEntry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storyblokEntry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storyblokEntry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Layout&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;StoryblokStory&lt;/span&gt; &lt;span class="nx"&gt;story&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storyblokEntry&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;{/&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="err"&gt;⬅️&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Layout&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;IndexPage&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;graphql&lt;/span&gt;&lt;span class="s2"&gt;`
  query HomeQuery {
    storyblokEntry(full_slug: { eq: "home" }) {
      content
      name
      full_slug
      uuid
      id
      internalId
    }
  }
`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;src/components/layout.jsx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;PropTypes&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prop-types&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;storyblokInit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;apiPlugin&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gatsby-source-storyblok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Teaser&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Teaser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Grid&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Grid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Page&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="c1"&gt;// ⬅️&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Feature&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Feature&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;configuration&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../gatsby-config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sbConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gatsby-source-storyblok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;storyblokInit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sbConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;apiPlugin&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;teaser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Teaser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Grid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="c1"&gt;// ⬅️&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/main&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;propTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PropTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Layout&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To get started, you can get started by following the steps below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://github.com/storyblok/gatsby-source-storyblok" rel="noopener noreferrer"&gt;gatsby-source-storyblok&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Config &lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/gatsby-config.ts" rel="noopener noreferrer"&gt;gatsby-config file&lt;/a&gt; with &lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/gatsby-config.ts#L4-L6" rel="noopener noreferrer"&gt;Partial Hydration flag&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/src/pages/index.tsx" rel="noopener noreferrer"&gt;Update&lt;/a&gt; &lt;code&gt;src/pages/index.tsx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/src/pages/index.tsx#L4" rel="noopener noreferrer"&gt;Import&lt;/a&gt; &lt;code&gt;&amp;lt;StoryblokStory /&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/src/pages/index.tsx#L9" rel="noopener noreferrer"&gt;Parse content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/src/pages/index.tsx#L13" rel="noopener noreferrer"&gt;Call&lt;/a&gt; &lt;code&gt;&amp;lt;StoryblokStory /&amp;gt;&lt;/code&gt; in JSX scope&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/src/pages/index.tsx#L22" rel="noopener noreferrer"&gt;Update&lt;/a&gt; layout.jsx&lt;/li&gt;
&lt;li&gt;Set “&lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/src/components/layout.jsx#L7" rel="noopener noreferrer"&gt;use client&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/src/components/layout.jsx#L13" rel="noopener noreferrer"&gt;Import Page component&lt;/a&gt; (content-type)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/src/components/layout.jsx#L26" rel="noopener noreferrer"&gt;Add Page component&lt;/a&gt; inside of &lt;code&gt;components&lt;/code&gt; to initialize&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/storyblok/gatsby-source-storyblok/blob/master/playground/src/components/Page.tsx" rel="noopener noreferrer"&gt;Create Page component&lt;/a&gt; file&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ready to get started? ⚡
&lt;/h2&gt;

&lt;p&gt;Want to go straight to action? Clone this &lt;a href="https://github.com/gatsbyjs/gatsby-starter-default" rel="noopener noreferrer"&gt;Gatsby starter&lt;/a&gt; and start playing around with the latest version of Gatsby! &lt;br&gt;
Or alternatively, you can refer to the example from one of our playgrounds. See our example &lt;a href="https://github.com/storyblok/gatsby-source-storyblok/tree/master/playground" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can read all the details on what we’ve updated for Gatsby version 5 here &lt;a href="https://github.com/storyblok/gatsby-source-storyblok" rel="noopener noreferrer"&gt;in the readme&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Words of appreciation
&lt;/h2&gt;

&lt;p&gt;We sincerely thank Arisa (&lt;a href="https://twitter.com/arisa_dev" rel="noopener noreferrer"&gt;@arisa_dev&lt;/a&gt;) and Alex Jover (&lt;a href="https://twitter.com/alexjoverm" rel="noopener noreferrer"&gt;@alexjoverm&lt;/a&gt;) for their dedicated work investigating and experimenting with different approaches to bring you these flexible solutions.&lt;/p&gt;

</description>
      <category>storyblok</category>
      <category>gatsby</category>
      <category>gatsby5</category>
      <category>react</category>
    </item>
    <item>
      <title>Building Select Components with React and Fauna</title>
      <dc:creator>Fortune Ikechi</dc:creator>
      <pubDate>Wed, 06 Oct 2021 13:43:49 +0000</pubDate>
      <link>https://dev.to/fortune_ikechi/building-select-components-with-react-and-fauna-1ggj</link>
      <guid>https://dev.to/fortune_ikechi/building-select-components-with-react-and-fauna-1ggj</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Building select elements is one of the most important factors when working on web applications. There is a lot that goes into building select elements and that includes focus on the user interface and experience. Some properties such as One has to consider features such as on-focus, styling select elements, fetching data from a remote source and the list goes on. A library solving this is React-select.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is react-select?
&lt;/h2&gt;

&lt;p&gt;Jed Watson created a project called react-select. There were several limitations with version one of react-select, which gave birth to v2. In this article, We’ll be looking at building select components with React-select and Fauna. &lt;/p&gt;

&lt;h2&gt;
  
  
  Installation and basic usage of react-select
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Yarn/npm  installed&lt;/li&gt;
&lt;li&gt;create react app CLI tool installed&lt;/li&gt;
&lt;li&gt;A basic understanding of React JS &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Installing react-select
&lt;/h3&gt;

&lt;p&gt;For this tutorial, we will use the &lt;code&gt;create-react-app&lt;/code&gt; CLI tool provided by Facebook, run the command below on your terminal to create a React application:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ yarn create react-app react&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After that is done, we’ll install the react-select and fauna package from npm:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ yarn add react-select&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Next, let’s create our Fauna database, to do this, first create an account on Fauna, and after that navigate to your Fauna dashboard here and create a database, it should look similar to the image below &lt;/p&gt;

&lt;p&gt;Next, let’s create our Fauna database, to do this, first create an account on Fauna, and after that navigate to your Fauna dashboard here and create a database, it should look similar to the image below &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_DB35658FF4B8EC32306CEADB530112CFF5AD2B41839D70A29DC5DD549B2911DD_1632644817566_fauna%2B22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_DB35658FF4B8EC32306CEADB530112CFF5AD2B41839D70A29DC5DD549B2911DD_1632644817566_fauna%2B22.png" alt="huunuui"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we will create our &lt;code&gt;contacts&lt;/code&gt; and &lt;code&gt;phone_number&lt;/code&gt; collections, you will find this after we create our database similar to the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_DB35658FF4B8EC32306CEADB530112CFF5AD2B41839D70A29DC5DD549B2911DD_1632645542153_fauna%2B23.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_DB35658FF4B8EC32306CEADB530112CFF5AD2B41839D70A29DC5DD549B2911DD_1632645542153_fauna%2B23.png" alt="fyygjj"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Post this, let’s create indexes for our contacts, to do this click on the &lt;code&gt;index&lt;/code&gt; tab on the side bar and fill in with the details below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_DB35658FF4B8EC32306CEADB530112CFF5AD2B41839D70A29DC5DD549B2911DD_1632647315588_fauna%2B24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpaper-attachments.dropbox.com%2Fs_DB35658FF4B8EC32306CEADB530112CFF5AD2B41839D70A29DC5DD549B2911DD_1632647315588_fauna%2B24.png" alt="hyiiu"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To complete our database, click on the &lt;code&gt;Security&lt;/code&gt; tab and click to reveal your Fauna access keys, copy it and add it to your applications &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Our React Select Component
&lt;/h2&gt;

&lt;p&gt;Let’s navigate back to our React application, inside our &lt;code&gt;App.js&lt;/code&gt; and import our packages below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    import React from 'react';
    import Select from 'react-select';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the code block above, we imported our &lt;code&gt;react-select&lt;/code&gt; and also create a functional &lt;code&gt;App&lt;/code&gt; omponent, let’s create our values as options below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    const options = [
      { value: 'blues', label: 'Blues' },
      { value: 'rock', label: 'Rock' },
      { value: 'jazz', label: 'Jazz' },
      { value: 'orchestra' label: 'Orchestra' } 
    ];

    const App = () = {
       return (
        &amp;lt;div className="wrapper"&amp;gt;
    ```



With those two packages imported, we will be able to have access to the react-select ( &amp;lt;Select /&amp;gt;) and also extend the `React.Component` class.



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//App.js

//Import React and Select 

const options = [
  { value: 'blues', label: 'Blues' },
  { value: 'rock', label: 'Rock' },
  { value: 'jazz', label: 'Jazz' },
  { value: 'orchestra' label: 'Orchestra' } 
];

class App extends React.Component {
  render(){
    return (
      &amp;lt;Select options = {options} /&amp;gt;
    );
  }
}

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Our application should look like the image below if done correctly, 

![display options react-select](https://blog.logrocket.com/wp-content/uploads/2019/06/reactselect2.png)

In the image above we were able to set the background of a selected option to green and change the text color to yellow. This was made possible by extending its default styling by spreading it into the provided variable `…provided`

## Custom components

Under styles and states, we discussed two custom components (option and control) which we used to extend the select styling. In this section, we’ll take a look at another custom component called the `Custom SingleValue` . This custom component does what our regular select component does but we’re going to add a little bit of finesse. In our `App.js` file, we’ll import the `React` and `Select` packages from `react` and `react-select` respectively like so:



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//App.js
import React, { type ElementConfig } from 'react';
import Select, { components } from 'react-select';
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


By the time we are done, we have a finished product that looks something like this:

![hello](https://paper-attachments.dropbox.com/s_F9F0BEA2606EC0FEDAC450A16F9976CC05FBD81BB424031DAF1E91C33340520A_1555501514723_select-colour.gif)


In the code block below, we define our custom component `SingleValue` as a method which extends the base component in the `react-select` package. In our App class, we have a couple of props and functions which contribute to the functionality (as shown in the image above) such as:
handleChange: This method is triggered by a state manager prop called the `onChange` . This method is responsible for storing the value of the selected option in our state object called `selectedOption`
styles: In this prop, we extend the style modifier method `singleValue` where we modify the styling already accessible to us by default by spreading default styles into the base object. The line responsible for adding a background color to each selected option is the `background: this.state.selectedOption.value` where we get the current option selected from the state and use it to update the background
components: In the component prop we pass in the SingleValue component, the primary function of the component is to display in the input for a single select.
options: The options prop that we all know by now is how we pass in our array object of select items which in this case are colors like so.
className: In this prop is where we add our bootstrap styling to position our select component away from the top margin as well as centralize our select component nicely.



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;//App.js&lt;br&gt;&lt;br&gt;
     const SingleValue = ({ children, ...props }) =&amp;gt; (&lt;br&gt;
       &lt;br&gt;
         {children}&lt;br&gt;
       &lt;br&gt;
     );&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; class App extends React.Component {
   state = {};
   state = {
     selectedOption: null,
   }
   handleChange = (selectedOption) =&amp;gt; {
     this.setState({ selectedOption });
   }
   render() {
     return (
       &amp;lt;Select
           className="mt-4 col-md-6 col-offset-4"
           onChange={this.handleChange}
           styles={{ singleValue: (base) =&amp;gt; ({ ...base, padding: 5, borderRadius: 5, background: this.state.selectedOption.value, color: 'white', display: 'flex' }) }}
           components={{ SingleValue }}
           options={colourOptions}
         /&amp;gt;
     );
   }
 }
 export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


## Concluding our Application

To conclude our application, we will create an `.env` file and inside it we will add our Fauna access keys, by doing this newly created select component will come from our Fauna database collections. 

## Conclusion
In this post, we have learned some common use cases for reac-selec component, how to get started and. There are a plethora of functionalities built into the react-select package, some of which will fit your needs, some of which you’ll need to customize to fit your use case. Here’s a link to the official documentation to get your hands dirty. We also added our component to Fauna, loading the components and selector from our Fauna database. 

Written in connection with the Write with Fauna Program. 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>fauna</category>
      <category>react</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Manage Secrets with GitHub Actions using Doppler.</title>
      <dc:creator>Fortune Ikechi</dc:creator>
      <pubDate>Tue, 28 Sep 2021 04:12:31 +0000</pubDate>
      <link>https://dev.to/fortune_ikechi/how-to-manage-secrets-with-github-actions-using-doppler-24hf</link>
      <guid>https://dev.to/fortune_ikechi/how-to-manage-secrets-with-github-actions-using-doppler-24hf</guid>
      <description>&lt;h2&gt;
  
  
  How to Manage Secrets with GitHub Actions using Doppler.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Managing access and private keys with GitHub Actions is vital in managing continuous deployment and integration in building applications. Over time, there have been several inventions on how best to do this, but there’s always a risk of issues with workflows and mismanaging secrets for software developers and teams.&lt;br&gt;
For this, Doppler has provided a better and easier way of managing secrets when managing application CI/CD with GitHub Actions. Throughout this tutorial, we’ll focus on using Doppler as an effective secret manager for managing our Node.js and React application with GitHub Actions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Goals
&lt;/h3&gt;

&lt;p&gt;In this post, you will learn how to build a simple Notes application with Node.js and React.js, connect it to GitHub actions for running CI/CD. We’ll then set up our project with Doppler to store our application’s secret keys instead of on GitHub Actions or even native .env files. At the end of this tutorial, you will learn how to use Doppler for managing secrets with Github Actions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Introduction to Managing Secrets with GitHub Actions
&lt;/h3&gt;

&lt;p&gt;One of the issues DevOps and Software Engineers have when running continuous integration and deployment with GitHub Actions is handing secret keys and tokens required for authenticating the application against them. For GitHub Actions, logging your application’s secret can be very lengthy and stressful; any mistake in logging an application’s secrets can result in a developer getting terminated and even cause the company to lose millions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Intro To Doppler Secret Management
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.doppler.com/"&gt;Doppler&lt;/a&gt; is a universal secret manager that aims to reduce the stress and issues associated with managing secrets with GitHub Actions. With Doppler, there is no need for teams to share and handle application secrets on GitHubActions. Doppler provides a CLI that gives developers a central environment of their application environment. Doppler also allows DevOps Teams and Engineers to access secrets from a single, and easy to use platform.&lt;br&gt;
It’s also important to point out that Doppler supports all languages and tech stacks and is built to support all kinds of application types. One of such integrations is GitHub Actions for DevOps teams and Engineers. In our next section, we will look at managing our application’s secrets with Doppler on GitHub Actions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setup a MERN Stack App With Doppler Using GitHub Actions
&lt;/h3&gt;

&lt;p&gt;In this section, we will learn how to manage application secrets on GitHub Actions with Doppler. In our application, we connected a Node.js powered backend in sending images and as a database for storing data from our application.&lt;br&gt;
We also added the ability of users to choose which category of photos to select. Users will also be able to get random images from our API. All these will involve many API keys that our application’s front end will utilize. For our application’s env file, Doppler will be used to secure our application’s secrets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AQQj5-Uu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/99qzz4irwt23xzmi05fh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AQQj5-Uu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/99qzz4irwt23xzmi05fh.png" alt="an image" width="184" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the image above, we have our application file structure, but our focus here will be our project’s .env file which contains all the secrets for our application to connect our server and image API. Inside our env file, we have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REACT_APP_UNSPLASH_ACCESS_KEY=x_x4KNbXEt0xxxxxxxxxxxxxxxxxxx  REACT_APP_UNSPLASH_SECRET_KEY=NFOWuGDXZxxxxxxxxxxxxxxxxxxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setting Up Doppler
&lt;/h3&gt;

&lt;p&gt;In order to use &lt;a href="https://www.doppler.com/"&gt;Doppler&lt;/a&gt;, first, we will create an account here. After creating an account, you’re prompted to create a workspace that can be any name you choose. Doppler also provides user-friendly prompts explaining your functionalities and which ones are optional and necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a MERN Stack Project
&lt;/h3&gt;

&lt;p&gt;To create a project on Doppler, we will navigate to the build to create a project after creating our Doppler workspace. Next, we will add our project details such as project name and project description, and if done correctly, our dashboard should look like the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_3pYPpy0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/emrbqq1idq891rb8b5t4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_3pYPpy0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/emrbqq1idq891rb8b5t4.png" alt="an alt image text" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After we’ve created our application, we will see a dashboard with our application environments dev, staging and production as shown in the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9-hO1h45--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pqfnyl8yj2vuww2xmr8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9-hO1h45--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pqfnyl8yj2vuww2xmr8j.png" alt="an image text" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we notice, our application doesn’t have a staging, dev or production environment, so we will create a new environment that we will call GitHub. You can create a unique, environment by clicking on the hamburger menu like the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G7YMlroH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/119z4lqi3nl783g8z9w0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G7YMlroH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/119z4lqi3nl783g8z9w0.png" alt="an image text" width="632" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Authorising Doppler in GitHub Actions
&lt;/h3&gt;

&lt;p&gt;After creating our environment variables as we did above next is o connect Doppler to our GitHub repositories. To do this, click on the integrations button on the right side of our Doppler dashboard and select GitHub from the options as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wyr6H0Hj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q1zdogtftczcqlpsl9zh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wyr6H0Hj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q1zdogtftczcqlpsl9zh.png" alt="an image text" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After we’ve selected GitHub for our integration, we will click on Set Up Integration and let Doppler complete our secrets setup. With workspace built this, every time we change or remove a secret in Doppler, it automatically reflects on our GitHub Actions page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Mv_GmbeL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zn10vz9udy2xlv4bfc9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mv_GmbeL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zn10vz9udy2xlv4bfc9b.png" alt="an image text" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we have our project set up on the Doppler website, let’s set our project our local environment using the Doppler CLI&lt;br&gt;
First, let’s proceed to install the Doppler CLI, which will help us in the development stage of our application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    # Install pre-reqs
    sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
    # Add Doppler's GPG key
    curl -sLf --retry 3 --tlsv1.2 --proto "=https" 'https://packages.doppler.com/public/cli/gpg.DE2A7741A397C129.key' | sudo apt-key add -
    # Add Doppler's apt repo
    echo "deb https://packages.doppler.com/public/cli/deb/debian any-version main" | sudo tee /etc/apt/sources.list.d/doppler-cli.list
    # Fetch and install the latest doppler cli
    sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install doppler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we’ve finished configuring and installing Doppler CLI on our local machine, run the following code to confirm that it was installed successfully.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    doppler  --version
    # v3.32.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, let’s authenticate our local development with the remote development environment as they need to be in sync.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    doppler login
    ? Open the authorization page in your browser? Yes
    Your auth code is:
    XXXXh_XXXX_cybele_hour_XXXXo_XXXXmonica
    Waiting...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens the browser to log into your account and authenticate your local environment. Fill in your email or login with Google, then copy and paste the auth token displayed on the terminal to authenticate Doppler.&lt;br&gt;
Run the doppler setup command inside the root and select the right option to configure your local environment. Now let’s return to our remote project on the website and click on the dev section of the project. Then click on the Add Secret to add a new secret as below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kaycodev@kaycodev:~$ doppler setup 
    Selected only available project: daisy-ui-app
    ? Select a config: daisyui
    ┌─────────┬──────────────┬────────────────┐
    │ NAME    │ VALUE        │ SCOPE          │
    ├─────────┼──────────────┼────────────────┤
    │ config  │ daisyui      │ /home/kaycodev │
    │ project │ daisy-ui-app │ /home/kaycodev │
    ig  │ daisyui      │ /home/kaycodev │
    │ project │ daisy-ui-app │ /home/kaycodev │
    └─────────┴──────────────┴────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, let’s return to our small project and click on the dev section of our project. Then click on the Add Secret. Return back to your terminal and run the code block below to confirm that your secret key is in sync with your remote environment. Your private address is shown in the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CDo1EF1X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tdmx7xh1dgoz6a3d7uyv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CDo1EF1X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tdmx7xh1dgoz6a3d7uyv.png" alt="Aan alt text" width="675" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let’s start our application by running yarn start on our terminal, if done correctly, our browser tab will look like the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LumvSDe1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0kn3zpwe5j4g0u77tqmi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LumvSDe1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0kn3zpwe5j4g0u77tqmi.png" alt="An alt text" width="645" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;We’ve successfully set up Doppler for a MERN stack application to secure and manage our application’s secret keys. We eliminated the need to have a .env file. Using Doppler, we can now manage these secret keys amongst a development team, giving access to a particular project or workspace on our Doppler dashboard. We can also add Doppler to any native JavaScript application. You can find the code used in this tutorial on GitHub. You. If can learn more about &lt;a href="https://www.doppler.com/"&gt;Doppler&lt;/a&gt; here.&lt;/p&gt;

</description>
      <category>doppler</category>
    </item>
  </channel>
</rss>
