<?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: Tyler Warnock</title>
    <description>The latest articles on DEV Community by Tyler Warnock (@tyrw).</description>
    <link>https://dev.to/tyrw</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%2F1428%2Fb8a8e7d7-0a50-4321-b85e-7d118fc3386f.jpg</url>
      <title>DEV Community: Tyler Warnock</title>
      <link>https://dev.to/tyrw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tyrw"/>
    <language>en</language>
    <item>
      <title>Why I Love Building Userfront</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Thu, 27 Jun 2024 23:01:16 +0000</pubDate>
      <link>https://dev.to/userfront/why-i-love-building-userfront-447c</link>
      <guid>https://dev.to/userfront/why-i-love-building-userfront-447c</guid>
      <description>&lt;p&gt;Hi, I’m Tyler. I’m the founding CEO at Userfront, and I want to share why I’m here and why I love working on Userfront every day.&lt;/p&gt;

&lt;p&gt;My cofounder Damion and I have each been writing software for over a decade; in my case it’s about 20 years. My software background started with missile defense research for DARPA, where I wrote code to control hardware in supersonic dynamic systems, and then robotics at Stanford, where I focused on building novel medical devices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhgft3opucmls9z9uk11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhgft3opucmls9z9uk11.png" alt="My old wind tunnel setup" width="800" height="516"&gt;&lt;/a&gt;&lt;em&gt;My old wind tunnel setup&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When I started writing software specifically for the internet and startups in 2012, I found all the “extra stuff” to be a nuisance. User administration, password resets, file uploads, email sending… why can’t I just build my app? I was on Ruby on Rails at the time, and the gem plugin ecosystem (as narrated by Ryan Bates at RailsCasts) is the only reason I was able to build anything useful at all.&lt;/p&gt;

&lt;p&gt;Still, I stuck with it, and as I became more sophisticated, I noticed patterns emerging. My first approach to handling all the “extra stuff” was to pick a basic solution and move on. This works great because extra features are YAGNI (”You Aren’t Gonna Need It”), and moving quickly at the beginning matters a lot. But I also learned that this strategy is painful for certain foundational systems, particularly databases and auth. Both are hard to change once you have them in place, so you really want to make sure that whatever you choose will have what you need later, even if you don’t need it right now. For these foundational systems, it’s less “You Aren’t Gonna Need It” and more “You Will Need It - Just Not Right Now” (YWNI-JNRN™).&lt;/p&gt;

&lt;p&gt;For databases, I came to love Postgres, and at this point you’ll have a tough time convincing me to start with something else. Auth on the other hand… there were always pros and cons and opinions and tradeoffs. Damion &amp;amp; I never found something that really nailed it and fit the bill for a growing software company. Simple plugins make it easy to get started, but simple plugins don’t model intermediate or advanced needs. If you start with individual user accounts and later need to serve team accounts, you’re going to have a bad time. If you start with freemium customers and later want to serve enterprise customers, you’re going to have a bad time. If you start with session tokens and later need to scale horizontally, you guessed it… you’re going to have a bad time.&lt;/p&gt;

&lt;p&gt;It seems like the instant you get off of the happy path for auth, everything jumps straight from “this takes 7 seconds to set up” to “read our PhD-level Zanzibar whitepaper”. Either you’re doing the basics, no problem, or you need to be a master artisan.&lt;/p&gt;

&lt;p&gt;In other words, auth is like the meme for drawing an owl:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmteewew7jbn17m0cyvbg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmteewew7jbn17m0cyvbg.png" alt="Drawing the auth owl" width="530" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this is why I love working on Userfront: we’re drawing the auth owl for thousands of software companies. I love helping people solve their growing pains because it feels like paying it forward. I’ve found that almost everyone wants to build things that make the world better, and we get to help them do that. Every important transaction and every piece of data relies on auth, and we get to help software companies spend less time figuring it out as they go. We get to help software companies succeed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Didn't want to bother support, but wanted to give you guys some feedback — you guys are rockstars and my developers love working with your product and you are amazing at support requests as well. Cheers!&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Kunal Shah, Co-Founder and Managing Director, Accelerate BSi&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;At this point, I’ve spoken with almost 1,000 software companies about their auth needs, and I’ve seen every configuration you can imagine. These are the things that I believe matter most for companies and developers:&lt;/p&gt;

&lt;h2&gt;
  
  
  Auth wishlist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Should Have&lt;/th&gt;
&lt;th&gt;Should Not Have&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fast and free to get started, no credit card required&lt;/td&gt;
&lt;td&gt;Complex mental model with lots of diagrams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexible architecture to handle all types of customers (freemium, organizations, enterprise)&lt;/td&gt;
&lt;td&gt;Vendor lock-in and squeeze&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazing docs&lt;/td&gt;
&lt;td&gt;Circular docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secure and compliant by default&lt;/td&gt;
&lt;td&gt;Security footguns, or compliance as an afterthought&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This list is what we’re building at Userfront, and I love being a part of it. We have a thoughtful, world-class team who have built complicated systems and who care about getting it right. We sweat the details of the auth owl together so that software companies don’t have to. In doing so, we’ve built something rock solid that our customers rave about.&lt;/p&gt;

&lt;p&gt;It feels amazing to create something that moves the needle for people in such a concrete way. We love celebrating with companies when they win a big new customer, or when we enable a feature that levels up their product. We love building a solid tool that companies don’t have to rip and replace in a year, and we love giving people a roadmap of what’s coming next on their journey.&lt;/p&gt;

&lt;p&gt;At the end of the day, we’re all trying to build something great, and I love that Userfront is helping software companies do just that.&lt;/p&gt;

&lt;p&gt;Learn more about Userfront on &lt;a href="https://userfront.com/"&gt;our website&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>authentication</category>
      <category>identity</category>
      <category>startup</category>
      <category>story</category>
    </item>
    <item>
      <title>React authentication, simplified</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Mon, 03 May 2021 17:46:23 +0000</pubDate>
      <link>https://dev.to/tyrw/react-authentication-simplified-18gl</link>
      <guid>https://dev.to/tyrw/react-authentication-simplified-18gl</guid>
      <description>&lt;p&gt;Authentication is one of those things that just always seems to take a lot more effort than we want it to.&lt;/p&gt;

