<?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: Alex Lakatos 🥑</title>
    <description>The latest articles on DEV Community by Alex Lakatos 🥑 (@lakatos88).</description>
    <link>https://dev.to/lakatos88</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%2F107170%2F1e007e6d-44dc-4405-8707-1a24416de864.png</url>
      <title>DEV Community: Alex Lakatos 🥑</title>
      <link>https://dev.to/lakatos88</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lakatos88"/>
    <language>en</language>
    <item>
      <title>Releasing the funniest GitHub Action &amp; Workflow</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Thu, 09 Dec 2021 00:58:03 +0000</pubDate>
      <link>https://dev.to/lakatos88/releasing-the-funniest-github-action-workflow-2o</link>
      <guid>https://dev.to/lakatos88/releasing-the-funniest-github-action-workflow-2o</guid>
      <description>&lt;p&gt;I happen to maintain one of the popular Hacktoberfest repositories. It's &lt;a href="https://dev.to/lakatos88/the-easiest-way-to-make-a-valid-hacktoberfest-contribution-without-spamming-3fgc"&gt;the easiest way to make a valid Hacktoberfest Contribution (without spamming)&lt;/a&gt;. To put it into context, it got more PRs during the first 24 hours of Hacktoberfest than it got the rest of the year. &lt;/p&gt;

&lt;p&gt;And I'm extremely grateful for that! It's a repository of the most cringe-worthy computer puns on the internet. I take all the help I can to gather them. &lt;a href="https://twitter.com/tomzaragoza/status/1443962345382875144" rel="noopener noreferrer"&gt;Someone on Twitter&lt;/a&gt; gave me the idea, I had way too much time on my hands, so now you can &lt;a href="https://github.com/marketplace/actions/puns-dev" rel="noopener noreferrer"&gt;add a GitHub Action&lt;/a&gt; to your Workflows that outputs a pun and punchline.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/AlexLakatos" rel="noopener noreferrer"&gt;
        AlexLakatos
      &lt;/a&gt; / &lt;a href="https://github.com/AlexLakatos/puns-dev-action" rel="noopener noreferrer"&gt;
        puns-dev-action
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GitHub Action from pus.dev
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;puns.dev Action&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;This action prints a random pun from a hand-picked selection of the worst computer puns on the Internet, really cringe-worthy stuff.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Outputs&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;code&gt;pun&lt;/code&gt;&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The random pun.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;code&gt;punchline&lt;/code&gt;&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The corresponding punchline.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Example usage&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;uses: actions/puns-dev-action@v1.3&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AlexLakatos/puns-dev-action" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h3&gt;
  
  
  What about the Workflow?
&lt;/h3&gt;

&lt;p&gt;The action usage is a one-liner, I tried to make it as painless to use as I can, for such a small action.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;uses: AlexLakatos/puns-dev-action@v1.3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The action returns text, so the workflow possibilities are quite literally endless. It works really well with other GitHub related actions. My favourite combination, and the one I use on &lt;a href="https://github.com/AlexLakatos/ascii-themes/blob/master/.github/workflows/pr-comment.yml" rel="noopener noreferrer"&gt;my side projects&lt;/a&gt; and &lt;a href="https://github.com/AlexLakatos/computer-puns/blob/main/.github/workflows/thanks.yml" rel="noopener noreferrer"&gt;the original repository&lt;/a&gt;, is to add a comment to each new PR, thanking people for contributing, and giving them a pun in return.&lt;/p&gt;

&lt;h3&gt;
  
  
  Submission Category?
&lt;/h3&gt;

&lt;p&gt;While I can make a definite case this workflow is one of the "Maintainer Must-Haves", I'm not sure everyone would agree 😅. It definitely is one of the Wacky Wildcards.&lt;/p&gt;

&lt;h3&gt;
  
  
  Yaml File
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PR Puns&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request_target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;opened&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;punny&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Reward PRs with a random pun&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AlexLakatos/puns-dev-action@v1.3&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pun&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;allthatjazzleo/actions-pull-request-add-comment@v1&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
        &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;Thank you for submitting a PR! Here's a pun, while you wait for us to review your PR.&lt;/span&gt;

          &lt;span class="s"&gt;${{ steps.pun.outputs.pun }}&lt;/span&gt;
          &lt;span class="s"&gt;${{ steps.pun.outputs.punchline }}    &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>actionshackathon21</category>
      <category>github</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Don’t be THAT guy</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Fri, 28 May 2021 13:51:39 +0000</pubDate>
      <link>https://dev.to/lakatos88/don-t-be-that-guy-3j39</link>
      <guid>https://dev.to/lakatos88/don-t-be-that-guy-3j39</guid>
      <description>&lt;p&gt;A little while ago, &lt;a href="https://twitter.com/whitep4nth3r/status/1395304339229581312" rel="noopener noreferrer"&gt;whitep4nth3r reached out on Twitter&lt;/a&gt; asking for support from men for a better future. I didn’t know why, but I signed up head first, because who wouldn’t want a better future?&lt;/p&gt;

&lt;p&gt;I didn’t know what sparked the plea, but I could have guessed. Men being assholes, live on stream. I was watching her stream again today, when “THAT guy” striked again. Somehow, a dude thought it would be acceptable to compliment someone based on looks. I was stunned. My first response was eaten away by the obscenity filter in the chat.&lt;/p&gt;

&lt;p&gt;I hate the fact that I live in a world where this needs to be said. And we’re all part of the problem! Because we don’t say it often enough - “Don’t be THAT fucking guy!”.&lt;/p&gt;

&lt;p&gt;You know exactly what I’m talking about.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1274679283567546370-914" src="https://platform.twitter.com/embed/Tweet.html?id=1274679283567546370"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1274679283567546370-914');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1274679283567546370&amp;amp;theme=dark"
  }



 &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;THAT guy that’s going to “slide into your DMs”. Social media networks are not dating apps! If there were no dating apps left in this world, it still wouldn’t be OK to make unwanted advances in there. Or send dick pics. Tech isn’t there to enable you to be a bigger sleazeball.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1390312174866735114-75" src="https://platform.twitter.com/embed/Tweet.html?id=1390312174866735114"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1390312174866735114-75');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1390312174866735114&amp;amp;theme=dark"
  }



 &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;THAT “I’m not a racist” guy. The moment you spew some shit and then try to defend it with “I’m not a racist”, you are. Just don’t spew that shit. Forget about making excuses. No excuses are needed if you really weren’t making a racist comment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1390300774228443141-33" src="https://platform.twitter.com/embed/Tweet.html?id=1390300774228443141"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1390300774228443141-33');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1390300774228443141&amp;amp;theme=dark"
  }



 &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;THAT guy that thinks only other dudes can code. I swear everyone has this thing called a brain. And I’m 100% sure brainpower is in no way connected to gender. Programming uses your brain but is also not a skill that in any way relates to gender. So why would you keep on assuming only other “dudes” can code better than neanderthals like you?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The list goes on, and there are so many instances of “THAT guy”. The post is triggering enough as it is. It burns my soul to write about all the shitty things “dudes” online do because they hide behind anonymity. Let’s all agree right here and now that if you wouldn’t say it in person, in front of a room full of people, just don’t say it online. FFS!&lt;/p&gt;

&lt;p&gt;There is absolutely no context, online or not, where it’s OK to be abusive, misogynistic, racist or in any other way disrespectful to another human being! No, not even if it’s “a joke”. Seriously!&lt;/p&gt;

&lt;p&gt;And even if you’ve read all this and think to yourself: “I wasn’t any of those guys”. Were you actually respectful? I know I’m not always respectful. So I pledge to do better, right here, right now! How about you?&lt;/p&gt;

&lt;p&gt;We’ve all seen “THAT guy” regularly, you might even know that guy, but we somehow convince ourselves to not say anything. Because it’s uncomfortable. Or because we’ve convinced ourselves that it doesn’t really affect us. But it affects “someone”. It affects someone quite a lot! If you saw anyone being treated this way on the street next to you, you’d speak up, right? So why is it OK if it happens online? If the past year taught us anything, it’s that more and more of our life happens online.&lt;/p&gt;

&lt;p&gt;Let’s all treat online with the same standards, especially when it comes to harassment, bullying and discrimination. I understand confrontation is hard. But reporting or education work just as well as confrontation.&lt;/p&gt;

&lt;p&gt;If you’re “THAT guy”, but somehow you didn’t want to take my word for it, check out &lt;a href="https://unbreak.tech/" rel="noopener noreferrer"&gt;https://unbreak.tech/&lt;/a&gt;. There’s a lot of other people that would like to have a word with you!&lt;/p&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>How to Build a Card-Linked Application With Node.js, React and the Fidel Web SDK</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Mon, 24 May 2021 13:08:50 +0000</pubDate>
      <link>https://dev.to/fidel/how-to-build-a-card-linked-application-with-node-js-react-and-the-fidel-web-sdk-31bf</link>
      <guid>https://dev.to/fidel/how-to-build-a-card-linked-application-with-node-js-react-and-the-fidel-web-sdk-31bf</guid>
      <description>&lt;p&gt;&lt;a href="https://fidel.uk/" rel="noopener noreferrer"&gt;Fidel&lt;/a&gt; makes it simple to add card-linking capabilities to any application. The process involves setting up a program, along with the participating brands and locations. And then registering or helping your users register their cards on the Fidel platform. Once they are live, Fidel receives transactions from participating locations and will pass them along to your application using webhooks. You can register your webhook URLs in the Fidel Dashboard and start receiving the transaction data.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are We Building?
&lt;/h2&gt;

&lt;p&gt;There are two main steps in the process, and this tutorial is going to walk you through building an application with a card-linking feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking.png" title="Card-Linked Application Demo" alt="Card-Linked Application Demo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first requirement is to register user cards on the Fidel platform. Fidel provides SDKs to use within your applications to help you register cards simply and securely. This tutorial will show you how to use the Fidel Web SDK in a React application to register cards. &lt;/p&gt;

&lt;p&gt;The second part of the card-linking process is the flow of transaction data from participating locations whenever a user makes a purchase with a registered card. For delivering the flow of transactions to your application, the Fidel platform uses webhooks. This tutorial is going to walk you through setting up a Node.js server that listens for transaction data, register it with the Fidel platform using ngrok, and start receiving transactions. You'll also use the server to send the transactions to the React client after receiving them, so you can display them in the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you begin, make sure you've got a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;a href="https://dashboard.fidel.uk/sign-in" rel="noopener noreferrer"&gt;Fidel Account&lt;/a&gt;. You can create one via the &lt;a href="https://dashboard.fidel.uk/sign-up" rel="noopener noreferrer"&gt;Fidel Dashboard&lt;/a&gt; if you don't already have one!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org/download/release/latest-v12.x/" rel="noopener noreferrer"&gt;Node.js v12.22.1&lt;/a&gt; or higher installed.&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://dashboard.ngrok.com/signup" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; account.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ngrok.com/download" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; installed and set up.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Build the Client Application to Link Cards
&lt;/h2&gt;

&lt;p&gt;You'll first build a React client to use the Fidel Web SDK and give your application the ability to link cards to your Fidel program.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create React Application
&lt;/h3&gt;

&lt;p&gt;Let's go ahead and create a new React application using &lt;code&gt;create-react-app&lt;/code&gt;. After you've generated a new project called &lt;code&gt;fidel-card-linking-tutorial&lt;/code&gt;, run it using the generated &lt;code&gt;npm start&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npx create-react-app fidel-card-linking-tutorial
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;fidel-card-linking-tutorial
&lt;span class="nv"&gt;$ &lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should have a blank new React application running in your browser on port 3000. The generated files should look similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── README.md
├── package.json
├── node_modules
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   ├── manifest.json
│   └── robots.txt
├── src
│   ├── App.css
│   ├── App.js
│   ├── App.test.js
│   ├── index.css
│   ├── index.js
│   ├── logo.svg
│   ├── reportWebVitals.js
│   └── setupTests.js
└── yarn.lock

2 directories, 17 files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Tailwind CSS
&lt;/h3&gt;

&lt;p&gt;You'll want to create a nice-looking application, and for that, a CSS framework is probably the simplest to use option. Let's go ahead and add &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;TailwindCSS&lt;/a&gt; to the empty React application. Add a line in the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; section of the &lt;code&gt;/public/index.html&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css"&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Empty Layout
&lt;/h3&gt;

&lt;p&gt;After you've included Tailwind into the empty project, let's remove the boilerplate code in the &lt;code&gt;/src/App.js&lt;/code&gt; file and replace it with an empty application shell. It's already set up to have a header and a table to display the transaction data you'll get from Fidel.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ReactComponent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Logo&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;./assets/logo.svg&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;App&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;headers&lt;/span&gt; &lt;span class="o"&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;Amount&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;Cashback&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;Scheme&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;Card&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;Brand&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;Location&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;Status&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;Date↓&lt;/span&gt;&lt;span class="dl"&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="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"App h-full"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h-full overflow-x-hidden"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-white shadow"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex flex-col container mx-auto md:flex-row md:items-center md:justify-between"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-between items-center"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-between items-center"&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;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://fidel.uk/docs"&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"w-full"&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;Logo&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;90px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;60px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&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="nt"&gt;a&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;button&lt;/span&gt;
                  &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"ml-10 w-full bg-blue-700 hover:bg-blue-900 text-white py-2 px-4 rounded"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  Add Card
                  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&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;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;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"md:flex flex-col md:flex-row md:-mx-4"&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;a&lt;/span&gt;
                &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://fidel.uk/docs/web-sdk"&lt;/span&gt;
                &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"my-1 hover:text-gray-800 text-blue-700 md:mx-4 md:my-0"&lt;/span&gt;
              &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                Documentation ↗
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&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;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;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 py-8"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex justify-between container mx-auto"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"w-full"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center justify-between"&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;h1&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xl text-gray-700 md:text-2xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  Transactions
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&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;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"-my-2 py-2 overflow-x-auto sm:-mx-6 sm:px-6 py-2 lg:-mx-8 pr-10 lg:px-8"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"align-middle"&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;table&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"min-w-full"&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;thead&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;tr&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;th&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 py-3 text-left text-gray-400 font-light text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;th&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;tr&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;thead&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;tbody&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-white"&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;tbody&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;table&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;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;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;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;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;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;div&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Logo Components
&lt;/h3&gt;