&lt;p&gt;To set up auth, you have to re-research topics you haven’t thought about since the last time you did authentication, and the fast-paced nature of the space means things have often changed in the meantime. New threats, new options, and new updates may have kept you guessing and digging through docs in your past projects.&lt;/p&gt;

&lt;p&gt;In this article, we lay out a different approach to authentication (plus access control &amp;amp; SSO) in React applications. Rather than add a static library that you have to keep up to date or re-research each time you want to implement auth, we’ll use a service that stays up to date automatically and is a much simpler alternative to Auth0, Okta, and others.&lt;/p&gt;

&lt;h2&gt;
  
  
  React authentication
&lt;/h2&gt;

&lt;p&gt;We typically use a similar approach when writing authentication in React: our React app makes a request to our authentication server, which then returns an access token. That token is saved in the browser and can be used in subsequent requests to your server (or other servers, if needed). Whether writing standard email &amp;amp; password authentication or using magic links or single sign on (SSO) logins like Google, Azure, or Facebook, we want our React app to send an initial request to an authentication server and have that server handle all the complexity of generating a token.&lt;/p&gt;

&lt;p&gt;So React’s responsibility in authentication is to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send the initial request to the authentication server&lt;/li&gt;
&lt;li&gt;Receive and store the access token&lt;/li&gt;
&lt;li&gt;Send the access token to your server with each subsequent request&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  JWT access tokens
&lt;/h2&gt;

&lt;p&gt;JSON Web Tokens (JWTs) are compact, URL-safe tokens that can be used for authentication and access control in React applications. Each JWT has a simple JSON-object as its “payload” and is signed such that your server can verify that the payload is authentic. An example JWT would look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsImF1dGhvcml6YXRpb24iOiJhZG1pbiJ9.f7iKN-xi24qrQ5NQtOe0jiriotT-rve3ru6sskbQXnA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The payload for this token is the middle section (separated by periods):&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The JWT payload can be decoded from base64 to yield the JSON object:&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="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="nf"&gt;atob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eyJ1c2VySWQiOjEsImF1dGhvcml6YXRpb24iOiJhZG1pbiJ9&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// =&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="nx"&gt;admin&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s important to note that this payload is readable by anyone with the JWT, including your React application or a third party.&lt;/p&gt;

&lt;p&gt;Anyone that has the JWT can read its contents. However, only the authentication server can generate valid JWTs -- your React application, your application server, or a malicious third party cannot generate valid JWTs. So in addition to reading the JWT, your server also needs to verify the JWT as authentic by checking it against a public key. This allows your application server to verify incoming JWTs and reject any tokens that were not created by the authentication server or that have expired.&lt;/p&gt;

&lt;p&gt;The flow for using a JWT in a React application looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your React app requests a JWT whenever the user wants to sign on.&lt;/li&gt;
&lt;li&gt;The authentication server generates a JWT using a private key and then sends the JWT back to your React app.&lt;/li&gt;
&lt;li&gt;Your React app stores this JWT and sends it to your application server whenever your user needs to make a request.&lt;/li&gt;
&lt;li&gt;Your application server verifies the JWT using a public key and then read the payload to determine which user is making the request.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each of these steps is simple to write down, but each step has its own pitfalls when you actually want to implement it and keep it secure. Especially over time, as new threat vectors emerge and new platforms need to be patched or supported, the security overhead can add up quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Userfront removes auth complexity in React apps
&lt;/h2&gt;

&lt;p&gt;Userfront is a framework that abstracts away auth complexity. This makes it much easier for you to work with authentication in a React application and, perhaps most importantly, keeps all the auth protocols updated for you automatically over time.&lt;/p&gt;

&lt;p&gt;The underlying philosophy with Userfront is that world-class auth should not take effort – it should be easy to set up, and security updates should happen for you automatically. Userfront has all the bells and whistles of authentication, Single Sign On (SSO), access control, and multi-tenancy, with a production-ready free tier up to 10,000 monthly active users. For most modern React applications, it’s a great solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up authentication in React
&lt;/h3&gt;

&lt;p&gt;Now we will go through building all the main aspects of authentication in a React application. The final code for this example is available &lt;a href="https://github.com/tyrw/david-walsh-blog-react-auth" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Use your favorite boilerplate to set up your React application and get your build pipeline in order. In this article, we’ll use &lt;a href="https://reactjs.org/docs/create-a-new-react-app.html" rel="noopener noreferrer"&gt;Create React App&lt;/a&gt;, which does a lot of the setup work for us, and we’ll also add &lt;a href="https://reactrouter.com/web/guides/quick-start" rel="noopener noreferrer"&gt;React Router&lt;/a&gt; for our client-side routing. Start by installing Create React App and React Router:&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="nx"&gt;npx&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;
&lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="nx"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;dom&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now our React application is available at &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1612896738%2Fpermanent%2Fcreate-react-app.gif" 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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1612896738%2Fpermanent%2Fcreate-react-app.gif" alt="Create React App authentication"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like it says, we can now edit the &lt;code&gt;src/App.js&lt;/code&gt; file to start working.&lt;/p&gt;

&lt;p&gt;Replace the contents of &lt;code&gt;src/App.js&lt;/code&gt; with the following, based on the React Router quickstart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/App.js&lt;/span&gt;

&lt;span class="k"&gt;import&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="p"&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;BrowserRouter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Switch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Link&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-router-dom&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/login"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Login&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/reset"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Reset&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/dashboard"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Dashboard&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Switch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/login"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Login&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/reset"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;PasswordReset&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/dashboard"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Dashboard&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Home&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Switch&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Home&lt;/span&gt;&lt;span class="p"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Home&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Login&lt;/span&gt;&lt;span class="p"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Login&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PasswordReset&lt;/span&gt;&lt;span class="p"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Password Reset&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Dashboard&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have a very simple app with routing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Home page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/login&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Login page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/reset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Password reset page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/dashboard&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User dashboard, for logged in users only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1614094607%2Fpermanent%2Freact-router-basic.gif" 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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1614094607%2Fpermanent%2Freact-router-basic.gif" alt="React Router authentication"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is all the structure we need to start adding authentication.&lt;/p&gt;

&lt;h3&gt;
  
  
  Signup, login, and password reset with Userfront
&lt;/h3&gt;

&lt;p&gt;First, create a Userfront account at &lt;a href="https://userfront.com" rel="noopener noreferrer"&gt;https://userfront.com&lt;/a&gt;. This will give you a signup form, login form, and password reset form you can use for the next steps.&lt;/p&gt;

&lt;p&gt;In the Toolkit section of your Userfront dashboard, you can find the instructions for installing your signup form:&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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1614094834%2Fpermanent%2Finstructions-react.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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1614094834%2Fpermanent%2Finstructions-react.png" alt="Userfront installation instructions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow the instructions by installing the Userfront react package with:&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="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;userfront&lt;/span&gt;&lt;span class="sr"&gt;/react --sav&lt;/span&gt;&lt;span class="err"&gt;e
&lt;/span&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add the form to your home page by importing and initializing Userfront, and then updating the &lt;code&gt;Home()&lt;/code&gt; function to render the form.&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="c1"&gt;// src/App.js&lt;/span&gt;

&lt;span class="k"&gt;import&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="p"&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;BrowserRouter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Switch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Link&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-router-dom&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;Userfront&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;@userfront/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demo1234&lt;/span&gt;&lt;span class="dl"&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;SignupForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;toolId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nkmbbm&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&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;Router&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;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;nav&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;ul&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;li&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;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Home&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&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;/li&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="nx"&gt;li&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;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Login&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&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;/li&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="nx"&gt;li&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;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/reset&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Reset&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&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;/li&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="nx"&gt;li&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;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&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;/li&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;/ul&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;/nav&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="nx"&gt;Switch&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;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;"&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;Login&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="sr"&gt;/Route&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="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/reset&lt;/span&gt;&lt;span class="dl"&gt;"&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;PasswordReset&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="sr"&gt;/Route&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="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&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;Dashboard&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="sr"&gt;/Route&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="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&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;Home&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="sr"&gt;/Route&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;/Switch&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Router&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Home&lt;/span&gt;&lt;span class="p"&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;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Home&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&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="nx"&gt;SignupForm&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="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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Login&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Login&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PasswordReset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Password&lt;/span&gt; &lt;span class="nx"&gt;Reset&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the home page has your signup form. Try signing up a user:&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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1614095453%2Fpermanent%2Freact-router-signup.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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1614095453%2Fpermanent%2Freact-router-signup.png" alt="React signup form"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The form is in "Test mode" by default, which will create user records in a test environment you can view separately in your Userfront dashboard:&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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1612980797%2Fpermanent%2Fcreate-react-app-2.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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1612980797%2Fpermanent%2Fcreate-react-app-2.png" alt="Userfront test mode"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Continue by adding your login and password reset forms in the same way that you added your signup form:&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="c1"&gt;// src/App.js&lt;/span&gt;

&lt;span class="k"&gt;import&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="p"&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;BrowserRouter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Switch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Link&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-router-dom&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;Userfront&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;@userfront/react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demo1234&lt;/span&gt;&lt;span class="dl"&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;SignupForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;toolId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nkmbbm&lt;/span&gt;&lt;span class="dl"&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;LoginForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;toolId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;alnkkd&lt;/span&gt;&lt;span class="dl"&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;PasswordResetForm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;toolId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dkbmmo&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&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;Router&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;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;nav&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;ul&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;li&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;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Home&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&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;/li&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="nx"&gt;li&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;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Login&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&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;/li&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="nx"&gt;li&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;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/reset&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Reset&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&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;/li&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="nx"&gt;li&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;Link&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Link&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;/li&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;/ul&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;/nav&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="nx"&gt;Switch&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;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;"&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;Login&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="sr"&gt;/Route&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="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/reset&lt;/span&gt;&lt;span class="dl"&gt;"&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;PasswordReset&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="sr"&gt;/Route&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="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&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;Dashboard&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="sr"&gt;/Route&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="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&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;Home&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="sr"&gt;/Route&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;/Switch&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Router&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Home&lt;/span&gt;&lt;span class="p"&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;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Home&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&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="nx"&gt;SignupForm&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="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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Login&lt;/span&gt;&lt;span class="p"&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;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Login&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&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="nx"&gt;LoginForm&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="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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;PasswordReset&lt;/span&gt;&lt;span class="p"&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;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Password&lt;/span&gt; &lt;span class="nx"&gt;Reset&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&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="nx"&gt;PasswordResetForm&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="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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, your signup, login, and password reset should all be functional.&lt;/p&gt;

&lt;p&gt;Your users can sign up, log in, and reset their password.&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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1614095875%2Fpermanent%2Freact-router-3.gif" 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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1614095875%2Fpermanent%2Freact-router-3.gif" alt="React signup, login, password reset"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Protected route in React
&lt;/h2&gt;

&lt;p&gt;Usually, we don't want users to be able to view the dashboard unless they are logged in. This is known as protecting a route.&lt;/p&gt;

&lt;p&gt;Whenever a user is not logged in but tries to visit &lt;code&gt;/dashboard&lt;/code&gt;, we can redirect them to the login screen.&lt;/p&gt;

&lt;p&gt;We can accomplish this by updating the &lt;code&gt;Dashboard&lt;/code&gt; component in &lt;code&gt;src/App.js&lt;/code&gt; to handle the conditional logic.&lt;/p&gt;

&lt;p&gt;When a user is logged in with Userfront, they will have an access token available as &lt;code&gt;Userfront.accessToken()&lt;/code&gt;. We can check for this token to determine if the user is logged in.&lt;/p&gt;

&lt;p&gt;Add the &lt;code&gt;Redirect&lt;/code&gt; component to the &lt;code&gt;import&lt;/code&gt; statement for React Router, and then update the &lt;code&gt;Dashboard&lt;/code&gt; component to redirect if no access token is present.&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="c1"&gt;// src/App.js&lt;/span&gt;

&lt;span class="k"&gt;import&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="p"&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;BrowserRouter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Switch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Redirect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Be sure to add this import&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-router-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ...&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;renderFn&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// If the user is not logged in, redirect to login&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accessToken&lt;/span&gt;&lt;span class="p"&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;Redirect&lt;/span&gt;
          &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;
            &lt;span class="na"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;}}&lt;/span&gt;
        &lt;span class="sr"&gt;/&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="c1"&gt;// If the user is logged in, show the dashboard&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userData&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;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&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;h2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Dashboard&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h2&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="nx"&gt;pre&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;userData&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;/pre&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="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;logout&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;Logout&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&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="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;renderFn&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice also that we've added a logout button by calling &lt;code&gt;Userfront.logout()&lt;/code&gt; directly:&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;logout&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;Logout&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, when a user is logged in, they can view the dashboard. If the user is not logged in, they will be redirected to the login page.&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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1614104770%2Fpermanent%2Freact-router-4.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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1614104770%2Fpermanent%2Freact-router-4.png" alt="React protected route"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  React authentication with an API