&lt;p&gt;You've probably noticed your application is failing to compile now. And that's because you haven't yet added the logo component that's being used in the empty application shell above. To do that, create a new &lt;code&gt;assets&lt;/code&gt; folder inside the &lt;code&gt;/src&lt;/code&gt; directory, and create an empty &lt;code&gt;logo.svg&lt;/code&gt; file. Now&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;src/assets
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/assets/logo.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your application is still going to fail to compile, but with a new error. And that's because the empty SVG file should actually be a valid SVG. Replace the contents of &lt;code&gt;/src/assets/logo.svg&lt;/code&gt; with the Fidel logo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;"1.1"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"Layer_1"&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/svg"&lt;/span&gt; &lt;span class="na"&gt;xmlns:xlink=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/1999/xlink"&lt;/span&gt; &lt;span class="na"&gt;x=&lt;/span&gt;&lt;span class="s"&gt;"0px"&lt;/span&gt; &lt;span class="na"&gt;y=&lt;/span&gt;&lt;span class="s"&gt;"0px"&lt;/span&gt;
   &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"802px"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"407.6px"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 802 407.6"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"enable-background:new 0 0 802 407.6;"&lt;/span&gt; &lt;span class="na"&gt;xml:space=&lt;/span&gt;&lt;span class="s"&gt;"preserve"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;style &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;g&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;g&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"st0"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M101.3,286.7h45v-65.3h30.8l17.9-36.2h-48.7v-27.5H195v-36.2h-93.7V286.7z M231.7,286.7h45.5V121.5h-45.5
      V286.7z M422.7,141.4c-7.8-6.7-17.1-11.8-27.7-15.2c-10.6-3.4-22.1-5.2-34-5.2h-42.9v165.7H361c14.8,0,27.9-2.2,38.9-6.6
      c10.9-4.3,20-10.4,27.1-17.9c7.1-7.6,12.4-16.5,15.9-26.6c3.5-10.3,5.3-21.3,5.3-32.9c0-13.6-2.3-25.7-6.9-35.9
      C436.7,156.5,430.4,148,422.7,141.4z M392.9,236.9c-6.9,7.9-16.9,11.9-29.7,11.9h-3.6v-90h3.6c26.2,0,40,15.6,40,45.1
      C403.2,218,399.7,229.1,392.9,236.9z M482.3,286.7H576v-37.9h-48.7v-27.4H576v-36.2h-48.7v-27.5H576v-36.2h-93.7V286.7z
       M660.9,248.8V121.5h-44.9v165.2h84.8v-37.9H660.9z"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/g&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/g&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add the Fidel Web SDK
&lt;/h2&gt;

&lt;p&gt;Now that your application compiles successfully, you'll see an empty table layout with a button above that prompts you to "Add Card". At this stage, the button doesn't do anything, so you'll need to add that capability to the React application. This is where the Fidel Web SDK comes in handy. We'll add the SDK to the application, so we can start registering cards on the Fidel Platform.&lt;/p&gt;

&lt;p&gt;First, at the top of your &lt;code&gt;/src/App.js&lt;/code&gt; file, import &lt;code&gt;useEffect&lt;/code&gt; from React.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Fidel Web SDK is a JavaScript file hosted at &lt;code&gt;https://resources.fidel.uk/sdk/js/v2/fidel.js&lt;/code&gt;. The required attributes for functioning correctly are the Fidel SDK Key, the Program Id and the company name. &lt;/p&gt;

&lt;p&gt;You can find the SDK Key in the &lt;a href="https://dashboard.fidel.uk/account/plan" rel="noopener noreferrer"&gt;"Account" section of the Fidel Dashboard&lt;/a&gt;. For the purpose of this tutorial, use the Test SDK Key. It should start with &lt;code&gt;pk_test_&lt;/code&gt;. The Program Id can be found in the &lt;a href="https://dashboard.fidel.uk/programs" rel="noopener noreferrer"&gt;"Program" section of the Dashboard&lt;/a&gt;. The Demo Program that comes with each new account has a contextual menu that you can use to copy the program ID. For the company name, you can use anything you want. For the purposes of this tutorial, use something generic like "Fidel Card-Linking Application".&lt;/p&gt;

&lt;p&gt;To add the SDK to your application, use an effect that runs only once at startup to create a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag with the Fidel SDK, add the required attributes to it, and then append it to the document body. In the &lt;code&gt;App()&lt;/code&gt; function of the &lt;code&gt;/src/App.js&lt;/code&gt; file, add the effect:&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="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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="o"&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;Amount&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;Cashback&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;Scheme&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;Card&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;Brand&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;Location&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;Status&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;Date↓&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fidel-form&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nf"&gt;remove&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;sdkScript&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;sdkScript&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://resources.fidel.uk/sdk/js/v2/fidel.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;sdkScript&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fidel-form&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;attributes&lt;/span&gt; &lt;span class="o"&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;data-auto-open&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;false&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;data-key&lt;/span&gt;&lt;span class="dl"&gt;"&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;REACT_APP_FIDEL_SDK_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-program-id&lt;/span&gt;&lt;span class="dl"&gt;"&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;REACT_APP_FIDEL_PROGRAM_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-company-name&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;Fidel Card-Linking Application&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="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;key&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;sdkScript&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attributes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sdkScript&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="k"&gt;return &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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because you've set &lt;code&gt;auto-open&lt;/code&gt; to false in the SDK attributes, the SDK overlay will only show if called, with &lt;code&gt;Fidel?.openForm()&lt;/code&gt;. Add a &lt;code&gt;onClick&lt;/code&gt; handler to the "Add Card" button to open the SDK overlay when clicked.&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;
  &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Fidel&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;openForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"ml-10 w-full bg-blue-700 hover:bg-blue-900 text-white py-2 px-4 rounded"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  Add Card
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Environment File
&lt;/h3&gt;

&lt;p&gt;You might have noticed the example code didn't hardcode the values of the SDK key and program id but rather used environment variables. The generated React application already has support for environment variables. To use them, you need to create an &lt;code&gt;.env&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add variables to it, and fill out the values for your SDK key and program Id in &lt;code&gt;REACT_APP_FIDEL_SDK_KEY&lt;/code&gt; and &lt;code&gt;REACT_APP_FIDEL_PROGRAM_ID&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3001
&lt;span class="nv"&gt;REACT_APP_SERVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:3000
&lt;span class="nv"&gt;REACT_APP_FIDEL_SDK_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="nv"&gt;REACT_APP_FIDEL_PROGRAM_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because you've added the &lt;code&gt;PORT&lt;/code&gt; environment variable, your application will now run on port 3001 and leave port 3000 open for the server we'll build in a minute. You'll need to restart your application with&lt;code&gt;npm start&lt;/code&gt;. Your application should compile successfully and run at "&lt;a href="http://localhost:3001/" rel="noopener noreferrer"&gt;http://localhost:3001/&lt;/a&gt;". If you click the "Add Card" button, a model should pop up with a form to link a card.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-form.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-form.png" title="Card-Linking Form" alt="Card-Linking Form" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Card Numbers
&lt;/h3&gt;

&lt;p&gt;Because you're using the Test SDK key in your application, you won't be able to link a real card in the SDK. There are a few options for test card numbers available in the &lt;a href="https://fidel.uk/docs/cards/#test-card-numbers" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. You can add a test Visa card, for example, by using the card number &lt;code&gt;4444 0000 0000 4001&lt;/code&gt; and set an expiration date in the future, with a participating country of issue from the dropdown.&lt;/p&gt;

&lt;p&gt;Congratulation, you have successfully added the ability to register cards to your React application and used it to link your first card on the Fidel platform!&lt;/p&gt;

&lt;h2&gt;
  
  
  Server Listening For Webhook Events
&lt;/h2&gt;

&lt;p&gt;To start receiving transactions from your linked card, you'll need to register webhooks in the Fidel Dashboard. Before you can register them, you'll need to build them. Create a new &lt;code&gt;server.js&lt;/code&gt; file at the root of your &lt;code&gt;fidel-card-linking-tutorial&lt;/code&gt; folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's go ahead and implement a fairly standard Node.js server, using &lt;code&gt;express&lt;/code&gt;, that listens on port 3000. First, install the dependencies with &lt;code&gt;$ npm install express cors&lt;/code&gt; and then add some boilerplate code to the &lt;code&gt;server.js&lt;/code&gt; file.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServer&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="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cors&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cors&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;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;()&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;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&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;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&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="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="s2"&gt;`Server listening at http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Fidel platform can register a multitude of webhooks, so let's add a generic catch-all route &lt;code&gt;/api/webhooks/:type&lt;/code&gt; that deals with webhooks and sends back a &lt;code&gt;200 OK&lt;/code&gt; response. If your webhook doesn't return a 200 status, the Fidel platform retries sending the webhook until it receives a 200 status.&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/webhooks/:type&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="nx"&gt;next&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="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;end&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;If you try to run the server as is right now, you'll get an error saying you "Cannot use import statement outside a module". And that's because you're using modern import statements in your Node.js code. You'll need to update the &lt;code&gt;package.json&lt;/code&gt; with a new line to support imports.&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;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;module&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It would also be helpful if you could run both the React client and the Node.js server with the same command. Update the &lt;code&gt;start&lt;/code&gt; script inside &lt;code&gt;package.json&lt;/code&gt; to run the server and the client at the same time. You'll need to run &lt;code&gt;npm start&lt;/code&gt; again after you're done.&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scripts&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&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;node server.js &amp;amp; react-scripts start&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Register Webhooks with Fidel
&lt;/h3&gt;

&lt;p&gt;Now that you have created a server listening for webhooks, it's time to register those webhooks on the Fidel platform. Your webhooks need to be publicly accessible on the Internet for Fidel to be able to access them. Sadly, &lt;code&gt;localhost&lt;/code&gt; is not publicly accessible, so you'll need to use &lt;code&gt;ngrok&lt;/code&gt; to make it so. &lt;/p&gt;

&lt;p&gt;There are a few other options here. Usually, with production code, you'll have it deployed somewhere with a URL. Or you'll have a load balancer in front of your code, and that will be publicly accessible. But for exposing local code, there aren't many options that don't involve a deployment. This is where &lt;code&gt;ngrok&lt;/code&gt; comes in handy. It's a tunnelling software that creates a connection between a public URL they host, like &lt;code&gt;https://someRandomId.ngrok.io&lt;/code&gt;, and a port on your local machine.&lt;/p&gt;

&lt;p&gt;Because the server is running on port 3000, you'll start &lt;code&gt;ngrok&lt;/code&gt; on that port with the &lt;code&gt;http&lt;/code&gt; option. You'll get back a random-looking URL that is publicly accessible on the Internet, and you can use it as the base of your webhook URLs. For example, &lt;code&gt;https://a709be896425.ngrok.io&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-ngrok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-ngrok.png" title="Card-Linking ngrok" alt="Card-Linking ngrok" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you've got a ngrok URL, you can go ahead and register a couple of webhooks in the &lt;a href="https://dashboard.fidel.uk/webhooks" rel="noopener noreferrer"&gt;Fidel Dashboard&lt;/a&gt;. For the purposes of this tutorial, register the &lt;code&gt;transaction.auth&lt;/code&gt; webhook on the "Demo Program" to &lt;a href="https://a709be896425.ngrok.io/api/webhooks/transaction.auth" rel="noopener noreferrer"&gt;https://a709be896425.ngrok.io/api/webhooks/transaction.auth&lt;/a&gt;. Follow the same URL convention for registering the &lt;code&gt;transaction.clearing&lt;/code&gt; and &lt;code&gt;transaction.refund&lt;/code&gt; webhooks as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-webhooks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking-webhooks.png" title="Card-Linking Webhooks" alt="Card-Linking Webhooks" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations, you've registered your first webhooks with Fidel. You can start receiving transaction data!&lt;/p&gt;

&lt;h2&gt;
  
  
  Socket.io to Glue It All Together
&lt;/h2&gt;

&lt;p&gt;You've probably noticed your server can receive transaction data from Fidel, but it doesn't do anything with that data. That's because what you do with that data depends heavily on your application use case. For the purpose of this tutorial, let's send that transaction data from the server to the React client, so you can display it in the UI.&lt;/p&gt;