&lt;/h2&gt;

&lt;p&gt;You will probably want to retrieve user-specific information from your backend. In order to protect these API endpoints, your server should check that incoming JWTs are valid.&lt;/p&gt;

&lt;p&gt;There are many libraries to read and verify JWTs across various languages; here are a few popular libraries for handling JWTs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/auth0/node-jsonwebtoken" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/jwt-dotnet/jwt" rel="noopener noreferrer"&gt;.NET&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/jpadilla/pyjwt/" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/auth0/java-jwt" rel="noopener noreferrer"&gt;Java&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For Userfront, the access token is available in your React application as &lt;code&gt;Userfront.accessToken()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Your React application can send this as a &lt;code&gt;Bearer&lt;/code&gt; token inside the &lt;code&gt;Authorization&lt;/code&gt; header. For example:&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="c1"&gt;// Example of calling an endpoint with a JWT&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getInfo&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/your-endpoint&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Userfront&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;getInfo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To handle a request like this, your backend should read the JWT from the &lt;code&gt;Authorization&lt;/code&gt; header and verify that it is valid using the public key found in your Userfront dashboard.&lt;/p&gt;

&lt;p&gt;Here is an example of Node.js middleware to read and verify the JWT:&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="c1"&gt;// Node.js example (Express.js)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jwt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jsonwebtoken&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;authenticateToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Read the JWT access token from the request header&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authHeader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;authorization&lt;/span&gt;&lt;span class="dl"&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;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;authHeader&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;authHeader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&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="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Return 401 if no token&lt;/span&gt;

  &lt;span class="c1"&gt;// Verify the token using the Userfront public key&lt;/span&gt;
  &lt;span class="nx"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;USERFRONT_PUBLIC_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;auth&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Return 403 if there is an error verifying&lt;/span&gt;
    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using this approach, any invalid or missing tokens would be rejected by your server. You can also reference the contents of the token later in the route handlers using the &lt;code&gt;req.auth&lt;/code&gt; object:&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// =&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tenantId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;demo1234&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;userUuid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ab53dbdc-bb1a-4d4d-9edf-683a6ca3f609&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;isConfirmed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;demo1234&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;tenantId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;demo1234&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Demo project&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;35d0bf4a-912c-4429-9886-cd65a4844a4f&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;iat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1614114057&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1616706057&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this information, you can perform further checks as desired, or use the &lt;code&gt;userId&lt;/code&gt; or &lt;code&gt;userUuid&lt;/code&gt; to look up user information to return.&lt;/p&gt;

&lt;p&gt;For example, if you wanted to limit a route to admin users, you could check against the &lt;code&gt;authorization&lt;/code&gt; object from the verified access token:&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="c1"&gt;// Node.js example (Express.js)&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users&lt;/span&gt;&lt;span class="dl"&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;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authorization&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;demo1234&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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="nx"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Allow access&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Deny access&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  React SSO (Single Sign On)
&lt;/h2&gt;

&lt;p&gt;From here, you can add social identity providers like Google, Facebook, and LinkedIn to your React application, or business identity providers like Azure AD, Office365, and more.&lt;/p&gt;

&lt;p&gt;You do this by creating an application with the identity provider (e.g. Google), and then adding that application's credentials to the Userfront dashboard. The result is a modified sign on experience:&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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1612378383%2Fpermanent%2Fuserfront-login.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%2Fres.cloudinary.com%2Fcomponent%2Fimage%2Fupload%2Fv1612378383%2Fpermanent%2Fuserfront-login.png" alt="React SSO form"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No additional code is needed to implement Single Sign On using this approach: you can add and remove providers without updating your forms or the way you handle JWTs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final notes
&lt;/h2&gt;

&lt;p&gt;Adding authentication and access control to your React application doesn't have to be a hassle. Both the setup step and, more importantly, the maintenance over time, are handled with modern platforms like &lt;a href="https://userfront.com" rel="noopener noreferrer"&gt;Userfront&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;JSON Web Tokens allow you to cleanly separate your auth token generation layer from the rest of your application, making it easier to reason about and more modular for future needs. This architecture also allows you to focus your efforts on your core application, where you are likely to create much more value for yourself or your clients.&lt;/p&gt;

&lt;p&gt;For more details on adding auth to your React application, visit the &lt;a href="https://userfront.com/guide" rel="noopener noreferrer"&gt;Userfront guide&lt;/a&gt;, which covers everything from setting up your auth forms to API documentation, example repositories, working with different languages and frameworks, and more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://userfront.com" rel="noopener noreferrer"&gt;Create a free Userfront project&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introspect navbar, Visualize hero | Module Monday 76</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Mon, 16 Mar 2020 22:34:16 +0000</pubDate>
      <link>https://dev.to/tyrw/introspect-navbar-visualize-hero-module-monday-76-2ak0</link>
      <guid>https://dev.to/tyrw/introspect-navbar-visualize-hero-module-monday-76-2ak0</guid>
      <description>&lt;h2&gt;
  
  
  Mods for any site
&lt;/h2&gt;

&lt;p&gt;Mods are open source and can be used on any website, web app, or anywhere else. There are hundreds more like these built &amp;amp; shared on &lt;a href="https://anymod.com"&gt;AnyMod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click a mod to see it along with its source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introspect navbar
&lt;/h2&gt;

&lt;p&gt;Easy-to-add responsive navbar that you can use and reuse.&lt;br&gt;
&lt;a href="https://anymod.com/mod/collapsible-nav-with-sidebar-alrrnn?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/collapsible-nav-with-sidebar-alrrnn?preview=true"&gt;&lt;br&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8Uo7WxjC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1584314830/navbar_uub4zo.gif" width="502" height="298"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Visualize hero section
&lt;/h2&gt;

&lt;p&gt;Gradient background intro section with links and image.&lt;br&gt;
&lt;a href="https://anymod.com/mod/hero-with-icons-ordbln?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/hero-with-icons-ordbln?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p0SbAoxb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1584314823/intro_pdm5ct.gif" width="424" height="298"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Twitter follow button
&lt;/h2&gt;

&lt;p&gt;The official Twitter follow button, but even easier to use.&lt;br&gt;
&lt;a href="https://anymod.com/mod/twitter-follow-button-mlbao?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/twitter-follow-button-mlbao?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1m8i6uS2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1553367423/twitter_ypxetw.png" width="266" height="35"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hugrid gallery
&lt;/h2&gt;

&lt;p&gt;A grid-based image gallery. Add to your site and upload your images easily.&lt;br&gt;
&lt;a href="https://anymod.com/mod/hugrid-grid-template-gallery-nkralm?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/hugrid-grid-template-gallery-nkralm?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aH2aEXcP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1571034450/grid-gallery_mzyqwp.png" width="500" height="403"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bokeh background
&lt;/h2&gt;

&lt;p&gt;Pre-styled card with swirling bokeh blobs.&lt;br&gt;
&lt;a href="https://anymod.com/mod/bokeh-modal-llbmrk?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/bokeh-modal-llbmrk?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cMFPvneL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1544816110/bokeh_nt7cqf.gif" width="490" height="374"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I post new mods from the community &lt;a href="https://dev.to/tyrw"&gt;here&lt;/a&gt; every (Module) Monday -- I hope you find them useful!&lt;/p&gt;

&lt;p&gt;Happy coding ✌️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>githunt</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Spectral intro, Solid state cards | Module Monday 75</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Tue, 03 Mar 2020 00:00:39 +0000</pubDate>
      <link>https://dev.to/tyrw/spectral-intro-solid-state-cards-module-monday-75-5d8f</link>
      <guid>https://dev.to/tyrw/spectral-intro-solid-state-cards-module-monday-75-5d8f</guid>
      <description>&lt;h2&gt;
  
  
  Open source modules
&lt;/h2&gt;

&lt;p&gt;Mods can be used on any website, web app, or anywhere else. There are hundreds more like these built &amp;amp; shared on &lt;a href="https://anymod.com"&gt;AnyMod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click a mod to see it along with its source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spectral intro
&lt;/h2&gt;

&lt;p&gt;Animated parallax intro section based on the Spectral theme.&lt;br&gt;
&lt;a href="https://anymod.com/mod/spectral-hero-intro-llorbo?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/spectral-hero-intro-llorbo?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---GHHvQB2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1583113349/intro_nsqvmd.gif" width="440" height="312"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Solid state cards
&lt;/h2&gt;

&lt;p&gt;Dark card section with calls to action and responsiveness built in.&lt;br&gt;
&lt;a href="https://anymod.com/mod/card-section-mlrnmo?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/card-section-mlrnmo?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xisjKB0V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1583113341/cards_wvq5h0.png" width="600" height="801"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Image underlay text
&lt;/h2&gt;

&lt;p&gt;Add a bold headline with any image underneath it.&lt;br&gt;
&lt;a href="https://anymod.com/mod/image-letter-text-mllrlr"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/image-letter-text-mllrlr"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pjo6VDYj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1583113341/underlay_ww27wx.png" width="500" height="153"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Map with marker
&lt;/h2&gt;

&lt;p&gt;Put your location on the map anywhere on your site in under 5 minutes.&lt;br&gt;
&lt;a href="https://anymod.com/mod/google-map-with-marker-moamb?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/google-map-with-marker-moamb?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qxvjh-Zt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1583113349/map_zanszk.gif" width="300" height="238"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prism form
&lt;/h2&gt;

&lt;p&gt;Work automatically with no backend required, and displays your other contact into too.&lt;br&gt;
&lt;a href="https://anymod.com/mod/elegant-contact-form-with-contact-details-llknoo"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/elegant-contact-form-with-contact-details-llknoo"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SzNRjDRW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1583113341/form_r8be82.png" width="500" height="288"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I post new mods from the community &lt;a href="https://dev.to/tyrw"&gt;here&lt;/a&gt; every (Module) Monday -- I hope you find them useful!&lt;/p&gt;

&lt;p&gt;Happy coding ✌️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>githunt</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Auto form, Phantom menu | Module Monday 74</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Mon, 24 Feb 2020 22:27:14 +0000</pubDate>
      <link>https://dev.to/tyrw/auto-form-phantom-menu-module-monday-74-25p</link>
      <guid>https://dev.to/tyrw/auto-form-phantom-menu-module-monday-74-25p</guid>
      <description>&lt;h2&gt;
  
  
  Open source mods
&lt;/h2&gt;

&lt;p&gt;Mods are modules that can be used on any website, web app, or anywhere else. There are hundreds more like these built &amp;amp; shared on &lt;a href="https://anymod.com"&gt;AnyMod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click a mod to see it along with its source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auto form
&lt;/h2&gt;

&lt;p&gt;Form with your contact information that works automatically. No backend required.&lt;br&gt;
&lt;a href="https://anymod.com/mod/form-with-footer-aldako?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/form-with-footer-aldako?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--siPPIoWw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1582519560/form_cdrfpd.gif" width="492" height="390"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Phantom menu
&lt;/h2&gt;

&lt;p&gt;Slide in menu based on the open source Phantom theme by Templated.&lt;br&gt;
&lt;a href="https://anymod.com/mod/menu-phantom-dknrro?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/menu-phantom-dknrro?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0NooOuQA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1582519560/menu_q4b4qd.gif" width="404" height="466"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature display
&lt;/h2&gt;

&lt;p&gt;Showcase product features with this pre-styled block.&lt;br&gt;
&lt;a href="https://anymod.com/mod/feature-section-raldor?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/feature-section-raldor?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t99JSU9z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1582519560/feature_qkhpfl.png" width="600" height="513"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Image cards
&lt;/h2&gt;

&lt;p&gt;Easy to use cards to quickly and professionally highlight your work.&lt;br&gt;
&lt;a href="https://anymod.com/mod/image-cards-with-call-to-action-llkoro?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/image-cards-with-call-to-action-llkoro?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OkhhpOir--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1582519560/card_yjck6t.png" width="555" height="576"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Simple headline
&lt;/h2&gt;

&lt;p&gt;A basic block of text that anyone on your team can edit without pushing code.&lt;br&gt;
&lt;a href="https://anymod.com/mod/simple-headline-nkolda?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/simple-headline-nkolda?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jp6242HK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1582519559/headline_bmmwem.png" width="429" height="169"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I post new mods from the community &lt;a href="https://dev.to/tyrw"&gt;here&lt;/a&gt; every (Module) Monday -- I hope you find them useful!&lt;/p&gt;