&lt;p&gt;Because the data comes from a webhook, your server doesn't have a lot of control over when it receives the data. Hence, your client can't keep asking for data that isn't there. Because of the event-driven nature of webhooks, long polling is not a great mechanism to pass data. There are a few options, mainly HTTP/2 Server Push, Node.js streams or Web Sockets. You can use something like &lt;code&gt;socket.io&lt;/code&gt;, which combines WebSockets with long polling to ensure maximum browser compatibility while you pass the transaction data from the server to the client. And you'll use just that for this tutorial. Let's go ahead and install the dependencies with &lt;code&gt;$ npm install socket.io socket.io-client&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Socket.io to the Server
&lt;/h3&gt;

&lt;p&gt;You'll need to add the socket mechanism to the server first. Import the &lt;code&gt;Server&lt;/code&gt; from &lt;code&gt;socket.io&lt;/code&gt; at the top of your &lt;code&gt;server.js&lt;/code&gt; file.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Server&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="s1"&gt;socket.io&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before the webhook route is defined, instantiate a new socket Server, and log to the console every time a client connects to the socket. Update the webhook route handler to emit on the socket every time there is new transaction data coming from Fidel.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:3001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;methods&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;GET&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;POST&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="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection&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;socket&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="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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a client connected&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/webhooks/:type&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="nx"&gt;next&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="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&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;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&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;body&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="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;end&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;Now that the server is completed restart it with &lt;code&gt;npm start&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Socket.io to the Client
&lt;/h3&gt;

&lt;p&gt;You'll need to add &lt;code&gt;socket.io&lt;/code&gt; to the client as well, in order to receive the transaction data and display it. At the top of your &lt;code&gt;/src/App.js&lt;/code&gt; file, import &lt;code&gt;socketIOClient&lt;/code&gt; from &lt;code&gt;socket.io-client&lt;/code&gt; and &lt;code&gt;useState&lt;/code&gt; from react.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;socketIOClient&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;socket.io-client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you've imported the socket in your &lt;code&gt;/src/App.js&lt;/code&gt;, you need to create a new socketIOClient in an effect. And register a listener that sets the transactions state on any incoming data.&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="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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTransactions&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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;socket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;socketIOClient&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;REACT_APP_SERVER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onAny&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;transaction&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="nf"&gt;setTransactions&lt;/span&gt;&lt;span class="p"&gt;([{&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;transactions&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;gt;&lt;/span&gt; &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&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;...&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;h3&gt;
  
  
  Create Transaction Component
&lt;/h3&gt;

&lt;p&gt;Now that we've got the data coming into the React client, let's create a &lt;code&gt;Transaction&lt;/code&gt; component that displays it. First, create a &lt;code&gt;components&lt;/code&gt; folder inside the &lt;code&gt;src&lt;/code&gt; folder, and create an empty &lt;code&gt;Transaction.js&lt;/code&gt; file in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;src/components
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/components/Transaction.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A transaction has a type and information about the currency, amount, card scheme, card number, store brand, name and location, and date of creation. Let's create a component that displays all that data to match the empty table we used in the initial empty shell for our application.&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="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;formatCard&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;../utils&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;ReactComponent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Amex&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;../assets/amex-icon.svg&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;ReactComponent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Visa&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;../assets/visa-icon.svg&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;ReactComponent&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Mastercard&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;../assets/mastercard-icon.svg&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;TransactionStatus&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;./TransactionStatus&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;Transaction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;transactions&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;tr&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;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&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="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center justify-between"&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;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-400"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;td&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;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&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;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-gray-400"&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;span&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;td&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;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AMEX&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Amex&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;VISA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Visa&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MASTERCARD&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Mastercard&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&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;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm text-gray-400"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;formatCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&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;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&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;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transaction&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="nx"&gt;address&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&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;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&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;TransactionStatus&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="si"&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="nt"&gt;td&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;td&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"px-6 py-2 whitespace-no-wrap border-b border-gray-200 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;created&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toLocaleString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;td&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;tr&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Transaction&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the application to compile, you'll need to create a few of the things we already used in the Transaction component. Start with the &lt;code&gt;TransactionStatus&lt;/code&gt; component in the same folder as the &lt;code&gt;Transaction&lt;/code&gt; component.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/components/TransactionStatus.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A transaction can have three statuses: authorized, cleared and refunded. The information is contained in the transaction type being passed from the server in the socket. Let's use that data to have a different coloured pill for the status and make it instantly recognizable in the UI.&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="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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TransactionStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;status&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="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="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transaction.auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative inline-block px-3 py-1 font-semibold text-yellow-500"&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;span&lt;/span&gt; &lt;span class="na"&gt;aria-hidden&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute inset-0 bg-yellow-200 opacity-50 rounded-full"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative text-xs"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Auth&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transaction.clearing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative inline-block px-3 py-1 font-semibold text-green-500"&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;span&lt;/span&gt; &lt;span class="na"&gt;aria-hidden&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute inset-0 bg-green-200 opacity-50 rounded-full"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative text-xs"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Cleared&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;transaction.refund&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative inline-block px-3 py-1 font-semibold text-red-500"&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;span&lt;/span&gt; &lt;span class="na"&gt;aria-hidden&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute inset-0 bg-red-200 opacity-50 rounded-full"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative text-xs"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Refund&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&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;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&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;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;You'll also need to create the icons for the three card networks in the assets folder as SVGs, the same as you did for the Fidel logo. &lt;/p&gt;

&lt;p&gt;First, create the Amex icon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/assets/amex-icon.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"34"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 34 8"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"none"&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M30.8291 0L29.0156 2.53729L27.2136 0H25L27.951 3.99979L25.0099 8H27.1602L28.9735 5.42863L30.7864 8H33L30.0379 3.96571L32.9789 0H30.8291Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#2D6EB6"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M19 0V8H25V6.38813H20.8003V4.77733H24.9038V3.17724H20.8003V1.62323H25V0H19Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#2D6EB6"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M14.895 0L13.5001 5.66873L12.0946 0H9V8H10.7101V2.53765L10.6678 0.37783L12.7028 8H14.2976L16.3322 0.423478L16.2905 2.52586V8H18V0H14.895Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#2D6EB6"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M3.29308 0L0 8H1.96474L2.61245 6.28552H6.26715L6.92556 8H9L5.71824 0H3.29308ZM3.87452 2.98299L4.43455 1.48624L4.99396 2.98299L5.6744 4.75448H3.2052L3.87452 2.98299Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#2D6EB6"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Second, create the Mastercard icon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/assets/mastercard-icon.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"21"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"13"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 21 13"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"none"&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M7.64941 11.4892H13.32V1.3754H7.64941V11.4892Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#F75B1B"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M8.01018 6.43222C8.01018 4.38046 8.97821 2.5532 10.4854 1.37531C9.38287 0.513856 7.99213 0 6.48032 0C2.90126 0 0 2.87996 0 6.43222C0 9.98447 2.90126 12.8644 6.48032 12.8644C7.99213 12.8644 9.38287 12.3506 10.4854 11.4891C8.97821 10.3113 8.01018 8.48397 8.01018 6.43222Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#E20025"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M20.769 10.4177V10.1683H20.7032L20.6278 10.34L20.5524 10.1683H20.4866V10.4177H20.5327V10.2294L20.6035 10.3919H20.6517L20.7225 10.229V10.4177H20.769ZM20.353 10.4177V10.2106H20.4372V10.1686H20.2228V10.2106H20.3069V10.4177H20.353ZM20.9713 6.43179C20.9713 9.98447 18.07 12.864 14.491 12.864C12.9792 12.864 11.5884 12.3501 10.4863 11.4887C11.9935 10.3113 12.9612 8.48361 12.9612 6.43179C12.9612 4.38003 11.9935 2.55278 10.4863 1.37489C11.5884 0.513856 12.9792 0 14.491 0C18.07 0 20.9713 2.87954 20.9713 6.43179Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#F0A029"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And third, the Visa icon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/assets/visa-icon.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"29"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 29 10"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"none"&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;path&lt;/span&gt; &lt;span class="na"&gt;fill-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;clip-rule=&lt;/span&gt;&lt;span class="s"&gt;"evenodd"&lt;/span&gt; &lt;span class="na"&gt;d=&lt;/span&gt;&lt;span class="s"&gt;"M14.7771 3.18797C14.762 4.57733 15.9235 5.35133 16.7987 5.81318C17.6979 6.28578 17.9996 6.5891 17.9962 7.01173C17.9894 7.65913 17.2786 7.94439 16.614 7.95551C15.4534 7.97511 14.7796 7.61668 14.2427 7.34624L13.8247 9.45988C14.3637 9.72733 15.3597 9.96058 16.3923 9.9723C18.8181 9.9723 20.4043 8.67787 20.412 6.67207C20.4222 4.12684 17.1548 3.98636 17.1772 2.84902C17.1846 2.50327 17.4892 2.13551 18.1565 2.04106C18.4871 1.99479 19.3995 1.95869 20.4328 2.47278L20.8385 0.427536C20.2826 0.209585 19.5682 0 18.6783 0C16.3964 0 14.79 1.31105 14.7771 3.18797ZM24.7395 0.176346C24.296 0.176346 23.9223 0.454791 23.7566 0.883759L20.2919 9.82142H22.716L23.1977 8.38041H26.1596L26.4386 9.82142H28.574L26.71 0.176346H24.7395ZM25.0777 2.78243L25.7772 6.40391H23.8622L25.0777 2.78243ZM11.8397 0.176346L9.92964 9.82142H12.2386L14.148 0.176346H11.8397ZM8.42354 0.176346L6.02029 6.74094L5.04824 1.15945C4.93439 0.536328 4.48377 0.176346 3.98336 0.176346H0.054434L0 0.455986C0.80632 0.645602 1.72283 0.951192 2.2779 1.27686C2.61777 1.47628 2.71458 1.65024 2.82632 2.12404L4.66732 9.82142H7.10774L10.8486 0.176346H8.42354Z"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"url(#paint0_linear)"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;defs&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;linearGradient&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"paint0_linear"&lt;/span&gt; &lt;span class="na"&gt;x1=&lt;/span&gt;&lt;span class="s"&gt;"28.574"&lt;/span&gt; &lt;span class="na"&gt;y1=&lt;/span&gt;&lt;span class="s"&gt;"0.259826"&lt;/span&gt; &lt;span class="na"&gt;x2=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;y2=&lt;/span&gt;&lt;span class="s"&gt;"0.259826"&lt;/span&gt; &lt;span class="na"&gt;gradientUnits=&lt;/span&gt;&lt;span class="s"&gt;"userSpaceOnUse"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;stop&lt;/span&gt; &lt;span class="na"&gt;stop-color=&lt;/span&gt;&lt;span class="s"&gt;"#21489F"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;stop&lt;/span&gt; &lt;span class="na"&gt;offset=&lt;/span&gt;&lt;span class="s"&gt;"1"&lt;/span&gt; &lt;span class="na"&gt;stop-color=&lt;/span&gt;&lt;span class="s"&gt;"#261A5E"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/linearGradient&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/defs&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only piece missing is a little utils function to format the card number in the UI. Create a &lt;code&gt;utils&lt;/code&gt; folder inside the &lt;code&gt;src&lt;/code&gt; folder, and then an &lt;code&gt;index.js&lt;/code&gt; file inside.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;src/utils
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;src/utils/index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fidel uses a tokenization mechanism for the card numbers and doesn't store the entire card number. You'll receive the first six, and last four numbers from the card number, and the six in between are missing. You'll replace those with asterisks and then split the long card number every other 4 characters to display. In the &lt;code&gt;index.js&lt;/code&gt; file, create a &lt;code&gt;formatCard&lt;/code&gt; method that contains the logic.&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="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;formatCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;card&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;firstNumbers&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="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;lastNumbers&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="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/.&lt;/span&gt;&lt;span class="se"&gt;{4}&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that you've created all the missing pieces for the &lt;code&gt;Transaction&lt;/code&gt; component go ahead and add it to your main application. At the top of the &lt;code&gt;/src/App.js&lt;/code&gt; file, import the &lt;code&gt;Transaction&lt;/code&gt; component.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Transaction&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Transaction&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the render function, there is currently an empty &lt;code&gt;&amp;lt;tbody&amp;gt;&lt;/code&gt; tag. Replace it to iterate over the &lt;code&gt;transactions&lt;/code&gt; data, and map a &lt;code&gt;Transaction&lt;/code&gt; component for each entry.&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;tbody&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-white"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;idx&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Transaction&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;idx&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;transactions&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;tbody&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congratulations, you can now display incoming transactions from Fidel!&lt;/p&gt;

&lt;h2&gt;
  
  
  Simulate Transactions
&lt;/h2&gt;