&lt;p&gt;Happy coding ✌️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>githunt</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Alternating spotlights, Team directory | Module Monday 73</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Mon, 17 Feb 2020 22:21:00 +0000</pubDate>
      <link>https://dev.to/tyrw/alternating-spotlights-team-directory-module-monday-73-4m9k</link>
      <guid>https://dev.to/tyrw/alternating-spotlights-team-directory-module-monday-73-4m9k</guid>
      <description>&lt;h2&gt;
  
  
  Open source mods
&lt;/h2&gt;

&lt;p&gt;You can use these mods (modules) on any website, web app, or anywhere else. There are hundreds more like these built &amp;amp; shared on &lt;a href="https://anymod.com"&gt;AnyMod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click a mod to see it along with its source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternating spotlights
&lt;/h2&gt;

&lt;p&gt;Spotlight content sections with responsiveness built in.&lt;br&gt;
&lt;a href="https://anymod.com/mod/alternating-sections-aldbdr?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/alternating-sections-aldbdr?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZYKkQwFo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1581891988/spotlight_ewgvhu.gif" width="450" height="312"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Team directory
&lt;/h2&gt;

&lt;p&gt;Keep your team page up to date without pushing new code every time.&lt;br&gt;
&lt;a href="https://anymod.com/mod/team-directory-orlook?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/team-directory-orlook?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DbVONf2E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1581891983/team_vknbvz.gif" width="476" height="288"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fade in intro
&lt;/h2&gt;

&lt;p&gt;Text and button fade followed by background.&lt;br&gt;
&lt;a href="https://anymod.com/mod/hero-w-background-ordoor?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/hero-w-background-ordoor?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s2Gu08mQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1581891985/hero_jto5jq.gif" width="464" height="292"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Live countdown
&lt;/h2&gt;

&lt;p&gt;Add your date for an instant countdown.&lt;br&gt;
&lt;a href="https://anymod.com/mod/simple-configurable-countdown-dknrlo"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/simple-configurable-countdown-dknrlo"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jIFK_Tas--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1581891980/countdown_uhncay.gif" width="294" height="100"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Icon cards
&lt;/h2&gt;

&lt;p&gt;Showcase your value propositions with simple icons.&lt;br&gt;
&lt;a href="https://anymod.com/mod/icon-cards-mladbl"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/icon-cards-mladbl"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fTQ4Bbqv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1581891980/icon-cards-png_iykbbi.png" width="600" height="396"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I post new mods from the community &lt;a href="https://dev.to/tyrw"&gt;here&lt;/a&gt; every (Module) Monday -- I hope you find them useful!&lt;/p&gt;

&lt;p&gt;Happy coding ✌️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>githunt</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Animated blocks, Swipeable gallery | Module Monday 72</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Mon, 10 Feb 2020 23:39:24 +0000</pubDate>
      <link>https://dev.to/tyrw/animated-blocks-swipeable-gallery-module-monday-72-30h3</link>
      <guid>https://dev.to/tyrw/animated-blocks-swipeable-gallery-module-monday-72-30h3</guid>
      <description>&lt;h2&gt;
  
  
  Open source modules
&lt;/h2&gt;

&lt;p&gt;Mods are modules that can be used on any website, web app, or anywhere else. There are hundreds more like these built &amp;amp; shared on &lt;a href="https://anymod.com"&gt;AnyMod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click a mod to see it along with its source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Animated block cards
&lt;/h2&gt;

&lt;p&gt;Full width cards that fade into focus when scrolled.&lt;br&gt;
&lt;a href="https://anymod.com/mod/animated-block-cards-aldadd?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/animated-block-cards-aldadd?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VTjXMzTE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1581313464/cards_zjakjy.gif" width="520" height="354"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Swipeable gallery
&lt;/h2&gt;

&lt;p&gt;Image gallery that works great on desktop or mobile.&lt;br&gt;
&lt;a href="https://anymod.com/mod/flickity-gallery-orrrrn?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/flickity-gallery-orrrrn?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VhSBWLVn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1581313466/flickity_ttzz3k.gif" width="372" height="434"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Spatial hero
&lt;/h2&gt;

&lt;p&gt;Themed intro section with prominent call to action button.&lt;br&gt;
&lt;a href="https://anymod.com/mod/hero-with-cta-raollr?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/hero-with-cta-raollr?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fw2xyz8S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1581313460/cta_gooxq0.png" width="600" height="398"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dual section highlights
&lt;/h2&gt;

&lt;p&gt;Show off 2 cards and 2 actions.&lt;br&gt;
&lt;a href="https://anymod.com/mod/dual-section-images-mlarml?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/dual-section-images-mlarml?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0hAoVzRY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1581313459/dual_fwqccg.png" width="600" height="502"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dismissable message
&lt;/h2&gt;

&lt;p&gt;Based on Bulma, this message does exactly what you want: gets out of the way once read.&lt;br&gt;
&lt;a href="https://anymod.com/mod/dismissable-message-raaakd?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/dismissable-message-raaakd?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---cUZm3Nl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1581313458/dismissable_ymzoq8.gif" width="448" height="508"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I post new mods from the community &lt;a href="https://dev.to/tyrw"&gt;here&lt;/a&gt; every (Module) Monday -- I hope you find them useful!&lt;/p&gt;

&lt;p&gt;Happy coding ✌️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>githunt</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Colorful main section, Fade in animation | Module Monday 71</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Mon, 27 Jan 2020 22:20:26 +0000</pubDate>
      <link>https://dev.to/tyrw/colorful-main-section-fade-in-animation-module-monday-71-1had</link>
      <guid>https://dev.to/tyrw/colorful-main-section-fade-in-animation-module-monday-71-1had</guid>
      <description>&lt;h2&gt;
  
  
  Open source mods
&lt;/h2&gt;

&lt;p&gt;Mods are modules that can be used on any website, web app, or anywhere else. There are hundreds more like these built &amp;amp; shared on &lt;a href="https://anymod.com"&gt;AnyMod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click a mod to see it along with its source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phantom main
&lt;/h2&gt;

&lt;p&gt;A main content section based on the Phantom theme.&lt;br&gt;
&lt;a href="https://anymod.com/mod/phantom-main-mlrnnm?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/phantom-main-mlrnnm?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hFMT9NHy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1580100548/phantom_bk0caa.gif" width="410" height="462"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fade in hero section
&lt;/h2&gt;

&lt;p&gt;Fades and translates into place when the page loads.&lt;br&gt;
&lt;a href="https://anymod.com/mod/story-hero-mlrbad?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/story-hero-mlrbad?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B68Wh3tM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1580100546/story-hero_jzemw0.gif" width="486" height="274"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Overlay traveler
&lt;/h2&gt;

&lt;p&gt;A circular overlay that elegantly moves out of the way when closed.&lt;br&gt;
&lt;a href="https://anymod.com/mod/masonry-gallery-with-collapsible-call-to-action-overlay-barnrn?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/masonry-gallery-with-collapsible-call-to-action-overlay-barnrn?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8g9hqqUB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1562985793/header_hgrore.gif" width="484" height="370"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fractal theme footer
&lt;/h2&gt;

&lt;p&gt;A subtle reusable footer based on the Fractal theme.&lt;br&gt;
&lt;a href="https://anymod.com/mod/fractal-footer-ballmr?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/fractal-footer-ballmr?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S3DkOX5Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1580100541/footer_oigwxf.png" width="600" height="174"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Responsive call to action (CTA)
&lt;/h2&gt;

&lt;p&gt;Image underlay with buttons that look great at any angle.&lt;br&gt;
&lt;a href="https://anymod.com/mod/cta-call-to-action-raldrd"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/cta-call-to-action-raldrd"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WWMIfvLG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1580100549/cta_pveceb.gif" width="512" height="158"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I post new mods from the community &lt;a href="https://dev.to/tyrw"&gt;here&lt;/a&gt; every (Module) Monday -- I hope you find them useful!&lt;/p&gt;

&lt;p&gt;Happy coding ✌️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>githunt</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Reusable navbar, Animated headline | Module Monday 70</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Mon, 20 Jan 2020 22:47:20 +0000</pubDate>
      <link>https://dev.to/tyrw/reusable-navbar-animated-headline-module-monday-70-4pjm</link>
      <guid>https://dev.to/tyrw/reusable-navbar-animated-headline-module-monday-70-4pjm</guid>
      <description>&lt;h2&gt;
  
  
  Open source modules
&lt;/h2&gt;

&lt;p&gt;Mods can be used on any website, web app, or anywhere else. There are hundreds more like these built &amp;amp; shared on &lt;a href="https://anymod.com"&gt;AnyMod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click a mod to see it along with its source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reusable nav
&lt;/h2&gt;

&lt;p&gt;Navbar for all widths that's easy to clone and reuse.&lt;br&gt;
&lt;a href="https://anymod.com/mod/top-menu-aldnkb?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/top-menu-aldnkb?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S0UlcifL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1579463051/navbar_c6ezew.gif" width="490" height="292"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Details section
&lt;/h2&gt;

&lt;p&gt;Pre-styled content section for informing your visitors.&lt;br&gt;
&lt;a href="https://anymod.com/mod/details-section-with-icons-mlroal?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/details-section-with-icons-mlroal?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3HvcdCJ4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1579459473/details_vrmpdx.png" width="600" height="318"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Animated header
&lt;/h2&gt;

&lt;p&gt;Preset animation -- just add content.&lt;br&gt;
&lt;a href="https://anymod.com/mod/headline-section-ralbmd?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/headline-section-ralbmd?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9hCw0oXD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1579463058/headline_zkkcvs.gif" width="518" height="222"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Colorful gallery
&lt;/h2&gt;

&lt;p&gt;Showcase project sections or a portfolio.&lt;br&gt;
&lt;a href="https://anymod.com/mod/colors-sections-dkdmmd?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/colors-sections-dkdmmd?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jqs3DyoT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1564793728/colors_uprohk.gif" width="400" height="384"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Timeline carousel
&lt;/h2&gt;

&lt;p&gt;Add events to a timeline with this slick slider.&lt;br&gt;
&lt;a href="https://anymod.com/mod/slider-timeline-barrkl?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/slider-timeline-barrkl?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_y4S6lZt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1561169392/screenshots/timeline.gif" width="358" height="216"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I post new mods from the community &lt;a href="https://dev.to/tyrw"&gt;here&lt;/a&gt; every (Module) Monday -- I hope you find them useful!&lt;/p&gt;

&lt;p&gt;Happy coding ✌️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>githunt</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Contact form, Portfolio gallery, Prism intro | Module Monday 69</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Mon, 13 Jan 2020 22:28:16 +0000</pubDate>
      <link>https://dev.to/tyrw/contact-form-portfolio-gallery-prism-intro-module-monday-69-3151</link>
      <guid>https://dev.to/tyrw/contact-form-portfolio-gallery-prism-intro-module-monday-69-3151</guid>
      <description>&lt;h2&gt;
  
  
  Open source modules
&lt;/h2&gt;

&lt;p&gt;Mods can be used on any website, web app, or anywhere else. There are hundreds more like these built &amp;amp; shared on &lt;a href="https://anymod.com"&gt;AnyMod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click a mod to see it along with its source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contact form
&lt;/h2&gt;

&lt;p&gt;Embed a contact form anywhere that will email you automatically.&lt;br&gt;
&lt;a href="https://anymod.com/mod/contact-form-barodo?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/contact-form-barodo?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9luI04nk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1578954206/contact-form_elykbp.gif" width="488" height="404"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Portfolio gallery
&lt;/h2&gt;

&lt;p&gt;Showcase your portfolio of work with hover images and links.&lt;br&gt;
&lt;a href="https://anymod.com/mod/portfolio-gallery-llknan?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/portfolio-gallery-llknan?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dVUQhCz1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1578954210/gallery_wtbf1c.gif" width="436" height="394"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prism hero banner
&lt;/h2&gt;

&lt;p&gt;A pre-styled page header based on the Prism theme.&lt;br&gt;
&lt;a href="https://anymod.com/mod/responsive-hero-banner-alrork?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/responsive-hero-banner-alrork?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7M6r9lhm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1578708150/banner_frd8cv.png" width="600" height="240"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Spatial side navbar
&lt;/h2&gt;