&lt;p&gt;Because you're using a Test Fidel key, and because you're using test cards, you won't receive live transactions. There are &lt;a href="https://fidel.uk/docs/transactions/#test-transactions" rel="noopener noreferrer"&gt;different ways you can simulate test transactions&lt;/a&gt; on the Fidel platform thought to test this tutorial. One of the simplest ones is to use the &lt;a href="https://dashboard.fidel.uk/playground" rel="noopener noreferrer"&gt;API Playground&lt;/a&gt; in the Fidel Dashboard. Go in there and use the &lt;code&gt;transactions /create&lt;/code&gt; endpoint to create a few different transactions. If you create one with a positive amount, followed by one with a similar but negative amount, it will be matched as a refunded transaction. This way, you'll get to experience all three transaction statuses in the UI. Because you've set up the webhook endpoints already, all transactions you create are passed from Fidel to your ngrok URL, to your local server and then to your React client via socket.io. You should see them showing up in the UI, similar to this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FFidelLimited%2Fdocs%2Fmaster%2Fassets%2Fimages%2Ftutorial-card-linking.png" title="Card-Linked Application Demo" alt="Card-Linked Application Demo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you've had a great time following along this tutorial, and you've learnt the basics of building your first card-linked application on the Fidel platform, using the Fidel Web SDK, Node.js, React and socket.io. If you want to take a look at the code, it's &lt;a href="https://github.com/FidelLimited/fidel-card-linking-tutorial" rel="noopener noreferrer"&gt;available on GitHub&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>react</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Disable Notification Requests in Modern Browsers</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Fri, 21 May 2021 18:23:36 +0000</pubDate>
      <link>https://dev.to/lakatos88/how-to-disable-notification-requests-in-modern-browsers-37pb</link>
      <guid>https://dev.to/lakatos88/how-to-disable-notification-requests-in-modern-browsers-37pb</guid>
      <description>&lt;p&gt;I absolutely hate it when web pages ask me for permission to send notifications. Most often, the same web pages ask me for an email as well. That’s incredibly spammy. I understand their “Marketing” department is struggling, but this really isn’t the way to go. Browser notifications are all kinds of spammy, the same way push notifications on the phone are.&lt;/p&gt;

&lt;p&gt;I’ve been ignoring the requests for the most part, but inevitably a few of them made it through. A lot of these spammy websites are using dark patterns in terms of where the buttons are placed. I inadvertently clicked in the wrong place at the wrong time. You’d think it wasn’t that big of a problem. Still, with me using 4 different browsers consistently (because I’m comparing their Developer Tools for a course), it did mean I now have multiple notifications for the same website popping up.&lt;/p&gt;

&lt;p&gt;Well, I’ve had enough! I spent a little time figuring out how to block modern browsers from sending notification requests. And I thought I’d eventually need to block them again, so I should document the process. If it happens to be helpful to someone else, that’s even better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Chrome
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz25njf20p06bpj4wf2lh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz25njf20p06bpj4wf2lh.gif" alt="Disable Push Notifications in Google Chrome" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;em&gt;chrome://settings/content/notifications&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Disable &lt;em&gt;Sites can ask to send notifications&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chrome has a softer option to use quieter messaging. It blocks notification prompts from interrupting you, but I haven’t been brave enough to try it. &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;Let me know&lt;/a&gt; if you use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mozilla Firefox
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3p7mfu9tp91porrth7dn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3p7mfu9tp91porrth7dn.gif" alt="Disable Push Notifications in Mozilla Firefox" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;em&gt;about:preferences#privacy&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Scroll to the &lt;em&gt;Permissions&lt;/em&gt; section&lt;/li&gt;
&lt;li&gt;Click on the Notifications &lt;em&gt;Settings&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Check the &lt;em&gt;Block new requests asking to allow notifications&lt;/em&gt; box&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Microsoft Edge
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mh3vl71gqra9887x6dl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mh3vl71gqra9887x6dl.gif" alt="Disable Push Notifications in Microsoft Edge" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;em&gt;edge://settings/content/notifications&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Disable &lt;em&gt;Ask before sending&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Edge has a softer option to use quiet notification requests. It prevents notification requests from interrupting you, but I haven’t been brave enough to try it. &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;Let me know&lt;/a&gt; if you use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safari
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9ejvlgu5yl56wxuwu6o.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9ejvlgu5yl56wxuwu6o.gif" alt="Disable Push Notifications in Apple Safari" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;em&gt;Preferences&lt;/em&gt; in the Menu bar&lt;/li&gt;
&lt;li&gt;Click on the &lt;em&gt;Websites&lt;/em&gt; tab&lt;/li&gt;
&lt;li&gt;Scroll to &lt;em&gt;Notifications&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Deselect &lt;em&gt;Allow websites to ask for permission to send notifications&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Brave
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56we9x9rbkifwo7gutb2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56we9x9rbkifwo7gutb2.gif" alt="Disable Push Notifications in Brave Browser" width="720" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;em&gt;brave://settings/content/notifications&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Disable &lt;em&gt;Sites can ask to send notifications&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Brave has a softer option to use quieter messaging. It blocks notification prompts from interrupting you, but I haven't been "brave" enough to try it. &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;Let me know&lt;/a&gt; if you use it.&lt;/p&gt;




&lt;p&gt;Have you found this article at all useful? If you did, &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;follow me on Twitter&lt;/a&gt;. It would make my day! Oh, that’s where I also regularly share tips and tricks for getting the most out of your browsers 😅.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>tricks</category>
      <category>tips</category>
    </item>
    <item>
      <title>The Accidental Public Speaker or How I Got Over My Fear of Public Speaking</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Fri, 14 May 2021 10:34:23 +0000</pubDate>
      <link>https://dev.to/lakatos88/the-accidental-public-speaker-or-how-i-got-over-my-fear-of-public-speaking-48c9</link>
      <guid>https://dev.to/lakatos88/the-accidental-public-speaker-or-how-i-got-over-my-fear-of-public-speaking-48c9</guid>
      <description>&lt;p&gt;&lt;strong&gt;I’ve given over a hundred talks in the past few years&lt;/strong&gt;. Why? Because I think it’s perfectly OK for me to be terrified, but it’s not OK for me to stay that way. My biggest fear? Same as you, same as everybody else. I was afraid to speak in front of people. &lt;/p&gt;

&lt;p&gt;A hundred talks later, &lt;strong&gt;I’m still terrified every time I go on stage&lt;/strong&gt;. How did I ever get on stage, though? Well, here’s a little trip down memory lane, the series of unfortunate events that got me up on stage. I entirely blame &lt;a href="https://twitter.com/ioana_cis" rel="noopener noreferrer"&gt;Ioana&lt;/a&gt; and &lt;a href="https://twitter.com/pensacolla" rel="noopener noreferrer"&gt;Marcela&lt;/a&gt; for this btw, if you want the tl;dr. 😅&lt;/p&gt;

&lt;p&gt;Why did I do over a hundred talks, you might ask? Well, I do a bunch of things in this world. In my free time, I’m a Mozilla Tech Speaker. I also volunteer for the Mozilla Reps program, and I’m a Mentor in that program. Both of those programs are geared towards speaking to tech audiences and building communities. But I do like the idea of a paycheck and getting paid, so I work for Fidel as a Developer Relations Manager. And speaking in public is part of the job. I know, I must be a masochist. There’s no other explanation. 🤦&lt;/p&gt;

&lt;p&gt;With Mozilla or work, I’ve met a lot of great people, Developer Advocates, Community Builders, and Developers getting over their fear of speaking so they could share their knowledge. Because there is not a lot to do in the “Speakers Room” at conferences, and because misery loves company, the question I always asked was: “How did you get here”. Everybody I’ve asked has a different origin story. There’s no common denominator, really. I will tell you a bit of my story, how I started out.&lt;/p&gt;

&lt;p&gt;It all started about 10 years ago, there was an event called Open Source Open Mind in Romania, and I was working for Mozilla at the time. They asked our team to talk about Mozilla. Still, I was terrified of public speaking, so it definitely wasn’t going to be me. Ioana said she’d do it, but she was travelling to the US and didn’t have time to do the slides. I volunteered to do slides; that was the easy part; I didn’t actually have to go in front of 100 something people. So I did the slides. &lt;strong&gt;This was my first mistake&lt;/strong&gt;. 😅&lt;/p&gt;

&lt;p&gt;On the morning of the event, I was waiting at the airport for Ioana to land when she calls me to tell me her flight got delayed, so I should go to the event and stall; she’ll get there on the next flight. I get to the event. &lt;strong&gt;This was my second mistake&lt;/strong&gt;. Marcela, the organizer, is a friend and a really nice person; she kept pushing our time slot later and later in the day. It came to the last time slot of the day. Someone had to go up on stage.&lt;/p&gt;

&lt;p&gt;Marcela goes up on stage, looks for Ioana in the audience, but Ioana isn’t there yet. She then utters the words that sealed my fate: “And now, from Mozilla… Alex! Alex is going to come and speak about it!". It took me a while to process. I went up on stage, I put my hands in my pockets, I kept bouncing from one foot to the other, and it took a good minute until I started speaking. It was horrible. I couldn’t face my audience. I was looking halfway at my slides, halfway at the sidewall. &lt;/p&gt;

&lt;p&gt;Sadly, the experience is recorded and &lt;a href="https://www.youtube.com/watch?v=pMnwjpy_3J0&amp;amp;t=5s" rel="noopener noreferrer"&gt;still up on YouTube&lt;/a&gt;. I still use it as an example of what not to do when I try to help other people get over their fear of public speaking. Luckily, the experience isn’t in English, so you can’t really understand how bad it was unless you speak Romanian. 😅&lt;/p&gt;

&lt;p&gt;The problem was, &lt;strong&gt;once I started speaking, I couldn’t stop&lt;/strong&gt; —no questions from the audience, no nothing. After I finished my presentation, there was a Q&amp;amp;A part. For every question I got, I kept stepping further and further into the audience space. At a certain point, when the Q&amp;amp;A portion was finished, I was literally in the middle of the room.&lt;/p&gt;

&lt;p&gt;By the time I finished my talk, Ioana actually showed up at the conference. But the damage was already done. &lt;strong&gt;I had spoken in public without dying in the process&lt;/strong&gt;. After that first experience, I was horrified, nervous and &lt;strong&gt;vowed never to do it again&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Two weeks later, I was doing it again, speaking in front of 50 other people. That’s how I got started into all this. Turns out, peer pressure is a strong motivating force, especially if done live in front of hundreds of strangers. I’m being sarcastic here. Please don’t do this to your friends. I highly doubt it’s going to work a second time. You might call me the “Accidental Public Speaker”.&lt;/p&gt;

&lt;p&gt;The other hundred or so talks that followed, I have no excuse for those. 😅 In the meantime, I’ve learned a lot about things that help me get on stage and power through fear. I do some embarrassing things before I go on stage now. But they work for me, so I’ve &lt;strong&gt;learned to accept the process&lt;/strong&gt; and don’t fix it if it’s not broken.&lt;/p&gt;

&lt;p&gt;One of the things that work for me has to do with the “Psychology of Winning”. If I make myself believe I’ve “won” this talk before it even starts, there no pressure to hype my fear levels. It sort of takes the edge off enough for me to start. And once I start, and get through the first 2 minutes of it, practice and a lot of other things kick in, and it’s all the better from there.&lt;/p&gt;

&lt;p&gt;How do I trick myself into believing I “won” something before it happened? Well, this is where the embarrassing things happen. The “Psychology of Winning” says winning is a state of mind that correlates to physical reactions to winning. The reverse is also true to some extent, so mimicking those physical reactions will induce a mild “winning” mental state. You see where I’m going with this.&lt;/p&gt;

&lt;p&gt;Before my talks, I find a quiet corner at the conference or an empty bathroom stall 😳. And I do winning gestures, like pumping my chest forward, raising my fists in the air, jumping up and down, and screaming my lungs out. In case you’ve been at a conference with me before and you’ve “experienced” the ritual, I’d like to profusely apologize. 😅 &lt;strong&gt;I hope we can still be friends&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If this all inspired or convinced you to try speaking in front of people, &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;reach out on Twitter&lt;/a&gt;. I’m putting together a list of other things I tried to get over my fear of public speaking, some of which actually worked.&lt;/p&gt;

</description>
      <category>speaking</category>
      <category>devrel</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>Meet zx: A Better Way to Write Scripts with Node.js</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Tue, 11 May 2021 20:55:10 +0000</pubDate>
      <link>https://dev.to/lakatos88/meet-zx-a-better-way-to-write-scripts-with-node-js-4mkb</link>
      <guid>https://dev.to/lakatos88/meet-zx-a-better-way-to-write-scripts-with-node-js-4mkb</guid>
      <description>&lt;p&gt;Bash is great and all, but it’s not something I’ll pick up in a day. I was looking for something a little bit more convenient to write scripts in. While looking, I’ve stumbled upon this little &lt;a href="https://github.com/google/zx" rel="noopener noreferrer"&gt;utility from Google&lt;/a&gt; called &lt;code&gt;zx&lt;/code&gt;. And it’s a better way to write scripts using JavaScript.&lt;/p&gt;

&lt;p&gt;I thought I’d give &lt;code&gt;zx&lt;/code&gt; a try. It comes with a bunch of things out of the box, like &lt;code&gt;chalk&lt;/code&gt; and &lt;code&gt;fetch&lt;/code&gt;. I know, Node.js already lets me write scripts, but dealing with a bunch of the crap around escaping and sanitizing inputs was painful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Script Way
&lt;/h2&gt;

&lt;p&gt;Before I talk about all the great things &lt;code&gt;zx&lt;/code&gt; promised, let’s talk about the basics of writing and using scripts first.&lt;/p&gt;

&lt;p&gt;Scripts are all text files and need to start with a shebang at the top (also known as sha-bang, hashbang, pound-bang or hash-pling). The shebang tells the operating system to interpret the rest of the file using that interpreter directive, effectively starting the interpreter and passing the text file along as a parameter.&lt;/p&gt;

&lt;p&gt;So, when scripts start with &lt;code&gt;#!/bin/bash&lt;/code&gt; or &lt;code&gt;#!/bin/sh&lt;/code&gt;, the OS actually runs &lt;code&gt;$ /bin/bash /path/to/script&lt;/code&gt; behind the scenes every time you execute the script.&lt;/p&gt;

&lt;p&gt;Before you can execute the script, you need to declare it in the system as executable. On Unix systems (macOS included), running &lt;code&gt;$ chmod +x ./script.sh&lt;/code&gt; or &lt;code&gt;$ chmod 775 ./script.sh&lt;/code&gt; will do the trick.&lt;/p&gt;

&lt;p&gt;After you’ve given permissions to your script to be executed, you can run it with &lt;code&gt;$ ./script.sh&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bash Scripts
&lt;/h2&gt;

&lt;p&gt;A Bash script starts with the bash shebang, followed by a lot of black magic. 😅 For example, to add two numbers that are given as command-line arguments, a script looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt; + &lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run it, save it as &lt;code&gt;add.sh&lt;/code&gt; and then run the following commands in your Terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./add.sh
&lt;span class="nv"&gt;$ &lt;/span&gt;./add.sh 5 7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output is going to be &lt;code&gt;5 + 7 = 12&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It looks pretty simple if you’ve figured out that &lt;code&gt;$index&lt;/code&gt; is the command-line argument. I’ve had to look that up while learning shell scripting.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;zx&lt;/code&gt; Scripts
&lt;/h2&gt;

&lt;p&gt;Before you can use &lt;code&gt;zx&lt;/code&gt; to run scripts, you’ll need to install it globally via npm, with &lt;code&gt;$ npm i -g zx&lt;/code&gt;. Why didn’t you need to install &lt;code&gt;bash&lt;/code&gt;? Because &lt;code&gt;bash&lt;/code&gt; comes installed by default with Unix systems.&lt;/p&gt;