&lt;p&gt;Slide out menu to reuse across pages and projects.&lt;br&gt;
&lt;a href="https://anymod.com/mod/spatial-navbar-nkorra?preview=true&amp;amp;dark=true&amp;amp;w=375"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/spatial-navbar-nkorra?preview=true&amp;amp;dark=true&amp;amp;w=375"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KPwuZFj7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1578954206/sidenav_rjlab1.gif" width="422" height="420"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Call to Action button
&lt;/h2&gt;

&lt;p&gt;A nicely styled button to help drive user actions.&lt;br&gt;
&lt;a href="https://anymod.com/mod/cta-button-kdnmrn"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/cta-button-kdnmrn"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tU_zae2S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1578708149/cta-button_i6ruev.png" width="642" height="290"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I post new mods from the community &lt;a href="https://dev.to/tyrw"&gt;here&lt;/a&gt; every (Module) Monday -- I hope you find them useful!&lt;/p&gt;

&lt;p&gt;Happy coding ✌️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>githunt</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Scrollspy, Alternate cards, Learn more | Module Monday 68</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Mon, 06 Jan 2020 21:56:52 +0000</pubDate>
      <link>https://dev.to/tyrw/scrollspy-alternate-cards-learn-more-module-monday-68-feg</link>
      <guid>https://dev.to/tyrw/scrollspy-alternate-cards-learn-more-module-monday-68-feg</guid>
      <description>&lt;h2&gt;
  
  
  Open source modules
&lt;/h2&gt;

&lt;p&gt;Mods can be used on any website, web app, or anywhere else. There are hundreds more like these built &amp;amp; shared on &lt;a href="https://anymod.com"&gt;AnyMod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click a mod to see it along with its source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scrollspy
&lt;/h2&gt;

&lt;p&gt;These header links automatically highlight when you scroll or click.&lt;br&gt;
&lt;a href="https://anymod.com/mod/scrollspy-mlrnam?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/scrollspy-mlrnam?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--peg_h4V2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1578284406/scrollspy_yvzpir.gif" width="376" height="344"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternating content sections
&lt;/h2&gt;

&lt;p&gt;Add content that automatically alternates for a professional looks.&lt;br&gt;
&lt;a href="https://anymod.com/mod/responsive-alternating-sections-mladdl?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/responsive-alternating-sections-mladdl?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eHF1Xp0h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1578284398/alternating_gdejc0.png" width="720" height="821"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Animated button
&lt;/h2&gt;

&lt;p&gt;Expands on hover for a nice effect.&lt;br&gt;
&lt;a href="https://anymod.com/mod/learn-more-button-bamrnn?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/learn-more-button-bamrnn?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MfsKE0Uu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1554610901/learn-more_fbigrl.gif" width="250" height="117"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hover cards
&lt;/h2&gt;

&lt;p&gt;Slight zoom when you hover over these card image links.&lt;br&gt;
&lt;a href="https://anymod.com/mod/dark-cards-with-header-mlamoa?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/dark-cards-with-header-mlamoa?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jQKqnSbA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1578284399/dark-cards_xdgcug.gif" width="376" height="310"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dark footer
&lt;/h2&gt;

&lt;p&gt;Reuseable footer with social linmks.&lt;br&gt;
&lt;a href="https://anymod.com/mod/dark-footer-with-social-links-dkdobk"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/dark-footer-with-social-links-dkdobk"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aLxvTvpz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1578284398/dark-footer_viproa.png" width="500" height="119"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I post new mods from the community &lt;a href="https://dev.to/tyrw"&gt;here&lt;/a&gt; every (Module) Monday -- I hope you find them useful!&lt;/p&gt;

&lt;p&gt;Happy coding ✌️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>githunt</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Hyperspace form, Icon features | Module Monday 67</title>
      <dc:creator>Tyler Warnock</dc:creator>
      <pubDate>Mon, 16 Dec 2019 21:47:27 +0000</pubDate>
      <link>https://dev.to/tyrw/hyperspace-form-icon-features-module-monday-67-3cka</link>
      <guid>https://dev.to/tyrw/hyperspace-form-icon-features-module-monday-67-3cka</guid>
      <description>&lt;h2&gt;
  
  
  Easy to add modules (mods)
&lt;/h2&gt;

&lt;p&gt;Mods can be used on any website, web app, or anywhere else. There are hundreds more like these built &amp;amp; shared on &lt;a href="https://anymod.com"&gt;AnyMod&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click a mod to see it along with its source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hyperspace form
&lt;/h2&gt;

&lt;p&gt;Bold contact form based on the Hyperspace theme from Templated.&lt;br&gt;
&lt;a href="https://anymod.com/mod/hyperspace-form-mlrnrm?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/hyperspace-form-mlrnrm?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p7EC0hFE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1576480923/form_zx1zyf.gif" width="546" height="414"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature grid with icons
&lt;/h2&gt;

&lt;p&gt;Space to list info about your project. Pre-styled and responsive.&lt;br&gt;
&lt;a href="https://anymod.com/mod/icon-sections-baldkd?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/icon-sections-baldkd?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oKLn0fkb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1576480923/icons_kb3luz.png" width="600" height="592"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Story gallery
&lt;/h2&gt;

&lt;p&gt;Scrolling image carousel with overlay links.&lt;br&gt;
&lt;a href="https://anymod.com/mod/gallery-llobnm?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/gallery-llobnm?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--im6f7NTD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://res.cloudinary.com/component/image/upload/v1576480930/gallery_kfm26u.gif" width="414" height="222"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Content circles
&lt;/h2&gt;

&lt;p&gt;Informative section with circular images.&lt;br&gt;
&lt;a href="https://anymod.com/mod/content-circles-kdnmkn?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/content-circles-kdnmkn?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7I6ufm3g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1564187907/circles_y95jc8.png" width="600" height="373"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Simple announcement
&lt;/h2&gt;

&lt;p&gt;Basic editable banner with subtle icons.&lt;br&gt;
&lt;a href="https://anymod.com/mod/announcement-raloro?preview=true"&gt;View mod&lt;/a&gt;&lt;br&gt;
&lt;a href="https://anymod.com/mod/announcement-raloro?preview=true"&gt;&lt;br&gt;
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HegOj_N8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/component/image/upload/v1576480913/announcement_jogeqb.png" width="500" height="317"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I post new mods from the community &lt;a href="https://dev.to/tyrw"&gt;here&lt;/a&gt; every (Module) Monday -- I hope you find them useful!&lt;/p&gt;

&lt;p&gt;Happy coding ✌️&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>githunt</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