&lt;p&gt;Similarly to all other scripts, a &lt;code&gt;zx&lt;/code&gt; script will start with a shebang. This time, a little more complicated, the &lt;code&gt;zx&lt;/code&gt; shebang. Followed by a lot of JavaScript. Let’s try to recreate the above shell script that adds two numbers given as command-line arguments.&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="cp"&gt;#!/usr/bin/env zx
&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="s2"&gt;`&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;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&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="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&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="s2"&gt; = &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;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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;argv&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To run it, save it as &lt;code&gt;add.mjs&lt;/code&gt; and then run the following commands in your Terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./add.mjs
&lt;span class="nv"&gt;$ &lt;/span&gt;./add.mjs 5 7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output is going to be &lt;code&gt;/Users/laka/.nvm/versions/node/v16.1.0/bin/node + /usr/local/bin/zx = /Users/laka/.nvm/versions/node/v16.1.0/bin/node/usr/local/bin/zx&lt;/code&gt; 😅. And that’s because &lt;code&gt;process.argv&lt;/code&gt;, another Node.js wonder, gets called with three extra arguments before you get to 5 and 7. Let’s re-write the script to account for that:&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="cp"&gt;#!/usr/bin/env zx
&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="s2"&gt;`&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;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&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="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&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="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run the script now with &lt;code&gt;$ ./add.mjs 5 7&lt;/code&gt;, the output is going to be &lt;code&gt;5 + 7 = 57&lt;/code&gt;. Because JavaScript 🤦. And JavaScript thinks those are strings and concatenates them instead of doing math. Re-writing the script again to deal with numbers instead of strings, it looks like:&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="cp"&gt;#!/usr/bin/env zx
&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="s2"&gt;`&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;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&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="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&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="nf"&gt;parseInt&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;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;parseInt&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;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;10&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Bash script looked a lot cleaner, right? I agree. And if I ever need to add two numbers from the command line, a Bash script would be a way better option! Bash doesn’t shine in a lot of other areas, though. Like parsing JSON files. I gave up trying to figure how to parse JSON files halfway through &lt;a href="https://stackoverflow.com/questions/1955505/parsing-json-with-unix-tools" rel="noopener noreferrer"&gt;the StackOverflow post explaining it&lt;/a&gt;. But this is where &lt;code&gt;zx&lt;/code&gt; shines.&lt;/p&gt;

&lt;p&gt;I already know how to parse JSON in JavaScript. And here is what the &lt;code&gt;zx&lt;/code&gt; script for it looks like, using the built-in &lt;code&gt;fetch&lt;/code&gt; module:&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="cp"&gt;#!/usr/bin/env zx
&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&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="s1"&gt;https://raw.githubusercontent.com/AlexLakatos/computer-puns/main/puns.json&lt;/span&gt;&lt;span class="dl"&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;puns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;randomPun&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;puns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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;chalk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;red&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;puns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;randomPun&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;pun&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;chalk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;green&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;puns&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;randomPun&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;punchline&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;Because I was fancy and used the built-in &lt;code&gt;chalk&lt;/code&gt; module, this &lt;code&gt;zx&lt;/code&gt; script outputs a random pun from &lt;a href="https://puns.dev" rel="noopener noreferrer"&gt;https://puns.dev&lt;/a&gt; in the command-line.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1e1rjnr0590w0qdsg243.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1e1rjnr0590w0qdsg243.png" alt="Computer Pun in Terminal via zx" width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building something similar in &lt;code&gt;shell&lt;/code&gt; had me rage-quit halfway through the process. And that’s OK. Finding the right tool for the job is what this post was all about.&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Get Your First Job in Developer Relations</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Tue, 04 May 2021 06:34:19 +0000</pubDate>
      <link>https://dev.to/lakatos88/how-to-get-your-first-job-in-developer-relations-2bgn</link>
      <guid>https://dev.to/lakatos88/how-to-get-your-first-job-in-developer-relations-2bgn</guid>
      <description>&lt;p&gt;Hi, my name is Alex, and I’m an… Advocate. A Developer Advocate. With Developer Advocates being one of the most sought out commodities on the market this year, I thought I’d write up the answer to one of the questions that I answer frequently in my DMs - mostly because I &lt;a href="https://www.swyx.io/three-strikes/" rel="noopener noreferrer"&gt;read this thing&lt;/a&gt; from &lt;a href="https://twitter.com/swyx" rel="noopener noreferrer"&gt;@swyx&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How did you break into Developer Relations?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If I knew what I did exactly to end up here, it would probably be an easy answer. But it isn’t because I didn’t wake up one day and decided this was what I wanted to be when I grew up. My idols and role models were Developer Advocates, and I didn’t think I was good enough to be the same. On top of that, I was a Senior Developer with quite a few years of experience under my belt. I didn’t feel like giving that up to be a “&lt;em&gt;Junior&lt;/em&gt;” anything again.&lt;/p&gt;

&lt;p&gt;If you ask other people in the industry - and I asked quite a few of them in a survey - everybody has a different story. Because &lt;strong&gt;Developer Relations is such a new industry&lt;/strong&gt;. Even defining it is tricky because it depends on which side of the aisle you’re asking. &lt;a href="https://www.leggetter.co.uk/2016/02/03/defining-developer-relations.html" rel="noopener noreferrer"&gt;Phil tried to define Developer Relations&lt;/a&gt; a while back, and when you look at it, it’s got so many roles that overlap. &lt;strong&gt;Evangelism versus Advocacy, Marketing versus Community, Technical Writing versus Developer Experience&lt;/strong&gt;. And they’re all a part of DevRel, but &lt;strong&gt;the skills required for the role depend from company to company&lt;/strong&gt; , not necessarily from role to role.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@dzello/how-i-got-into-developer-advocacy-93bad1678a67" rel="noopener noreferrer"&gt;Josh said that not all journeys are the same&lt;/a&gt;, and I tended to agree with him. But then I got the chance to meet and interview many other Developer Advocates, Community Managers and Technical Writers, and some patterns emerged. Turns out, &lt;a href="https://www.youtube.com/watch?v=Frt_fvEfROU" rel="noopener noreferrer"&gt;while not all journeys were the same, all roads lead to Rome&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ve spent some time identifying a set of skills each of us in DevRel had before joining the industry. Here’s a list that also tells you how you can acquire them now, outside of DevRel. Because it turns out &lt;strong&gt;you don’t have to give up your career progression&lt;/strong&gt; and start all over, &lt;strong&gt;you can break in&lt;/strong&gt;. Not a single one of us had all the skills we use today.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We’ve all started out with only one or two of the required skills and learned the rest on the job. So don’t worry, you can make do with picking up only a few of these skills!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Community Building
&lt;/h2&gt;

&lt;p&gt;There are open-source programs explicitly designed for building community. I’ll share a list of my favourites, but I’m pretty sure most open-source projects won’t say no if you start helping out. It doesn’t have to be something as minor as code. It can be something truly helpful, like commenting on old issues to see if people still care about them. Or getting together with some people to test a project. For example, the Reps program even sponsored pizza or coffee for people to get together and help out around the Mozilla mission. Fedora does the same for its Ambassadors. I’m pretty sure I missed a few, &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;so let me know on Twitter, and I’ll add more&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://wiki.mozilla.org/Reps" rel="noopener noreferrer"&gt;Mozilla Reps&lt;/a&gt; are passionate Mozillians who mobilize and develop functional and local/regional Mozilla communities. They are committed to educate and empower people to support Mozilla’s mission and contribute to the project based on Mozilla’s leadership agreements.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fedoraproject.org/wiki/Ambassadors" rel="noopener noreferrer"&gt;Fedora Ambassadors&lt;/a&gt; are responsible for helping to grow the contributor base and act as a liaison between other FLOSS projects and the Fedora community.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Public Speaking
&lt;/h2&gt;

&lt;p&gt;With a pandemic, travel bans and no in-person events, public speaking is a different beast than when I started. There are different challenges involved in speaking in front of a live audience as opposed to a camera. Most learning communities there haven’t yet adapted to online speaking, so if you find yourself stuck while picking this one up, &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;please reach out&lt;/a&gt;. I’m more than happy to have learning sessions. We’ve been training people online to speak in public for a few years with Mozilla Tech Speakers, happy to pick it up again.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.globaldiversitycfpday.com/" rel="noopener noreferrer"&gt;Global Diversity CFP Day&lt;/a&gt; is a tech-wide cross-community event based on the successful workshops held in advance of ScotlandCSS and ScotlandJS in 2016. Over the years it has evolved into a focused 1-day event designed to help you go from an idea to skills and a talk ready to submit to a conference.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.toastmasters.org/" rel="noopener noreferrer"&gt;Toastmasters&lt;/a&gt; is a nonprofit educational organization that teaches public speaking and leadership skills through a worldwide network of clubs. While they focus more on improvised topics, it will get you comfortable to step up in front of strangers and try to keep a straight face while you’re talking about a random topic. This will later evolve into not being afraid of the Q&amp;amp;A session of your talks.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://wiki.mozilla.org/TechSpeakers" rel="noopener noreferrer"&gt;Mozilla Tech Speakers&lt;/a&gt; started as an experiment in 2015 designed by &lt;a href="https://twitter.com/freshelectrons" rel="noopener noreferrer"&gt;Havi Hoffman&lt;/a&gt; and &lt;a href="https://twitter.com/dietrich" rel="noopener noreferrer"&gt;Dietrich Ayala&lt;/a&gt; from the Mozilla Developer Relations team. They invited a handful of volunteers who were passionate about giving talks at conferences on Mozilla-related technologies and the Open Web in general to trial a program that would support their conference speaking activities and amplify their impact. It scaled to 100 people, &lt;a href="https://discourse.mozilla.org/t/pausing-tech-speaker-program-support/66157/8" rel="noopener noreferrer"&gt;but sadly in 2020, it was axed&lt;/a&gt; when &lt;a href="https://blog.mozilla.org/blog/2020/08/11/changing-world-changing-mozilla/" rel="noopener noreferrer"&gt;Mozilla did their second round of layoffs&lt;/a&gt;. However, the resources developed for the program are still some of the best around, so check them out.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Writing
&lt;/h2&gt;

&lt;p&gt;I must admit, writing, in general, was something I struggled with. But new resources and communities for technical writing keep popping up. It’s getting easier to get started. What helped me was &lt;strong&gt;transforming the writing bit from a skill into a habit&lt;/strong&gt;. I’ve struggled with writing consistently for 3 years, tried various things, but I think I’ve finally figured it out. For the past 189 days, I’ve challenged myself to write at least 100 words every day. And you (and me both) would think that’s not a lot. It seemed like a manageable quantity when I started. Turns out those 100 words add up when you do it every day. So far, it’s been 42687 words and 19 articles published in those 189 days. I’ve &lt;a href="https://twitter.com/lakatos88/status/1321423080095469568" rel="noopener noreferrer"&gt;used Twitter as a way to hold myself publicly accountable&lt;/a&gt;, but there are other communities to help you be accountable while you learn or to help improve your writing style.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.writethedocs.org/" rel="noopener noreferrer"&gt;Write the Docs&lt;/a&gt; is a global community of people who care about documentation. They consider everyone who cares about communication, documentation, and their users to be a member of their community. This can be programmers, tech writers, developer advocates, customer support, marketers, and anyone else who wants people to have great experiences with software.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bloggingfordevs.com/" rel="noopener noreferrer"&gt;Blogging for Devs&lt;/a&gt; is both a free email course and a paid community. Whether you’re just starting out, trying to revive an existing blog, or want to get past a plateau, this course and newsletter is going to help.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.google.com/tech-writing/overview" rel="noopener noreferrer"&gt;Google has a collection of courses&lt;/a&gt; and learning resources that aims to help you improve your technical documentation. Learn how to plan and author technical documents. You can also learn about the role of technical writers at Google.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Event Organizing
&lt;/h2&gt;

&lt;p&gt;The barrier to start organizing events has considerably lowered with the onset of the pandemic. Before, it involved finding a physical space, a speaker, an audience and a sponsor for the refreshments. It was a lot easier to find an established group and help out instead of starting your own. I went at it the hard way, starting a London JavaScript meetup with &lt;a href="https://twitter.com/chris_noring" rel="noopener noreferrer"&gt;Chris&lt;/a&gt; and &lt;a href="https://twitter.com/simona_cotin" rel="noopener noreferrer"&gt;Simona&lt;/a&gt;. Chris and I convinced our employer to let us use the office during the weekend, and we asked our friends, like Simona, to come in and do free Angular workshops for people. After the meetup group got enough people, sponsors and venues started contacting us, so we didn’t have to run around looking for them. But with our attendee numbers multiplying fast, the three of us weren’t enough to get everything done, so we were always on the lookout for people to help us out. Be those people for other groups! I highly doubt anyone is going to turn you down.&lt;/p&gt;

&lt;p&gt;If helping out a group isn’t your thing, you can always put on a show of your own. In the age of online events, you don’t need a space or a sponsor. You can do it with a Zoom call, a speaker, and an audience. If you’re looking for groups or a place to find your audience, here’s a list.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://techtalks.io/" rel="noopener noreferrer"&gt;techtalks.io&lt;/a&gt; is a new tool for community building that evolved from the need for a better Meetup. I honestly think it’s the natural progression of Meetup. You can join a community of engineering, design, product and UX experts, organize, watch and discuss talks, get involved with a community and share your ideas.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.meetup.com" rel="noopener noreferrer"&gt;Meetup&lt;/a&gt; is a platform for finding and building local communities. People use Meetup to organize events, meet new people, learn new things, find support, get out of their comfort zones, and pursue their passions, together.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Builders
&lt;/h2&gt;

&lt;p&gt;I’m afraid I don’t have a lot of options here. &lt;strong&gt;The only thing I can tell you is to build things&lt;/strong&gt;. What things? It doesn’t really matter. The goal is to &lt;strong&gt;pick up something new&lt;/strong&gt; , &lt;strong&gt;experiment with it&lt;/strong&gt; for a few days, and then &lt;strong&gt;tell other people what you did&lt;/strong&gt;. It doesn’t have to be a next career move, it doesn’t have to be useful to anyone but yourself, and it doesn’t have to be maintained for years to come. Build things, and that’s it.&lt;/p&gt;

&lt;p&gt;If you’ve stumbled upon my &lt;a href="https://github.com/AlexLakatos/" rel="noopener noreferrer"&gt;GitHub profile&lt;/a&gt;, you’ll see I’m part of a dozen organizations, most of them abandoned, and that’s ok. I’ve also got almost 100 repositories that are just there, with only a handful actively maintained. Some of them are so cringe-worthy, with hacked-together code, that I still haven’t made public. And that’s ok.&lt;/p&gt;

&lt;p&gt;All these got me a valuable skill: I can build something with a clearly defined scope and throw it away as soon as it served its purpose. I don’t get overly attached to a piece of code or a project just because. And it doesn’t have to be perfect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can You Be a Junior Developer Advocate?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Yes, definitely, of course!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I know this might sound controversial. A lot of the Developer Advocates out there will tell you to be a Solution Architect before thinking about being a Developer Advocate. I’d like to formally and unequivocally call “BullShit!” here. Just because it took some people forever to get here (me included), it doesn’t mean it was right or that you should suffer. No! There are Junior Developer Advocates, Junior Community Managers. I’m not sure about Junior Technical Writers, but surely there are some, so let me know in the comments section below!&lt;/p&gt;

&lt;p&gt;The quality that makes a successful &lt;em&gt;devrella&lt;/em&gt; is being able to &lt;strong&gt;understand developers pain points&lt;/strong&gt;. Sure, some slower people like me need to suffer first before we can understand the problems, so we can fix them. Some smarter people, like &lt;a href="https://twitter.com/mary_grace/" rel="noopener noreferrer"&gt;Mary&lt;/a&gt;, could figure out this one without going through the grind. That means anyone can get there, so Junior Developer Advocates are a thing! Next time you see an opening, don’t let the fact that you haven’t suffered in the industry for the past ten years discourage you from applying. &lt;strong&gt;This field needs a fresh perspective&lt;/strong&gt; a lot more than it needs dinosaurs like me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus Round
&lt;/h2&gt;

&lt;p&gt;As Shawn put it, “&lt;strong&gt;DevRel is a not generalizable skill&lt;/strong&gt;, or rather, there’s such a thing as &lt;strong&gt;devrel-company fit&lt;/strong&gt;”. You might have noticed this blog post was technology agnostic. And that’s because it requires a great deal of passion and empathy. Those skills are not as easy to acquire as functional skills. Try to find a product or community you’re passionate about or something you’ve used or been part of before. It’s easier to get your first job in Developer Relations for a company when you’ve already got some domain knowledge. There’s also some degree of credibility involved. I couldn’t get a job advocating for an iOS company, for example. You should try to &lt;strong&gt;get some experience in your space&lt;/strong&gt;, really understand the domain you’re trying to break in as a &lt;em&gt;devrella&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I also co-curate alongside &lt;a href="https://twitter.com/iza_biro" rel="noopener noreferrer"&gt;Julia&lt;/a&gt;, a weekly email roundup of Developer Avocados 🥑 Call-For-Papers, resources and articles. If you want to learn more about DevRel, you &lt;strong&gt;should definitely subscribe&lt;/strong&gt; to &lt;a href="https://developeravocados.net/" rel="noopener noreferrer"&gt;Developer Avocados 🥑 Weekly&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;If you’ve read this far, or you’re considering getting into Developer Relations, &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;reach out on Twitter&lt;/a&gt;! I’m always happy to answer your questions or help you land your first role in DevRel.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>speaking</category>
      <category>writing</category>
      <category>career</category>
    </item>
    <item>
      <title>Node.js v10 Is Being End-of-Lifed Today, but What Does It All Mean?</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Fri, 30 Apr 2021 17:07:39 +0000</pubDate>
      <link>https://dev.to/lakatos88/node-js-10-is-being-end-of-lifed-today-but-what-does-it-all-mean-44ih</link>
      <guid>https://dev.to/lakatos88/node-js-10-is-being-end-of-lifed-today-but-what-does-it-all-mean-44ih</guid>
      <description>&lt;p&gt;Any Node.js end-of-life day is a good day, but today especially so! Node.js v10 is being end-of-lifed today, so you can finally support ES6 imports in your JavaScript code examples and libraries by default!&lt;/p&gt;

&lt;p&gt;The latest versions of Node.js v12 (not the earlier versions, mind you) support ES6 modules by default, so there is no need to do the ugly hacks you needed to do before if you wanted to write modern JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before
&lt;/h2&gt;

&lt;p&gt;Before, you had to save your code a &lt;code&gt;.mjs&lt;/code&gt; instead of &lt;code&gt;js&lt;/code&gt;, and then run &lt;code&gt;node&lt;/code&gt; with the &lt;code&gt;--experimental-modules&lt;/code&gt; flag. Which most Node.js runtimes online were very slow to adopt.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ node --experimental-modules index.mjs&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  After
&lt;/h2&gt;

&lt;p&gt;The latest versions of Node.js v12+ support this out of the box, so there is no need to run with a flag. And most Node.js runtimes update to the latest Maintenance release, so they support it as well.&lt;/p&gt;

&lt;p&gt;If you want to run on your own hosted environment now you can either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;save the file with a &lt;code&gt;.mjs&lt;/code&gt; extension, and run it regularly with &lt;code&gt;node index.mjs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;save the file with a regular &lt;code&gt;.js&lt;/code&gt; extension, add &lt;code&gt;type: module&lt;/code&gt; to your &lt;code&gt;package.json&lt;/code&gt; file, and then run the file regularly with &lt;code&gt;node index.js&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Changing Old Code
&lt;/h2&gt;

&lt;p&gt;If you're migrating from the old &lt;code&gt;require&lt;/code&gt; to the more modern &lt;code&gt;import&lt;/code&gt;, there are a couple of things you'll need to do to your files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;change &lt;code&gt;module.exports = avocados&lt;/code&gt; into &lt;code&gt;export default avocados&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;change &lt;code&gt;const avocados = require('avocados')&lt;/code&gt; into &lt;code&gt;import avocados from 'avocados'&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most IDEs account for this and help you change it. Like &lt;a href="https://umaar.com/dev-tips/222-vs-code-convert-es-import/" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to see it in action on a slightly bigger project, I've switched over the Fidel sample application using things like express, dotenv and axios a little while back, &lt;a href="https://github.com/FidelLimited/fidel-api-sample-app/commit/300f672b5d119d9d80afe07ac23f67b3bb52f805" rel="noopener noreferrer"&gt;it's all contained in a commit&lt;/a&gt; thought so easy to see the changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait, What is End-of-Life?
&lt;/h2&gt;

&lt;p&gt;"End-of-life" or EOL is a term used by older, more enterprise-focused companies, to let everyone know that they're limiting support or outright not supporting a certain version of their product anymore. You could say the OpenJS Foundation has "pulled the plug" on Node.js v10. 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  Got Love?
&lt;/h2&gt;

&lt;p&gt;If you've loved the pun at the end, or if you just found this mildly useful, please consider &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;following me on Twitter&lt;/a&gt;. I'd be storked. 😅&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Adding multi-factor authentication to your app, the easy way</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Wed, 20 Jan 2021 13:31:19 +0000</pubDate>
      <link>https://dev.to/typingdna/adding-multi-factor-authentication-to-your-app-the-easy-way-oge</link>
      <guid>https://dev.to/typingdna/adding-multi-factor-authentication-to-your-app-the-easy-way-oge</guid>
      <description>&lt;p&gt;First, let’s look at what Multi-Factor Authentication or MFA is. Most applications use a username/password combination to authenticate or log in their users. Some of them use a second method on top of the first, like a token or code sent via SMS. That is commonly called 2FA or two-factor authentication. &lt;/p&gt;

&lt;p&gt;In light of countless security breaches across the industry, 2FA is becoming increasingly popular In the event that one of the methods used for authentication is compromised, an additional check will make it more difficult to impersonate a user.&lt;/p&gt;

&lt;p&gt;The methods of authenticating users are also called factors, or pieces of evidence required for authentication, which is where the term &lt;em&gt;multi-factor authentication&lt;/em&gt; originates. &lt;/p&gt;

&lt;p&gt;Multi-factor implies more than one factor is used, so technically 2FA is the minimum number of factors to be used for MFA. Depending on your application’s security level, you can choose to increase the number of factors used to authenticate your users. Before we get ahead of ourselves and ask for ten pieces of data, let’s look at the available options.&lt;/p&gt;

&lt;h2&gt;
  
  
  The options for authentication factors
&lt;/h2&gt;

&lt;p&gt;Here are the different types of evidence you can ask users to provide: :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Knowledge&lt;/strong&gt; - Something the user knows — a password, for example. Most authentication mechanisms use this factor. And, usually, it's the only one. Or at least the first one.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Location&lt;/strong&gt; - Somewhere the user is — the office building, for example. Most corporate networks used to be geofenced back in my day. Still, with the rise of remote work, especially during the pandemic, this factor has severely fallen out of favour. Not to mention, most use cases for MFA work from anywhere in the world, so being locked inside a geographical area might be irrelevant. Location might not necessarily mean geolocation though. In some cases, you can use the IP address as a factor instead. Think about all your “intranet” websites that are only accessible from inside the corporate VPN.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Possession&lt;/strong&gt; - Something the user has — a token or a phone number, for example. This is the second most commonly used factor. When people talk about 2FA, this factor is usually the second factor  (e.g., a second password that is sent via SMS to your phone). Sadly, having worked with SMS for a while, it's only as secure as your phone service provider. While this factor is preferred by someone like your banking provider, that also makes it a great incentive to bypass it, for many bad actors. It's also not free to use, as there is usually a fee associated with sending an SMS.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Proximity&lt;/strong&gt; - Something the user has —  unlocking a Macbook when an Apple Watch is nearby, without using a password, for example. While it's usually used in physical devices, this factor stops being useful for web apps, requiring sensors to work. It also has the inherent flaw that both devices that are supposed to be close to each other can be stolen at the same time.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Biometric&lt;/strong&gt; - Something the user is or some physical characteristic the user has — the fingerprint or the face, for example. You'll see this as the most commonly used authentication mechanism for phones. When coupled with physical sensors, it's tough to beat. Since biometrics are free, they should be the default mechanism in 2FA. Unfortunately, you need advanced sensors to provide a high degree of security. Earlier versions of Face Detection on phones could be fooled with a person’s picture instead of the actual person, for example.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, depending on your application’s security level, you can choose how many factors you need — hence the multi-factor authentication mechanism involved. &lt;/p&gt;

&lt;h2&gt;
  
  
  What about risk-based authentication?
&lt;/h2&gt;

&lt;p&gt;There is another trend emerging in application security called risk-based authentication (RBA). It relies on multiple factors and spreads out the authentication points based on the current user transaction and the security level needed for that. &lt;/p&gt;

&lt;p&gt;RBA is used by companies like Google, Facebook, LinkedIn, and Amazon. For example, posting on Facebook only requires a user to be logged in but accessing profile settings requires an additional factor. The additional factor is usually an IP address or some other data if the IP address you’re using at the moment is not the one you commonly use for your account.&lt;/p&gt;

&lt;p&gt;One of the factors that's well suited in both cases, and trending recently, is the biometric authentication factor. It turns out that some other things are just as unique as a fingerprint or your face. &lt;/p&gt;

&lt;p&gt;For example, the way you type is pretty unique. So why not use that as an authentication mechanism? It doesn’t seem as easy to compare as a face or a fingerprint. No worries, someone else has done all the heavy lifting for you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5gm5ct334d3q91c7u2l9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5gm5ct334d3q91c7u2l9.jpg" alt="Typing Biometrics" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TypingDNA’s typing biometrics technology
&lt;/h2&gt;

&lt;p&gt;Cue TypingDNA. That's right, there is an API that fingerprints people by the way they type. That makes biometric authentication accessible without a physical sensor — and just as secure as a fingerprint. It also happens to be free for your users (e.g., compared to possession factors). &lt;/p&gt;

&lt;p&gt;Let's look at how you can add this extra layer of biometric authentication to your multi-factor authentication process.&lt;/p&gt;

&lt;p&gt;The TypingDNA API allows you to recognize people by the way they type, both on a keyboard or a mobile device. It also doesn't require any particular hardware or sensor. The SDKs act as recorders for the way users type on web apps and mobile apps. You can check those recordings against a previously saved typing "DNA" — hence the name. &lt;/p&gt;

&lt;p&gt;Personally, I've been watching TypingDNA for a while, and I'm impressed with how natural and simple it is to add on top of a traditional username/password authentication model. &lt;/p&gt;

&lt;p&gt;An average username/email combination has around 30 characters. That’s plenty of characters to use typing biometrics with a high degree of confidence. You can record and store the typing pattern when a user signs up and then verify the pattern every time they log in. It has the benefit of being a seamless experience. You’re checking two factors in the same step instead of traditional MFA, where each factor requires an extra step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9pfx1zpgaxhjrm3qg0wn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9pfx1zpgaxhjrm3qg0wn.jpg" alt="Integrate TypingDNA API" width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementing with the TypingDNA API
&lt;/h2&gt;

&lt;p&gt;In terms of implementing it, it's a three-part system. The first part is a recorder (TypingDNA provides this) that lives in your application and records the way users type when they perform a certain action, like logging in. The second part is your own back-end server application, and that's where the recorder sends the biometrics data. For the final step, you check that data against the saved biometrics TypingDNA has, using their REST API. &lt;/p&gt;

&lt;p&gt;It sounds pretty easy, doesn't it?&lt;/p&gt;

&lt;p&gt;It is.&lt;/p&gt;

&lt;p&gt;One of the advantages of using this in an MFA flow is that — as opposed to most 2FA solutions — the second step here is invisible to the user. You're using two factors that you're gathering at the same time, so there is no extra step for your users — meaning there are fewer reasons to not complete the verification process. I'd say that is a big user experience win.&lt;/p&gt;

&lt;p&gt;This approach can also replace some other existing forms of text or typing verification currently used — like Captcha. Instead of asking someone to type a single garbled word that’s hard to read or click several pictures of bikes, you can ask them to type a provided passphrase. &lt;/p&gt;

&lt;p&gt;This way, you’re not only improving the accessibility of your application, but you’re also going the extra mile in verifying the user is “not a robot.” In other words, you’re not only verifying a user is a person but with matching typing patterns, you’re verifying the user is the right person to access your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;If I’ve convinced you biometric authentication is the future, here are some resources that will help you integrate your application with the TypingDNA API.&lt;/p&gt;

&lt;p&gt;First, &lt;a href="https://www.typingdna.com/clients/signup" rel="noopener noreferrer"&gt;sign up here&lt;/a&gt;. And then use the:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.typingdna.com/docs/tutorials.html" rel="noopener noreferrer"&gt;Tutorials&lt;/a&gt; to help you get started.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://api.typingdna.com/index.html" rel="noopener noreferrer"&gt;API Documentation&lt;/a&gt; to help you when you’re implementing this into your application.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/TypingDNA/" rel="noopener noreferrer"&gt;GitHub Repositories&lt;/a&gt; full of demos and example implementations.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.typingdna.com/resources.html" rel="noopener noreferrer"&gt;Case Studies, Webinars, Blog, Whitepapers (and others)&lt;/a&gt; in case you need to sell this to your Product Manager first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s to adding MFA to your applications — the easy way — with TypingDNA!&lt;/p&gt;

</description>
      <category>security</category>
      <category>programming</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>2020, Thank You!</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Sat, 09 Jan 2021 18:50:00 +0000</pubDate>
      <link>https://dev.to/lakatos88/2020-thank-you-llf</link>
      <guid>https://dev.to/lakatos88/2020-thank-you-llf</guid>
      <description>&lt;p&gt;2020 was kind of shit. Go on, it’s OK to admit it. But when I look in the mirror, 2020 was a lot healthier for me than usual. I’ve seen quite a few 2020 reviews this past week. It’s the fashionable thing to do. Hence this is my first yearly review. I’m going to try to use this as a sort of guide for next year. Now, whilst most reviews I’ve read highlighted the things people couldn’t do in 2020, or the exact ways in which it sucked, I made a conscious decision to try to find things that actually went well for me in 2020, and not even mention any of the negative shit 2020 is famous for.&lt;/p&gt;

&lt;p&gt;It turns out, I didn’t have to look that hard for things to be thankful for. The &lt;a href="https://twitter.com/hashtag/DevRelLife" rel="noopener noreferrer"&gt;DevRel life&lt;/a&gt; is full of chaos, so the fact that I didn’t travel for most of 2020 unlocked a lot of possibilities. A lot of those things that kept being pushed to “when I get a change” got done, so truly, thank you, 2020, you haven’t been all shit. And I honestly think I couldn’t have done most of these things if I wasn’t forced to stop travelling. I certainly couldn’t have stopped travelling on my own. My idea of “taking it easy” this year was to have a flight booked every two weeks, instead of the usual two flights a week.&lt;/p&gt;

&lt;h2&gt;
  
  
  First of All, What Happened in 2020?
&lt;/h2&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1270113634245660674-409" src="https://platform.twitter.com/embed/Tweet.html?id=1270113634245660674"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1270113634245660674-409');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1270113634245660674&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  👷Switched Over to the Dark Side
&lt;/h3&gt;

&lt;p&gt;There were no cookies🤷. I’ve moved from an individual contributor role at Vonage this year to a manager position at Fidel. And in true Laka fashion, I still refuse to manage people. OK, I did manage a few people for a little while, but I’ve since spent most of my time trying to make myself redundant. Instead of building a team of Developer Advocates, like it’s the fashion, I’ve spent the past six months building a &lt;a href="https://alexlakatos.com/avocados/2020/12/06/creating-devrel-culture/" rel="noopener noreferrer"&gt;DevRel Culture&lt;/a&gt; inside Fidel, trying to make myself redundant.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1315613201703329792-228" src="https://platform.twitter.com/embed/Tweet.html?id=1315613201703329792"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1315613201703329792-228');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1315613201703329792&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  🏋️33% Less Laka
&lt;/h3&gt;

&lt;p&gt;I lost quite a bit of weight this year. 52 KG (110 Pounds) to be exact, which amounted to 33% of my body mass. There were a few factors that contributed to this one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I started looking at what I ate. No, it’s not a figure of speech. I literally take a picture of my food before I eat it. It forces me to pause, and figure out if what I have on my plate is right for me. I also used to send that picture to a random stranger I found on the internet and was paying to give me advice about my nutrition. It worked from the very first picture because I was so ashamed with the quantity on my plate, I took part of it off and re-did the picture. Didn’t put the food back on the plate afterwards. The only thing that kept me honest was the eye-watering amount of money I paid for the service, I wasn’t going to pay to cheat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I started going to the gym. Maybe a little too much, and it’s turning into an addiction. I’ve got 3 sessions a week with a personal trainer, and another 7 without one. The PT sessions are all focused on functional training, while the ones without are all about burning fat in steady-state cardio, usually on a treadmill. Because that allows me to listen to audiobooks or watch things on YouTube, it feels less boring, and it’s currently my happy place.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I did the math. With lockdown happening, I started cooking all my meals instead of eating out. That made it easy to better track what I ate in MyFitnessPal. My Fitbit watch tracks my calories burned during the day, so I started paying closer attention to the difference between what I ate and what I burn. I try really, really hard to make sure I’ve got a deficit of at least 1000 calories a day.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1311639609068212224-161" src="https://platform.twitter.com/embed/Tweet.html?id=1311639609068212224"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1311639609068212224-161');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1311639609068212224&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  💨Gave up Smoking
&lt;/h3&gt;

&lt;p&gt;As we started going to the gym more and more, the cigarettes began to affect our training. Julia was the first to quit, her training program is a lot more intense than mine. But after a few months of smoking alone, I just didn’t get the same benefits out of it. The negative impact of being the only smoker in the house outweighed the stress release aspect of it. So one day I decided to quit, cold turkey. Of course, that didn’t happen. Just the idea that I was running out of cigarettes sent me into a mild panic attack. I think that’s been hardwired into any smoker out there so deep, that just the idea I was running low was too much to bear.&lt;/p&gt;

&lt;p&gt;So I tried tricking the lizard brain inside and bought a fresh pack of smokes. Of which I smoked exactly 5 cigarettes over the course of 3 days. And those were the last I’ve smoked. But I still carry around that unfinished pack of cigarettes with me, everywhere I go. I can smoke any time I want to, I just &lt;em&gt;choose&lt;/em&gt; not to smoke. I think that’s the trick that finally helped me to quit smoking. The other time I tried, I lasted a whole of 10 hours without smoking, after which I proceeded to make up for it. It’s been 5 months this time, and hopefully, this one is for good.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1337717723158241280-644" src="https://platform.twitter.com/embed/Tweet.html?id=1337717723158241280"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1337717723158241280-644');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1337717723158241280&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  🥑36 Issues of the Developer Avocados Weekly Newsletter
&lt;/h3&gt;

&lt;p&gt;As you’ve probably figured out by now, a year has a bit more than 36 weeks. 52 if you must be exact. Why am I celebrating this, though? Because it’s a hell of a lot more than 0. That’s right, in a shit year, with taking a month at a time off from the newsletter, we kept finding the strength and motivation to keep coming back to send it again. Eventually. While we technically made no money from it.&lt;/p&gt;

&lt;p&gt;And the fact that we could still find passion in something pre-pandemic, that’s definitely worth celebrating in my book. Oh, and towards the end of the year, we found the energy to run an &lt;a href="http://avocados.dev/" rel="noopener noreferrer"&gt;advent calendar with 24 Developer Avocados&lt;/a&gt;, which required us to get out of our comfort zone and reach out to people we haven’t met. Especially in a time when people can’t be expected to give a damn.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1257642627702325250-208" src="https://platform.twitter.com/embed/Tweet.html?id=1257642627702325250"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1257642627702325250-208');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1257642627702325250&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨Got a New Website
&lt;/h3&gt;

&lt;p&gt;After 4 years, I’ve finally got the time to make a new website. Or at least, I had the time to stand there and look pretty while &lt;a href="https://chenhuijing.com/" rel="noopener noreferrer"&gt;Hui Jing&lt;/a&gt; did all the work. But it’s happened, and it made me want to add more to the website, regularly. I’ve written more articles for it this year than any other so far. The new &lt;a href="https://twitter.com/lakatos88/status/1321423080095469568" rel="noopener noreferrer"&gt;habit-forming routine&lt;/a&gt; I’ve got might have something to do with this as well. So far, I’ve got 73 days in a row of writing 100 words or more. “Science” says that if I got to 66, it’s a habit and here to stay. No matter the outcome, it has certainly helped me write more this year. I think my goal was 12 articles a year for the past few years, but this is the first year I’ve actually managed to do it. And then some. I think I managed to publish 4 articles in a single week, and that’s something I didn’t think I could do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About 2021?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  😷Survive
&lt;/h3&gt;

&lt;p&gt;Get to the next level, year, whatever. That’s it. That’s the resolution.&lt;/p&gt;

&lt;p&gt;If survival seems too achievable, I’ve got a few other things I could try doing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a best-in-class Developer Portal. Open-source it from day 1, so other people could easily use it. I’ll consider this a success if it’s as easy to deploy as it would be to do one of the static-site generators.&lt;/li&gt;
&lt;li&gt;Publish every week. I’ve started early on this one. I’ve started writing a minimum of 100 words every day. &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;You can follow along with my progress on Twitter&lt;/a&gt;. But I’m hoping that’s going to help me publish 52 articles this year. I’ll consider this goal a success even if it’s 52 articles, and not necessarily one every single week.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>personal</category>
      <category>review</category>
      <category>thanks</category>
    </item>
    <item>
      <title>How a Good Onboarding is Improving the Developer Experience</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Wed, 09 Dec 2020 11:16:00 +0000</pubDate>
      <link>https://dev.to/fidel/how-a-good-onboarding-is-improving-the-developer-experience-1l9m</link>
      <guid>https://dev.to/fidel/how-a-good-onboarding-is-improving-the-developer-experience-1l9m</guid>
      <description>&lt;p&gt;You've probably noticed &lt;a href="https://twitter.com/FidelHQ/status/1336273292458594309" rel="noopener noreferrer"&gt;the new and shiny&lt;/a&gt; &lt;a href="https://dashboard.fidel.uk/" rel="noopener noreferrer"&gt;Fidel Dashboard&lt;/a&gt; we released recently. There were a few reasons we came up with a whole new dashboard experience, and &lt;a href="https://fidel.uk/blog/fresh-take-fidel-dashboard" rel="noopener noreferrer"&gt;Katherine goes over all those reasons&lt;/a&gt; in her blog post. One of those reasons was that new users had trouble quickly unlocking the power of Fidel. When using our API, the "Aha!" moment comes when you see your first test transaction. But getting there wasn't the easiest of journeys for everyone.&lt;/p&gt;

&lt;p&gt;We pride ourselves on how easy the Fidel API is to work with and often get feedback on the ease of the integration. That being said, before someone even starts integrating with the API, they tend to explore our dashboard to help them understand how Fidel works.&lt;/p&gt;

&lt;p&gt;With our old dashboard, we lost users in the middle of their onboarding because we had no onboarding experience in the Dashboard. We had hoped they would find their way around, but we should’ve been better hosts. Let me walk you through it.&lt;/p&gt;

&lt;p&gt;The first thing a user needs to do is create a Program. But, the old dashboard landed people on the Transactions page. And while that is a valid action for all accounts that have gone through the setup steps, because that's where most people need to land, it was proving confusing for first-time users. Let's assume first time users managed to create a Program. They would try to add a Location to that program, but that wasn't possible before first creating a Brand. They needed to figure than one out on their own, and then come back and create a Location. Let's assume some users managed to do that, and create a Location.&lt;/p&gt;

&lt;p&gt;Now, you'd imagine you can create one of those fabled test transactions. You couldn't create one on the Transactions tab, you needed to explore around the Dashboard and land on the API Playground tab. And there, you have a menu entry to create your first transaction. In the UI, you'll notice you needed a Program, a Location and a Card.&lt;/p&gt;

&lt;p&gt;Wait a minute, we didn't talk about Cards yet. That's because users haven’t added any yet. So users needed to add a Card before they could make a test transaction. On the Dashboard though, we didn't mention that users could only use test card numbers, or what those numbers were for the three card networks: Visa, Mastercard and Amex. Users had to poke around the Fidel Documentation to figure out what those test card numbers were, and then add a test Card. You could add a card both with the UI (which uses the &lt;a href="https://fidel.uk/docs/web-sdk" rel="noopener noreferrer"&gt;Fidel Web SDK&lt;/a&gt;), or in the API playground. After you'd have done all that, congratulations, you could finally create your first test transaction.&lt;/p&gt;

&lt;p&gt;As you can imagine, this wasn't an easy discovery journey, and we had quite a few people dropping off at various steps in this user journey. And we couldn't really blame them. Some of them were highly motivated, so they reached out to Support. For those users, we either had to do a bit of handholding or send them to our various blog posts or documentation explaining these steps. The blog posts and the documentation help you get set up using the API without using the Dashboard for most of those steps. While that was proving successful, it was also proving time-consuming for our small team.&lt;/p&gt;

&lt;p&gt;We've decided to take all that we learned from those hand-holding sessions and put them into an automated onboarding process that shows up first thing for all new users. Here's a video of it. We'll go through the steps we took, and why in a minute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F371oyv263m7hao46fa0r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F371oyv263m7hao46fa0r.gif" alt="Fidel Dashboard Onboarding Flow" width="720" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've decided to take a few steps to alleviate these problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instead of having everyone create the same setup data on their own, we are now doing that for every new account. Now every new account gets enough demo data so they can make their first transaction: a demo Program, a demo Brand, 3 Locations in the UK and a Visa test Card. There's also one Auth Transaction in there. We've actually added the new demo data while we were developing the new dashboard, and we saw a slight increase in the number of users that were getting to their first transaction in the old Dashboard.&lt;/li&gt;
&lt;li&gt;The second step we took was to add a tour for first-time users on the new dashboard that walks people through the data and explains that:

&lt;ul&gt;
&lt;li&gt;Programs are containers, where you add brands, locations and link payment cards.
&lt;/li&gt;
&lt;li&gt;Brands are the parent object of Locations and require consent from an authorized merchant to track Transactions in their locations.
&lt;/li&gt;
&lt;li&gt;Locations are geolocation data points and you can simply add them to a Program.
&lt;/li&gt;
&lt;li&gt;Cards are linked to a Program, and you can conveniently use &lt;a href="https://fidel.uk/docs/mobile-sdks" rel="noopener noreferrer"&gt;our SDKs&lt;/a&gt; to link cards in your apps.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;After the onboarding flow tells you all about the setup blocks and the particularities of running in test mode versus live mode, it drops you off in the new API Playground, where you can make your first test transaction. We've redesigned the API playground as part of the developer experience as well, giving it a more modern look and feel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2l1k8csleaaw292125vv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2l1k8csleaaw292125vv.gif" alt="Fidel Dashboard API Playground" width="720" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The last bit of the onboarding flow is also doing a bit of off-boarding, letting people know they can access more resources for working with the API in the &lt;a href="https://fidel.uk/docs/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;, on the &lt;a href="https://reference.fidel.uk/" rel="noopener noreferrer"&gt;API reference&lt;/a&gt; pages, and on &lt;a href="https://fidel.uk/blog" rel="noopener noreferrer"&gt;the blog&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Adding this onboarding flow has improved our average “Time to First Transaction” from days to minutes. And because our users are developers, this has been one of the best things we have done to improve the developer experience.&lt;/p&gt;

&lt;p&gt;We've got some more things planned, and I don't want to spoil the surprise, so stay tuned for our next little DX chat. In the meantime, feel free to &lt;a href="https://twitter.com/FidelHQ" rel="noopener noreferrer"&gt;reach out on Twitter&lt;/a&gt; or in the &lt;a href="https://community.fidel.uk/" rel="noopener noreferrer"&gt;Fidel Developer Community&lt;/a&gt; forum.&lt;/p&gt;

</description>
      <category>ux</category>
      <category>dx</category>
      <category>devrel</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Creating a DevRel Culture</title>
      <dc:creator>Alex Lakatos 🥑</dc:creator>
      <pubDate>Sun, 06 Dec 2020 23:58:00 +0000</pubDate>
      <link>https://dev.to/lakatos88/creating-a-devrel-culture-9db</link>
      <guid>https://dev.to/lakatos88/creating-a-devrel-culture-9db</guid>
      <description>&lt;p&gt;How big is your Developer Relations team? I’m betting it’s small, same as mine. Unless you work for Microsoft, Google, Amazon, Twillio or Vonage(The Artists Formerlly Known as Nexmo), it’s pretty hard to justify a double-digits DevRel team. And that’s OK; not everyone needs 70 people to do Developer Relations. It wouldn’t hurt though. Probably that’s why everyone is scrambling to justify their program right about now and to increase their budget for next year.&lt;/p&gt;

&lt;p&gt;What happens if you work for a company that can’t afford 10 Developer Advocates? I happen to work for a startup with 60 people; it’s been tough to sell a big team to my CEO. And trust me, I’ve tried.&lt;/p&gt;

&lt;p&gt;I talked last week about starting a Developer Relations Program, but it’s still a lot of work for a team of one. My challenge was scaling a DevRel program without increasing the headcount. I’ve achieved that by creating a DevRel Culture instead.&lt;/p&gt;

&lt;p&gt;Yeah, you’ve read that right. And it’s not some HR hocus pocus. Creating a DevRel Culture turns out to be highly effective. While you probably can’t have anyone else inside your company that can do all the things you do, it doesn’t mean that you can’t find someone that is more suited to do a little slice of what you do. The trick is finding multiple people, each able to do one aspect of your job better than you. There are quite a few skills required of a Developer Advocate, but most of them are found in other roles within a company. So why not use those for help?&lt;/p&gt;

&lt;p&gt;If you haven’t read about my journey to build a 1st-year DevRel Program, let give you some context. I’ve identified a few day-to-day activities that I should be doing, to make a difference. Let’s take a look at those activities, and then see where in the company you could find people to do a better job than you. Basically doing 20% DevRel for 80% of the impact.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing the &lt;a href="https://fidel.uk/docs/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt; and &lt;a href="https://reference.fidel.uk/reference" rel="noopener noreferrer"&gt;API Reference&lt;/a&gt; - The engineers writing the feature are good people to document it. Or the product manager that wrote the use case for it. Or the Quality Assurance Engineer that tested it. Depending on the size of your company, you might even have all three of those people to help.&lt;/li&gt;
&lt;li&gt;Building &lt;a href="https://fidel.uk/docs/web-sdk" rel="noopener noreferrer"&gt;SDKs&lt;/a&gt; - The engineers that wrote the code for the API can build the SDK wrapper for it as well. And since they write production code every week, they’ll most likely do a better job of it than you.&lt;/li&gt;
&lt;li&gt;Create demo applications - You guessed it by now. If it has to do with coding, your Engineering department can probably do a better job than you.&lt;/li&gt;
&lt;li&gt;Write &lt;a href="https://fidel.uk/blog/author/laka" rel="noopener noreferrer"&gt;blog posts&lt;/a&gt; - Anyone, and I mean literally, anyone in the company can write a blog post. Now, it might not come as easy or natural for everyone, but here is where you come in. You’re used to lowerering barriers to entry for developers using your product, why not apply the same principles for writing articles for your blog? No one can fake the authenticity of the people building your product, not even you. So why not have them tell their stories, instead of you? Sure, you’ll get enough pushback, everyone is afraid of writing. So make it easy for them. It’s your job to guide people in writing that first blog post. And try to make it as easier for them as possible. For example, I’ve used &lt;a href="https://fidel.uk/blog/we-the-people-katherine-degnen/" rel="noopener noreferrer"&gt;an interview format&lt;/a&gt; to get people to write their first blog post. I’ve had 30-minute calls with people where they presented their idea, and I’ve had those transcribed and edited into a blog post. I’ve also had people come up with their own ideas and writing them inside the week because they were passionate about it. But most importantly, I’ve bribed everyone involved with limited edition quality swag 😊&lt;/li&gt;
&lt;li&gt;Sponsor online events - Your marketing team has probably sponsored a lot more events than you. They’ve been around longer. And their events cost a hell of a lot more than yours. They’ve got all that experience dealing with the event organizers. So ask them for help here!&lt;/li&gt;
&lt;li&gt;live-stream on Twitch / Youtube - You’ve got another group of people in the company that are trained for speaking at online events, mainly webinars. And that’s your Sales team. So get them to stream some of their webinars live on Twitch, and see the magic happen.&lt;/li&gt;
&lt;li&gt;Give talks at online events - Your CEO probably has a lot of experience pitching your investors. And they probably deliver a quarterly update to your Board of Directors. They’ve also probably dealt with the press before. So they’ve got all the training they need in order to go on stage and tell a compelling story, backed with data. If time is a constraint, you’ve got a backup here. Your Sales team is also used to speaking in front of small groups of people, with lots of slides. Get them to drop the sales pitch, and you’ve got a talk ready to be given, with a trained person ready to do it.&lt;/li&gt;
&lt;li&gt;Answer support queries - Your engineers are the people you usually go to with the support queries. So why not eliminate the intermediary (yes, that’s you), and have the support queries go to the on-call engineers right away?&lt;/li&gt;
&lt;li&gt;Have customer calls - Your Product Manager is the person you go to with feedback after each call. So why not save yourself the hassle, and have them join those calls to begin with? Sure, maybe they’re not trained to gather feedback, but you can help them out during the first calls, do a bit of handholding, and then take the whole thing off your plate. It’s going to help free you for other things.&lt;/li&gt;
&lt;li&gt;Maintain the &lt;a href="//community.fidel.uk/"&gt;developer community&lt;/a&gt; forum - In here, most questions have to deal with using your product. Your Support people are probably your best bet. They are trained to answer questions coming from existing customers, they can do the same for people who aren’t exactly customers, but who have questions around your APIs.&lt;/li&gt;
&lt;li&gt;Create a feedback mechanism between the product and developers using the product - This can be easily solved with technology. Changing the Developer Experience of your product to have a feedback mechanism will save yourself the hassle. The only trick is getting your Product Manager to actually read and action that feedback. I’m kidding, it’s not a trick at all, and they’ll probably thank you for making it easier for them to do their job.&lt;/li&gt;
&lt;li&gt;Help with &lt;a href="https://careers.fidel.uk/" rel="noopener noreferrer"&gt;recruitment efforts&lt;/a&gt; - Your HR person is better equipped for recruitment purposes, so why not have them help?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve spent the past 6 months at Fidel trying to help other people to do my job, basically trying to make myself redundant. And it’s worked brilliantly! It doesn’t mean I do absolutely nothing now, but it does mean that I provide guidance and review most things before we put them out, instead of trying to do everything, and badly!&lt;/p&gt;

&lt;p&gt;I should also mention I come from a culture that relies heavily on… incentive. They’ve tried to legalize bribes a few years back. So I’m quite familiar with using incentives to motivate reluctant people.So if you can’t convince your coworkers that the satisfaction of a job well done is enough…. bribe them! I’m currently using swag as bribes, Rona is preventing me from using a more traditional approach: free lunches and a round at the pub.&lt;/p&gt;

&lt;p&gt;If you need help figuring out how to convince people to help, or to introduce you to The Way of The Bribe™️, feel free to &lt;a href="https://twitter.com/lakatos88" rel="noopener noreferrer"&gt;DM me on Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>community</category>
      <category>dx</category>
      <category>avocados</category>
    </item>
  </channel>
</rss>
