{"componentChunkName":"component---src-templates-blog-list-template-js","path":"/112","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"excerpt":"A login screen is a web page or an entry page to a web/mobile application that requires user identification and authentication, regularly…","fields":{"slug":"/engineering/loginscreen-testing-tips/"},"html":"<p>A <strong>login screen</strong> is a web <strong>page</strong> or an entry <strong>page</strong> to a web/mobile application that requires user identification and authentication, regularly performed by entering a username and password combination.\nThe login process is the most essential feature for any system/application as it provides access to an entire <strong>web-site/application</strong> or part of it. So, testing of the login screen needs complete coverage. </p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 568px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 61.9718309859155%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAABYlAAAWJQFJUiTwAAABAElEQVQoz5WRMU7FMAyGextOwQW4AXdiZmZgYgQhMSJWJIQEGyw8oVLcpHp5aUhspwGHBtSCQH2fXKup6vr//1ZEZIzpe2s2G2v798UQYSVX27Zaa4Dc45CJY8V5DQW5SSnlYUT03o8fk0dxMWXYWhuZKcPbDYuMqZO0jOIZQ2iaRislztdrs11gIsC5PuOc92GhZtErfqvvQ0nyb5gjEo8l4SCGanyfv/h/21Q2UpDNHEL4ncc8xdzB4fkjSJ0+vF7XhmRYfL/UdQuglAKAruskuh/jccjnk7vVzsHZ/vHV7uHF3tGlffPlVw0T0lxe3vzZHdLts7qv9c0KnjrLhB/ptboRLdjeDQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Login Screen\"\n        title=\"Login Screen\"\n        src=\"/static/d6d1c63e505b5c45c02d656bf8c80e93/10e91/Login-Page.png\"\n        srcset=\"/static/d6d1c63e505b5c45c02d656bf8c80e93/10e91/Login-Page.png 568w\"\n        sizes=\"(max-width: 568px) 100vw, 568px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Mentioned below are few tips that can be referred for testing the login screen of any system/application.</p>\n<p><strong>UI/UX:</strong></p>\n<ul>\n<li>Tab Order - Check if there is a logical order for using the tab key</li>\n<li>Focus on Username field - Check if, while landing on the page, the cursor is at the username field </li>\n<li>Use of enter key - Check if Login button is activated on selecting enter</li>\n<li>Accessibility - Check if all the fields on the page are correctly identified and labeled</li>\n<li>Look &#x26; Feel - Check if the page looks fine, and everything is aligned correctly.</li>\n<li>Content - Check if the content of the page is up to the mark. Are there any typos in the labels, controls of the screen?</li>\n<li>Links - Check if the page contains any existing links, and are these links still valid.</li>\n<li>Responsiveness - Check the responsiveness of the login screen in multiple sizes of computer monitors.</li>\n</ul>\n<p><strong>Security Checks:</strong></p>\n<ul>\n<li>Password - Check if the password shown or hidden(using asterisks)</li>\n<li>Password - Check if you can copy &#x26; paste the password from other applications.</li>\n<li>Password - Check if there is a minimum complexity on the password</li>\n<li>Password - Check if there is a 'Show password' option that is there or not. If yes, then check if it is working fine.</li>\n<li>Common Password Lookup - Check if the login screen is performing a lookup in the list of the most common passwords (<a href=\"https://en.wikipedia.org/wiki/List_of_the_most_common_passwords\">CommonPasswordsList</a>)</li>\n<li>View Source - Check the source code of the application and check if any valuable information given away in the HTML source code</li>\n<li>SQL Injection - Check if the login page is vulnerable to SQL input</li>\n<li>Pages - Check if you can access the other pages of the application without logging in.  </li>\n<li>URL Manipulation - Check if you are able to access the other pages of the application by editing the URLs, to gain access where it should not be allowed (without login).</li>\n<li>Multiple accounts - Check if by using different accounts, you can be logged in at the same time in the same browser</li>\n<li>Cookies - Check if you can edit and/or disable the cookies.</li>\n</ul>\n<p><strong>Functionality:</strong></p>\n<ul>\n<li>Login - Check the login functionality with valid/invalid credentials and without providing credentials.</li>\n<li>Logout - Check the logout functionality. Check on logging out; the user is logging out completely.</li>\n<li>Forgot password - Check if the forgot password option is available or not. And if it is there, does it work correctly. Also, check if it is prone to a security failure or URL manipulation</li>\n<li>Back and Forward buttons - Check how the application copes when using the browser's 'Back' and 'Forward' buttons.</li>\n<li>Remember me - Check if there is a \"Remember me\" option. And if it is present, then does it work as standard. Also, check what happens if the password is changed.</li>\n<li>Compatibility - Check the Login/Logout functionality with all possible valid/invalid cases in other browsers.</li>\n<li>Data - Check the username &#x26; password fields for data validation (Is there a minimum or maximum length of characters, boundary-values, what are the allowed characters, etc.).</li>\n<li>Error handling - Check how various errors are handled and displayed (for negative cases).</li>\n<li>Javascript-off test - Check if the login form still works when JavaScript is disabled.</li>\n<li>2FA Check - Check the login process when two-factor authentication is being provided; then test with valid/invalid token, test with valid/invalid backup code, test lockout procedure, and test recovery process.</li>\n</ul>\n<p><strong>Thanks for reading and happy testing!</strong></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"October 30, 2020","updated_date":null,"description":"Login process is the most important feature for any system/application as it provides access to an entire web-site/application or part of it. This article is providing you with some important tips & ideas about login testing.","title":"Login Screen - Tips and Ideas for Testing","tags":["LoginScreen","TestingTips"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/738ab0a6b8bc95b50a8be6d5d7419083/14b42/CoverImage.jpg","srcSet":"/static/738ab0a6b8bc95b50a8be6d5d7419083/f836f/CoverImage.jpg 200w,\n/static/738ab0a6b8bc95b50a8be6d5d7419083/2244e/CoverImage.jpg 400w,\n/static/738ab0a6b8bc95b50a8be6d5d7419083/14b42/CoverImage.jpg 800w,\n/static/738ab0a6b8bc95b50a8be6d5d7419083/47498/CoverImage.jpg 1200w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Sudhey Sharma","github":"sudheysharma","avatar":null}}}},{"node":{"excerpt":"What is JAMstack JAMstack is not a specific set of tools or any language. Still, it's a new and modern way of building apps and sites that…","fields":{"slug":"/engineering/jamstack-introduction/"},"html":"<h2 id=\"what-is-jamstack\" style=\"position:relative;\"><a href=\"#what-is-jamstack\" aria-label=\"what is jamstack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What is JAMstack</h2>\n<p>JAMstack is not a specific set of tools or any language. Still, it's a new and modern way of building apps and sites that deliver better performance, higher security, lower scaling cost, and better developer experience. It achieves this by retaining most of the client-side functionality and abstracting all other functionality to the third-party API. APIs do all the heavy lifting. It is based on the client-side, and it doesn't depend on the backend server.</p>\n<p>JAM stands for <strong>JavaScript</strong>, <strong>APIs</strong> &#x26; <strong>Markup</strong>.</p>\n<p><strong>JavaScript</strong>:  Any dynamic programming during the request/response cycle is handled by the JS, running entirely on the client-side. It can be any front-end framework or library or even vanilla JavaScript.\n<strong>APIs</strong>: All server-side processes or database actions are contained in reusable APIs, accessed over HTTPS with JavaScript.  These can be custom-made or leveraged third party services.\n<strong>Markup</strong>:   Template markup must be pre-built at the time of deployment, usually using a site generator for content sites or a build tool for web applications.</p>\n<blockquote>\n<p>Modern web development architecture based on client-side JavaScript, reusable APIs, and pre-built Markup.</p>\n</blockquote>\n<p>The term was introduced by Mathias Biilmann, co-founder of  <a href=\"https://www.netlify.com/\">Netlify</a>.</p>\n<p>With the JAMstack, we have no longer talk about specific technologies such as web servers, programming languages, or databases.</p>\n<p>Check the following best practices defining a JAMstack project:</p>\n<ul>\n<li><strong>Entire site/app on a CDN</strong>\nJamstack project does not rely on server-side code; they can be distributed instead of on the same server. Directly serve from CDN unlocks speed and performance that cannot be beaten. The more your app can push you over the edge, the better the user experience.</li>\n<li><strong>Atomic deploys</strong>\nAs Jamstack projects get big, new changes may require redeploying hundreds of files. Uploading them one at a time can cause an inconsistent situation during the process. You can save this with a system that lets you do \"nuclear reflection,\" where any changes don't go live until all the converted files have been uploaded.</li>\n<li><strong>Instant cache invalidation</strong>\nWhen you do continuous deployment, then you need to know that when the deployment goes live, it is live. Remove any doubt by ensuring that your CDN can handle the cache purge immediately.</li>\n<li><strong>Everything lives in Git</strong>\nWith the Jamstack project, anyone should be able to clone a single clone, install any required dependencies with the standard process (such as npm install), and be prepared to run the full project locally. To clone a database, no complex installs. This contributor reduces friction and also simplifies the staffing and testing workflow.</li>\n<li><strong>Automated builds</strong>\nJamstack markup is prefabricated; content changes won't go live until you build another one. Automating this process will make you very frustrated. You can do this with a webhook or use a publishing platform that automatically includes the service.</li>\n</ul>\n<h2 id=\"value-of-jamstack\" style=\"position:relative;\"><a href=\"#value-of-jamstack\" aria-label=\"value of jamstack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Value of JamStack</h2>\n<p>We can easily understand the JAMstack value when comparing it with a monolithic architecture, today's most common practice in Web development.  In a monolithic project, the frontend is closely coupled with a backend server, e.g., node js.  Each page request to backend server which pulls data from database renders into Html and then send it across the network.  A single page gets regenerated every time the server receives a request for that URL.\nIn a JAMstack architecture, the page request does not go to the server for Html because it directly fetches Html from CDN, where the Html file has been pre-built, and it's ready to be downloaded; that's why no server is involved here.</p>\n<h2 id=\"workflow-comparison-jamstack-vs-traditional\" style=\"position:relative;\"><a href=\"#workflow-comparison-jamstack-vs-traditional\" aria-label=\"workflow comparison jamstack vs traditional permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Workflow comparison (JAMstack vs. traditional)</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 75.07692307692308%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAACjElEQVQoz2VSW08TQRTmx/gn/AvG+KyJr77Io4lPPIAiCCYGiAGiJN7AmKKBaNWExAabghQFWnqB1gLtXtntXmevM7Mz62y3VBJPvsnOnG++nDPfnqH4IhzXN01gA8d1/TRDKR2wtu0wyrTsEMJBcojxBDsxAR5QTE2wdClwVRyaOAQIIcIicuIIWLpoaILe5T2QsAiCRMzWyd7L+YmbkbDU+TXNYDeeoc48ljJBEDC2kJ14v3An4l80tyZOi1N6fS6WFqH8ibWViH/n5kfvXXdPFhihVmbU6mzELw7E629H5sZvMbFSnulWZrTaHBUWkfw5EbNFIi+mLkG2ZZ5rqkCxjYLLbScs9I2zs6YotSNoocDA0Om3PfCmwRn7x2Jy7CWZmF6Y5oZksyxWz/TLLiaGQXCKrApxG063bJ3vU7eB7RoCLYQgKwztRqCVkH0E1DI0a4xFjHXaaWXMNzcOdlZAfVLeH1dKj6z6VNiaxsLrMIQxCbhmtrBXbFfeGIdj3O6YWX2MT6eRmCE9w4jCFVu1bz6XwfIakj76/AcoZqCyAdkvJaEq7HKdEuCzSFxVj5dBO4Ol1VD90XebUsweyL4dudvi5SRBopiSxDB2haKYepRGx21J1s3kPokoIf8MIz38EcwGr9PePjWMEJr6F9H48EQVum56TE1LxIaww9XXY2fbk78zULOA9U2o78LeJMqtnNL6ElsFm9twpRzS8lDNhUap3/bzp3dv37jiNyfN6gPmil176NbHEL+UDsn94Wsjw1dp54leHjUqjB33jkaR+C41LN7OZ5dfzXpKIVC3fKXANr6Sh8ZBWjm7vvJ1bYlYRaht9/ATdgvQrPYr9+fk4iV0gEvzQP8Di795GCpZw3zUjgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"jamstack-vs-traditional-workflow\"\n        title=\"jamstack-vs-traditional-workflow\"\n        src=\"/static/aaa765402caa478feef7b91e319d5983/e5715/image1.png\"\n        srcset=\"/static/aaa765402caa478feef7b91e319d5983/a6d36/image1.png 650w,\n/static/aaa765402caa478feef7b91e319d5983/e5715/image1.png 768w,\n/static/aaa765402caa478feef7b91e319d5983/d9199/image1.png 960w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p><strong>Traditional workflow</strong></p>\n<p>→ Building and hosting are closely coupled.<br>\n→ Whenever a user requests a page, The file request to the back end and interacts with a database, back-end code, server, browser, and caching layers.<br>\n→ Updated code is pushed to servers often through FTP. The database must be updated again.\n→ Updated content is also pushed through CMS like WordPress, Joomla, or drupal.</p>\n<p><strong>JAMstack workflow</strong></p>\n<p>→ Building and hosting are loosely coupled.<br>\n→ Whenever a user requests a page, The file is already pre-built and directly served to the browser from a CDN.<br>\n→ Updated code is pushed through Git; Modern tools like static site generators easily re-built the entire site.\n→ Updated content is also pushed through GIt or static site CMS.</p>\n<h2 id=\"why-the-jamstack\" style=\"position:relative;\"><a href=\"#why-the-jamstack\" aria-label=\"why the jamstack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why the JAMstack?</h2>\n<p>A JAMstack architecture can bring all sorts of benefits to the sites and project workflows. Some of the key benefits are:</p>\n<p><strong>Faster performance:</strong> Building JAMstack helps to get pages generated at deploy time since they are mainly stored as Markup and can be served over a CDN.\n<strong>Higher security:</strong> JAMstack websites reduce server and database, so we don't need to worry about vulnerabilities anymore.\n<strong>Lower cost:</strong> It uses fewer resources, so comparably, it's lower than Others.\n<strong>Better developer experience</strong> Frontend developer can focus on frontend development without tied to monolithic architecture. Static site generators remove the need to maintain a separate stack for content and marketing.</p>\n<h2 id=\"thats-a-wrap\" style=\"position:relative;\"><a href=\"#thats-a-wrap\" aria-label=\"thats a wrap permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>That's A Wrap!</h2>\n<p>In a JAMStack architecture, however, the frontend and backend are decoupled. A frontend consists of JavaScript, HTML, and CSS. SSG generates these files during the build process and sends it over a CDN.</p>\n<p>A JAMStack backend is a content API that returns JSON/XML. This API can be a  hosted datastore, a  headless CMS, serverless functions, or a custom application.</p>\n<h2 id=\"useful-resources\" style=\"position:relative;\"><a href=\"#useful-resources\" aria-label=\"useful resources permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Useful resources</h2>\n<ul>\n<li><a href=\"https://jamstack.wtf/\">JAMstack WTF</a></li>\n<li><a href=\"https://github.com/automata/awesome-jamstack\">Awesome JAMstack</a></li>\n<li><a href=\"https://jamstack.slack.com/join/shared_invite/enQtNjc4OTI1NDk3NDI1LWIxZjk1YWRjOWVlMzM0MTVlMTg4YmY1OTBjZDc1M2I3N2NhODBlZDNmNjAzMGMwNzI5MTVlMWEwYjBiMTU2NzE\">JAMstack Community Slack</a></li>\n<li><a href=\"https://css-tricks.com/tag/jamstack/\">JAMstack on CSS-Tricks</a></li>\n<li><a href=\"https://jamstackconf.com/\">JAMstack_conf</a></li>\n<li><a href=\"https://www.heavybit.com/library/podcasts/jamstack-radio/\">JAMstack Radio</a></li>\n<li>JAMstack examples</li>\n</ul>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"October 29, 2020","updated_date":null,"description":"You may have heard the term JAMstack before, but you may not have understood what it means. In this article, We will introduce you to JAMstack as to why you need, best practice, and value.","title":"Introduction to JAMstack","tags":["Jamstack","Web"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/bcb720c279e21781ba1caeeec7a1e54e/ee604/jamstack_cover.png","srcSet":"/static/bcb720c279e21781ba1caeeec7a1e54e/69585/jamstack_cover.png 200w,\n/static/bcb720c279e21781ba1caeeec7a1e54e/497c6/jamstack_cover.png 400w,\n/static/bcb720c279e21781ba1caeeec7a1e54e/ee604/jamstack_cover.png 800w,\n/static/bcb720c279e21781ba1caeeec7a1e54e/f3583/jamstack_cover.png 1200w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Versha Gupta","github":"vershagupta","avatar":null}}}},{"node":{"excerpt":"Overview React Speech Recognition is a react hook that accesses the Web Speech API to convert speech from the machine’s microphone to the…","fields":{"slug":"/engineering/quick-look-at-react-speech-recognition/"},"html":"<h2 id=\"overview\" style=\"position:relative;\"><a href=\"#overview\" aria-label=\"overview permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Overview</h2>\n<p>React Speech Recognition is a react hook that accesses the Web Speech API to convert speech from the machine’s microphone to the app’s React components.</p>\n<p>There are two hooks in this framework:</p>\n<ul>\n<li><em>useSpeechRecognition</em>, a React hook that gives component access to a transcript of speech picked up from the user’s microphone.</li>\n<li><em>SpeechRecognition</em> manages the global state of the Web Speech API, exposing functions to turn the microphone on and off.</li>\n</ul>\n<h2 id=\"prerequisites\" style=\"position:relative;\"><a href=\"#prerequisites\" aria-label=\"prerequisites permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Prerequisites</h2>\n<p>This version requires React 16.8 so that React hooks can be used; please see the full framework README <a href=\"https://www.npmjs.com/package/react-speech-recognition\">here</a> for more information.</p>\n<p>Note: This framework uses WebSpeech API. Browser support for this API is currently limited, with Chrome having the best experience. As of June 2020 these browsers support the API:</p>\n<ul>\n<li>Chrome (desktop): this is by far the smoothest experience</li>\n<li>Microsoft Edge</li>\n<li>Chrome (Android): a word of warning about this platform: there can be an annoying beeping sound when turning the microphone on. This is part of the Android OS and cannot be controlled from the browser</li>\n<li>Android webview</li>\n<li>Samsung Internet</li>\n</ul>\n<h2 id=\"what-well-make\" style=\"position:relative;\"><a href=\"#what-well-make\" aria-label=\"what well make permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What We’ll Make</h2>\n<p>I will be making a simple voice memo app with basic voice commands that run in the browser. If you would like to follow this tutorial, please be ready to work with the create-react-app boilerplate.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 59.53846153846154%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAtUlEQVQoz81Syw6DIBD0/7/Ou49YD15a2gNKBBemQMDSBDW2PXSTyT5gJ7MLBWMMwzCAc45lWVYopUBEMMbAWfRHVly6DmVZoqoq1HWNpmnQtq3P+76HlPIcYQxcg3bQ2sOE+AyZJyQxg6Z584Ij20J6/lJIVgVpfGI55YXSBGmXL+1DeJ/Ec6ylZ6GurM8qvAuB2zR5sOAjruP4lrMAV3/YvvzIX1h25L2lH+HnCnf/4d8SPgHIT7R40yrbKAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"example\"\n        title=\"example\"\n        src=\"/static/2283a1f88a7a6981b2ce9d7f0cd28d71/e5715/styledExample.png\"\n        srcset=\"/static/2283a1f88a7a6981b2ce9d7f0cd28d71/a6d36/styledExample.png 650w,\n/static/2283a1f88a7a6981b2ce9d7f0cd28d71/e5715/styledExample.png 768w,\n/static/2283a1f88a7a6981b2ce9d7f0cd28d71/0c1c2/styledExample.png 1542w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<h2 id=\"lets-get-started\" style=\"position:relative;\"><a href=\"#lets-get-started\" aria-label=\"lets get started permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Let's Get Started</h2>\n<h3 id=\"step-1-setting-up-the-workspace\" style=\"position:relative;\"><a href=\"#step-1-setting-up-the-workspace\" aria-label=\"step 1 setting up the workspace permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Step 1: Setting up the workspace</h3>\n<ol>\n<li>Create a new react app with create-react-app.</li>\n</ol>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"0\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk12\">npx</span><span class=\"mtk1\"> </span><span class=\"mtk12\">create</span><span class=\"mtk1\">-</span><span class=\"mtk12\">react</span><span class=\"mtk1\">-</span><span class=\"mtk12\">app</span><span class=\"mtk1\"> </span><span class=\"mtk12\">dictaphone</span></span></code></pre>\n<ol start=\"2\">\n<li>Modify the App.js file and add the dictaphone component like so:</li>\n</ol>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"1\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Dictaphone</span><span class=\"mtk1\"> </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;./dictaphoneSetup.js&#39;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">function</span><span class=\"mtk1\"> </span><span class=\"mtk11\">App</span><span class=\"mtk1\">() {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> (</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;App&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">header</span><span class=\"mtk1\"> </span><span class=\"mtk12\">className</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;Dictaphone-Tester&quot;</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk10\">Dictaphone</span><span class=\"mtk1\"> </span><span class=\"mtk17\">/&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">header</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  );</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk12\">App</span><span class=\"mtk1\">;</span></span></code></pre>\n<p>NOTE: We haven't built the Dictaphone component yet; we'll jump into that next!</p>\n<ol start=\"3\">\n<li>In the root directory of your app, install the react hook using:</li>\n</ol>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"2\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk12\">npm</span><span class=\"mtk1\"> </span><span class=\"mtk12\">i</span><span class=\"mtk1\"> </span><span class=\"mtk12\">react</span><span class=\"mtk1\">-</span><span class=\"mtk12\">speech</span><span class=\"mtk1\">-</span><span class=\"mtk12\">recognition</span></span></code></pre>\n<ol start=\"4\">\n<li>Create a file to house the Dictaphone component in your src directory and import the necessary dependencies:</li>\n</ol>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"3\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">React</span><span class=\"mtk1\">, { </span><span class=\"mtk12\">useEffect</span><span class=\"mtk1\">, </span><span class=\"mtk12\">useState</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;react&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">, { </span><span class=\"mtk12\">useSpeechRecognition</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;react-speech-recognition&#39;</span><span class=\"mtk1\">;</span></span></code></pre>\n<p>And that's it for our basic setup!</p>\n<h3 id=\"step-2-setting-up-the-dictaphone\" style=\"position:relative;\"><a href=\"#step-2-setting-up-the-dictaphone\" aria-label=\"step 2 setting up the dictaphone permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Step 2: Setting up the dictaphone</h3>\n<ol>\n<li>First, we will build the skeleton of our component:</li>\n</ol>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"4\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">React</span><span class=\"mtk1\">, { </span><span class=\"mtk12\">useEffect</span><span class=\"mtk1\">, </span><span class=\"mtk12\">useState</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;react&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">, { </span><span class=\"mtk12\">useSpeechRecognition</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;react-speech-recognition&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">Dictaphone</span><span class=\"mtk1\"> = () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> (</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> );</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">};</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Dictaphone1</span><span class=\"mtk1\">;</span></span></code></pre>\n<ol start=\"2\">\n<li>\n<p>Next, we need to fetch certain props out of <em>useSpeechRecognition</em>. The props we will need are <em>transcript, interimTranscript, finalTranscript, resetTranscript,</em> and <em>listening</em>. You can do so like this:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"5\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">transcript</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">interimTranscript</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">finalTranscript</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">resetTranscript</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk12\">listening</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">} = </span><span class=\"mtk11\">useSpeechRecognition</span><span class=\"mtk1\">();</span></span></code></pre>\n<p>We will also need to enable commands through this hook so add <em>commands</em> to gain access:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"6\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">} = </span><span class=\"mtk11\">useSpeechRecognition</span><span class=\"mtk1\">({ </span><span class=\"mtk12\">commands</span><span class=\"mtk1\"> });</span></span></code></pre>\n</li>\n<li>\n<p>Moving swiftly onward, we need to need to add several functions that are built into the hook and React. First we will be using <em>useEffect</em> to print the transcript to the page.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"7\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk11\">useEffect</span><span class=\"mtk1\">(() </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">finalTranscript</span><span class=\"mtk1\"> !== </span><span class=\"mtk8\">&#39;&#39;</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;Got final result:&#39;</span><span class=\"mtk1\">, </span><span class=\"mtk12\">finalTranscript</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">}, [</span><span class=\"mtk12\">interimTranscript</span><span class=\"mtk1\">, </span><span class=\"mtk12\">finalTranscript</span><span class=\"mtk1\">]);</span></span></code></pre>\n</li>\n<li>Then, we will add a listening function to start our dictaphone and throw in a quick conditional to alert the user if their browser is not compatible with this API. These functions would look like:</li>\n</ol>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"8\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (!</span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">.</span><span class=\"mtk11\">browserSupportsSpeechRecognition</span><span class=\"mtk1\">()) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> </span><span class=\"mtk4\">null</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> }</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (!</span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">.</span><span class=\"mtk11\">browserSupportsSpeechRecognition</span><span class=\"mtk1\">()) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;Your browser does not support speech recognition software! Try Chrome desktop, maybe?&#39;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">listenContinuously</span><span class=\"mtk1\"> = () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">.</span><span class=\"mtk11\">startListening</span><span class=\"mtk1\">({</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">continuous:</span><span class=\"mtk1\"> </span><span class=\"mtk4\">true</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">language:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;en-GB&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   });</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> };</span></span></code></pre>\n<h3 id=\"step-3-building-the-dictaphone-controls-and-page-elements\" style=\"position:relative;\"><a href=\"#step-3-building-the-dictaphone-controls-and-page-elements\" aria-label=\"step 3 building the dictaphone controls and page elements permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Step 3: Building the dictaphone controls and page elements</h3>\n<p>We will add some page elements to access our dictaphone and print the words to the page. We will need three buttons: <em>stop, listen,</em> and <em>reset</em> - to control the dictaphone and reset the transcript. We may also want to add an indicator that informs the user if the dictaphone is listening or not. Within Dictaphone's return div create the following elements:</p>\n<ol>\n<li>A span that houses a ternary conditional that uses the <em>listening</em> prop of <em>useSpeechRecognition</em> to tell if the dictaphone is currently accessing the microphone or not. Add a 'Listening:' label for clarity reasons (Please see below diagram for more precise explanation).</li>\n<li>A <em>reset</em> button that will use the built-in function resetTranscript to- you guessed it- reset the transcript.</li>\n<li>A <em>listen</em> and <em>stop</em> button that will use the functions <em>listenContinuously</em> and <em>SpeechRecogniton.stopListening</em> respectively to control the dictaphone.</li>\n<li>One last span where we are housing our transcript.</li>\n</ol>\n<p>Your return statement should look similar to this:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"9\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\">  </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> (</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          listening:</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk4\">{</span><span class=\"mtk8\">&#39; &#39;</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk4\">{</span><span class=\"mtk12\">listening</span><span class=\"mtk1\"> ? </span><span class=\"mtk8\">&#39;on&#39;</span><span class=\"mtk1\"> : </span><span class=\"mtk8\">&#39;off&#39;</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">button</span><span class=\"mtk1\"> </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;button&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">onClick</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">resetTranscript</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">Reset</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">button</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">button</span><span class=\"mtk1\"> </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;button&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">onClick</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">listenContinuously</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">Listen</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">button</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">          </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">button</span><span class=\"mtk1\"> </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;button&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">onClick</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">.</span><span class=\"mtk12\">stopListening</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">Stop</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">button</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">        </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span><span class=\"mtk4\">{</span><span class=\"mtk12\">transcript</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">      </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">    </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">  );</span></span></code></pre>\n<p>If you go to <strong>localhost:3000</strong> in your browser, the dictaphone should now be working.</p>\n<h3 id=\"step-4-adding-commands\" style=\"position:relative;\"><a href=\"#step-4-adding-commands\" aria-label=\"step 4 adding commands permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Step 4: Adding commands</h3>\n<p>Now that our dictaphone is working, let's add some commands. We won't do anything too complicated but instead access the functions we already have at our disposal.</p>\n<p>Within the dictaphone component, declare an array called <strong>commands</strong>. This will be an array of objects containing two properties each:</p>\n<ul>\n<li>a command (string or regular expression)</li>\n<li>a callback</li>\n</ul>\n<p>A voice command that resets the transcript should look like this:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"10\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">commands</span><span class=\"mtk1\"> = [</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">command:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;reset&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk11\">callback</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> </span><span class=\"mtk11\">resetTranscript</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">command:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;clear&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk11\">callback</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> </span><span class=\"mtk11\">resetTranscript</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> ]</span></span></code></pre>\n<p>When the dictaphone picks up the words 'reset' or 'clear' from the user's speech, it will execute the callback associated with the command.</p>\n<p>Let's add a response feature. If we add a react hook to manipulate the state like this:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"11\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> [</span><span class=\"mtk12\">message</span><span class=\"mtk1\">, </span><span class=\"mtk12\">setMessage</span><span class=\"mtk1\">] = </span><span class=\"mtk11\">useState</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;&#39;</span><span class=\"mtk1\">);</span></span></code></pre>\n<p>Then add the <em>message</em> to the output, we can add commands that generate a response. For instance, if I were to say ‘Hello’, the app would print back 'Hi there!' or something to that effect. Below, I've written some simple commands.</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"12\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">commands</span><span class=\"mtk1\"> = [</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">command:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;reset&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk11\">callback</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> </span><span class=\"mtk11\">resetTranscript</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">command:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;shut up&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk11\">callback</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> </span><span class=\"mtk11\">setMessage</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;I wasn</span><span class=\"mtk6\">\\&#39;</span><span class=\"mtk8\">t talking.&#39;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">command:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;Hello&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk11\">callback</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> </span><span class=\"mtk11\">setMessage</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;Hi there!&#39;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> ]</span></span></code></pre>\n<p>With that our quick dictaphone is complete! Take a look at this code where it all comes together:</p>\n<pre class=\"grvsc-container dark-default-dark\" data-language=\"js\" data-index=\"13\"><code class=\"grvsc-code\"><span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">React</span><span class=\"mtk1\">, { </span><span class=\"mtk12\">useEffect</span><span class=\"mtk1\">, </span><span class=\"mtk12\">useState</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;react&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">import</span><span class=\"mtk1\"> </span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">, { </span><span class=\"mtk12\">useSpeechRecognition</span><span class=\"mtk1\"> } </span><span class=\"mtk15\">from</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;react-speech-recognition&#39;</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">Dictaphone1</span><span class=\"mtk1\"> = () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> [</span><span class=\"mtk12\">message</span><span class=\"mtk1\">, </span><span class=\"mtk12\">setMessage</span><span class=\"mtk1\">] = </span><span class=\"mtk11\">useState</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;&#39;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk12\">commands</span><span class=\"mtk1\"> = [</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">command:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;reset&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk11\">callback</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> </span><span class=\"mtk11\">resetTranscript</span><span class=\"mtk1\">()</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">command:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;shut up&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk11\">callback</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> </span><span class=\"mtk11\">setMessage</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;I wasn</span><span class=\"mtk6\">\\&#39;</span><span class=\"mtk8\">t talking.&#39;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">command:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;Hello&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk11\">callback</span><span class=\"mtk12\">:</span><span class=\"mtk1\"> () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> </span><span class=\"mtk11\">setMessage</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;Hi there!&#39;</span><span class=\"mtk1\">)</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   },</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> ]</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk12\">transcript</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk12\">interimTranscript</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk12\">finalTranscript</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk12\">resetTranscript</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk12\">listening</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> } = </span><span class=\"mtk11\">useSpeechRecognition</span><span class=\"mtk1\">({ </span><span class=\"mtk12\">commands</span><span class=\"mtk1\"> });</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk11\">useEffect</span><span class=\"mtk1\">(() </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (</span><span class=\"mtk12\">finalTranscript</span><span class=\"mtk1\"> !== </span><span class=\"mtk8\">&#39;&#39;</span><span class=\"mtk1\">) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;Got final result:&#39;</span><span class=\"mtk1\">, </span><span class=\"mtk12\">finalTranscript</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> }, [</span><span class=\"mtk12\">interimTranscript</span><span class=\"mtk1\">, </span><span class=\"mtk12\">finalTranscript</span><span class=\"mtk1\">]);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (!</span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">.</span><span class=\"mtk11\">browserSupportsSpeechRecognition</span><span class=\"mtk1\">()) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> </span><span class=\"mtk4\">null</span><span class=\"mtk1\">;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> }</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk15\">if</span><span class=\"mtk1\"> (!</span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">.</span><span class=\"mtk11\">browserSupportsSpeechRecognition</span><span class=\"mtk1\">()) {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk10\">console</span><span class=\"mtk1\">.</span><span class=\"mtk11\">log</span><span class=\"mtk1\">(</span><span class=\"mtk8\">&#39;Your browser does not support speech recognition software! Try Chrome desktop, maybe?&#39;</span><span class=\"mtk1\">);</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> }</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk4\">const</span><span class=\"mtk1\"> </span><span class=\"mtk11\">listenContinuously</span><span class=\"mtk1\"> = () </span><span class=\"mtk4\">=&gt;</span><span class=\"mtk1\"> {</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">.</span><span class=\"mtk11\">startListening</span><span class=\"mtk1\">({</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">continuous:</span><span class=\"mtk1\"> </span><span class=\"mtk4\">true</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk12\">language:</span><span class=\"mtk1\"> </span><span class=\"mtk8\">&#39;en-GB&#39;</span><span class=\"mtk1\">,</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   });</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> };</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> </span><span class=\"mtk15\">return</span><span class=\"mtk1\"> (</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">       </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">         listening:</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">         </span><span class=\"mtk4\">{</span><span class=\"mtk8\">&#39; &#39;</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">         </span><span class=\"mtk4\">{</span><span class=\"mtk12\">listening</span><span class=\"mtk1\"> ? </span><span class=\"mtk8\">&#39;on&#39;</span><span class=\"mtk1\"> : </span><span class=\"mtk8\">&#39;off&#39;</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">       </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">       </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">         </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">button</span><span class=\"mtk1\"> </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;button&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">onClick</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">resetTranscript</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">Reset</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">button</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">         </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">button</span><span class=\"mtk1\"> </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;button&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">onClick</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">listenContinuously</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">Listen</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">button</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">         </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">button</span><span class=\"mtk1\"> </span><span class=\"mtk12\">type</span><span class=\"mtk1\">=</span><span class=\"mtk8\">&quot;button&quot;</span><span class=\"mtk1\"> </span><span class=\"mtk12\">onClick</span><span class=\"mtk1\">=</span><span class=\"mtk4\">{</span><span class=\"mtk12\">SpeechRecognition</span><span class=\"mtk1\">.</span><span class=\"mtk12\">stopListening</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&gt;</span><span class=\"mtk1\">Stop</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">button</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">       </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">       </span><span class=\"mtk4\">{</span><span class=\"mtk12\">message</span><span class=\"mtk4\">}</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">       </span><span class=\"mtk17\">&lt;</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span><span class=\"mtk4\">{</span><span class=\"mtk12\">transcript</span><span class=\"mtk4\">}</span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">span</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">     </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">   </span><span class=\"mtk17\">&lt;/</span><span class=\"mtk4\">div</span><span class=\"mtk17\">&gt;</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\"> );</span></span>\n<span class=\"grvsc-line\"><span class=\"mtk1\">};</span></span>\n<span class=\"grvsc-line\"></span>\n<span class=\"grvsc-line\"><span class=\"mtk15\">export</span><span class=\"mtk1\"> </span><span class=\"mtk15\">default</span><span class=\"mtk1\"> </span><span class=\"mtk12\">Dictaphone1</span><span class=\"mtk1\">;</span></span></code></pre>\n<p>Thanks for following along, and I hope this helps!</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n  .dark-default-dark {\n    background-color: #1E1E1E;\n    color: #D4D4D4;\n  }\n  .dark-default-dark .mtk12 { color: #9CDCFE; }\n  .dark-default-dark .mtk1 { color: #D4D4D4; }\n  .dark-default-dark .mtk15 { color: #C586C0; }\n  .dark-default-dark .mtk8 { color: #CE9178; }\n  .dark-default-dark .mtk4 { color: #569CD6; }\n  .dark-default-dark .mtk11 { color: #DCDCAA; }\n  .dark-default-dark .mtk17 { color: #808080; }\n  .dark-default-dark .mtk10 { color: #4EC9B0; }\n  .dark-default-dark .mtk6 { color: #D7BA7D; }\n</style>","frontmatter":{"date":"October 29, 2020","updated_date":null,"description":"Learning and exploring the react-speech-recognition hook basics.","title":"A Quick Look at the React Speech Recognition Hook","tags":["React","React Speech Recognition","React Speech","React Hook"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/afc3c0521bd8ce193a512ce11759f91c/14b42/mic.jpg","srcSet":"/static/afc3c0521bd8ce193a512ce11759f91c/f836f/mic.jpg 200w,\n/static/afc3c0521bd8ce193a512ce11759f91c/2244e/mic.jpg 400w,\n/static/afc3c0521bd8ce193a512ce11759f91c/14b42/mic.jpg 800w,\n/static/afc3c0521bd8ce193a512ce11759f91c/47498/mic.jpg 1200w,\n/static/afc3c0521bd8ce193a512ce11759f91c/0e329/mic.jpg 1600w,\n/static/afc3c0521bd8ce193a512ce11759f91c/c3e15/mic.jpg 4240w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Krista Singleton","github":"krissingl","avatar":null}}}},{"node":{"excerpt":"Identity management for developers isn't a tough nut to crack, especially if you know how to play your cards right.  As a creator of front…","fields":{"slug":"/identity/identity-management-developers/"},"html":"<p>Identity management for developers isn't a tough nut to crack, especially if you know how to play your cards right. </p>\n<p>As a creator of front-end or back-end applications, you will eventually experience the need to collect and store consumer information like their identities and other profile details. </p>\n<p>At the same time, you'll also need to design a new user registration workflow, enable omnichannel experience, configure authentication methods like social login, provision or deprovision consumers, partner to a third party application or secure the API of your web services.</p>\n<p>Learning the basics of identity management for developers can place you in a strong position to communicate what you need and why.</p>\n<h2 id=\"current-security-challenges-that-developers-face\" style=\"position:relative;\"><a href=\"#current-security-challenges-that-developers-face\" aria-label=\"current security challenges that developers face permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Current Security Challenges That Developers Face</h2>\n<p>Risk-Based Security, a cyber threat intelligence company, stated in its report that more than <a href=\"https://www.riskbasedsecurity.com/2020/02/10/number-of-records-exposed-in-2019-hits-15-1-billion/\">15.1 billion records were compromised</a> in 2019—that sums up to 284% year-over-year growth! </p>\n<p>Data security is the need of the hour. The developer's responsibility is to build security within applications right from the first stage of development. </p>\n<p>Working with identity access management, particularly CIAM, when designing customer-facing solutions, is a fantastic idea. It mitigates various application threats that may otherwise prove fatal for consumers. </p>\n<p>Some of the common ones include: </p>\n<h3 id=\"brute-force-attack\" style=\"position:relative;\"><a href=\"#brute-force-attack\" aria-label=\"brute force attack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Brute force attack</h3>\n<p>Brute force is a popular password-guessing attack that web developers face. Hackers use automated software to guess every possible combination of letters, numbers, and symbols until they successfully crack the password. So, if your application or website requires <a href=\"https://www.loginradius.com/authentication/\">authentication</a>, there is a good chance you may be a target for brute force attacks. </p>\n<p>One of the most obvious ways to block brute-force attacks is to automatically lock out accounts after a predefined number of incorrect password attempts. You can keep the accounts locked for a specific duration or until an administrator manually unlocks them.</p>\n<h3 id=\"injection-attack\" style=\"position:relative;\"><a href=\"#injection-attack\" aria-label=\"injection attack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Injection attack</h3>\n<p>An injection attack is a malicious code injected by the attacker into a network. The input is interpreted as a part of a command or query. This, in essence, modifies the execution of the program. Injections are amongst the oldest attacks in the book aimed at data theft, data loss, denial of service, and even full system compromise.</p>\n<p>However, mitigating injection flaws isn't very difficult. Developers should make it a point to stop writing dynamic queries and also prevent user-supplied input with malicious SQL from affecting the executed query.</p>\n<h3 id=\"man-in-the-middle-attack\" style=\"position:relative;\"><a href=\"#man-in-the-middle-attack\" aria-label=\"man in the middle attack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Man-in-the-middle attack</h3>\n<p>A man-in-the-middle attack happens when the hacker intercepts a conversation between a consumer and an application. The hacker may eavesdrop or impersonate one of the parties and steal <a href=\"https://www.loginradius.com/blog/2018/12/infographic-the-death-of-passwords/\">passwords</a> or credit card information. </p>\n<p>To mitigate such spoofing attacks, developers can utilize secure communication protocols like TLS and HTTPS. They can also keep consumers logged out of their applications when not in use. Encrypting and authenticating transmitted data is another way to steer clear of man-in-the-middle attacks. </p>\n<h3 id=\"social-engineering-attack\" style=\"position:relative;\"><a href=\"#social-engineering-attack\" aria-label=\"social engineering attack permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Social engineering attack</h3>\n<p><a href=\"https://www.loginradius.com/blog/2020/10/social-engineering-attacks/\">Social engineering attacks</a> involve the hacker manipulating human emotions to attack the victim. They utilize common phishing scams through email and text message campaigns to impose urgency, curiosity, or fear in the victim, hoping that the user will download malware or click unsolicited links that host the malware.</p>\n<p>Backing up files regularly, keeping software updated, and always scanning executable files before running them are a few ways to avoid social engineering attacks. </p>\n<h3 id=\"security-misconfiguration\" style=\"position:relative;\"><a href=\"#security-misconfiguration\" aria-label=\"security misconfiguration permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Security misconfiguration </h3>\n<p>Security misconfiguration happens when the network administrator fails to implement all security controls for a server or implement security controls, but with errors. It could happen with legacy applications when they try to communicate with applications that do not exist anymore. Hackers may replicate these applications and try to establish connections. </p>\n<p>One of the best ways to fight security misconfiguration is through increased visibility. Make sure you have an accurate, real-time map of your entire ecosystem, so you are always focused on your critical assets. </p>\n<h2 id=\"developers-are-on-the-front-foot\" style=\"position:relative;\"><a href=\"#developers-are-on-the-front-foot\" aria-label=\"developers are on the front foot permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Developers are on the front foot</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 60.61538461538461%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAABx0lEQVQoz3WTW08CMRCFeXDbLsb4aLw+qSgqKBGEhUVWvCCSEMELXjHx9v9/wXFm2i5i4kPTZtp+PWdmmgk36gg3GzDbCXT+BGbrGOF6JLEw14Th/V/DcNyv6azhO9stF4+QkY3dU9mYzSe0PrOHih2EhY4A+bBhuLvEIF3qQx/dQVXvZejDAczOKQFpM8i3sVjpodR5tEoJxq+GuXgCpLgH68oNVG0kQD9UdSRgAtKBvXPMH11jodqH2e/CFC7oYmytS0qc1fUadHkA1XyDarxAxa8ya1bo1GbkVQKo3XNSStbZJj3A8iUVW60UxnFVfxKAYmU81x4QxGNaW8U2h2xtp41QcpmkyiRvFBcwz8Uu2b0VWDZ6wMrlJ5Yv3pFtPCFgpQycqppb2wLELu7gorpNlodQBF0i0Gr3C2tX3wQfIag/Q1NeMx4kMDdLG+Ti6UeocLyvK0NRw6rWCDjH6so30I1nsf9LYZSq+dtv0irSoy0pGhciSD4wQ6qULwgXiIGpQr7AfUhWU1WiOJ6kQXo0kcJJQZpjOzM4epT9CZBtcud7++lv8PYje4ah7lEWoQ96MuzD0V/L01/s34L5luLK+6/qzvwAoxZjRAhElyMAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Identity Management for Developers2\"\n        title=\"Identity Management for Developers2\"\n        src=\"/static/b153dcec0656b6af835093c8de08c594/e5715/Identity-Management-for-Developers2.png\"\n        srcset=\"/static/b153dcec0656b6af835093c8de08c594/a6d36/Identity-Management-for-Developers2.png 650w,\n/static/b153dcec0656b6af835093c8de08c594/e5715/Identity-Management-for-Developers2.png 768w,\n/static/b153dcec0656b6af835093c8de08c594/d0143/Identity-Management-for-Developers2.png 1025w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>What can prevent someone from breaking into an application or online software system and stealing information or <a href=\"https://www.loginradius.com/blog/2019/09/prevent-credential-stuffing-attacks/\">accessing sensitive credentials</a>? Both the challenges and the solutions rely on software, and the situation is well known to many developers. After all, they are the first line of defense.</p>\n<p>Gathering and evaluating evidence is a critical step in ensuring that a safety-first culture is being developed within the development team. They should conduct proper assessment, identify the progress of the team in real-time, and benchmark their strengths and weaknesses for continuous improvement. The inclusion of identity management for developers can also help. </p>\n<h2 id=\"application-security-regulations\" style=\"position:relative;\"><a href=\"#application-security-regulations\" aria-label=\"application security regulations permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Application Security Regulations</h2>\n<p>According to Forrester's study, <a href=\"https://www.whitesourcesoftware.com/forrester-state-of-application-security-report/\">42% of external attacks</a> happen due to software exploitation, and 35% is a result of web application vulnerability. As applications become more complex, different laws have been enacted to ensure their security. </p>\n<p>To help developers prepare better, we come up with a list of the best application security regulations that's been mitigating the threat landscape to a large extent. </p>\n<ul>\n<li><strong>Open Web Application Security Project (OWASP):</strong> It is a security project that also lists the ten most critical web application security risks.</li>\n<li><strong>Payment Card Industry Data Security Standard (PCI DSS)</strong>: It is an information security framework for handling data security processes of major credit cards. </li>\n<li><strong>Consortium for IT Software Quality (CISQ):</strong> It establishes international guidelines for the automation of software size and structural quality assessment from the source code</li>\n</ul>\n<h2 id=\"integrating-security-in-devops\" style=\"position:relative;\"><a href=\"#integrating-security-in-devops\" aria-label=\"integrating security in devops permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Integrating Security in DevOps</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 60.61538461538461%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsSAAALEgHS3X78AAABn0lEQVQoz1VSa3ObMBDk//+zfOh0xk3cuGlexhgwLwF6nk5SF4hdh9Egzen2dm9PWUoppjQ57i2PjjvDikJav3j9x9s5ptEFrMGyDzFDtDfe+HDLRqGLItxtGI4xxBTWO82xEmr/ltfDPFHIJhe0D0hFMWH5ONp8tL9b/afTjSTH31QoTkUrdsVQtgIyM2BAIRxjG60HBgv4faM/hT2NllcJxAvccGyU+xC2nO0MZrAhWkqqpP/b6cdT99rKYnb7RkHFhzBoCgmQvZH3hsFnfETJhRmchsNZ0uNZPLwUv/L2XZinRhUTWjC1dPfKZ7dYtUUyNAz1q6RwqMdd3j6XAzTvLgqdv/S6UbQyR0wBMivl4xc2Zau9AT07jufJgXO/ulXgPJinizpODrZALaYgfUCri00beNtgC6Kfo/tZyddhMQxuYV2UA09nPAYjKfyoNUrMtDB9Md8+hGBVpwm05ewG43mViFcgid8mOlTD4T3vNW3vKLs3g0LMZ1pmd/X2dgvPT5I6aY51h/Nm2TdmRFz4D7zHIx2C4c7sI13d/gdRtbZIx5Tx0AAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Identity Management for Developers 3\"\n        title=\"Identity Management for Developers 3\"\n        src=\"/static/ae7f2787548da3aaf4aa37a410fde974/e5715/Identity-Management-for-Developers-3.png\"\n        srcset=\"/static/ae7f2787548da3aaf4aa37a410fde974/a6d36/Identity-Management-for-Developers-3.png 650w,\n/static/ae7f2787548da3aaf4aa37a410fde974/e5715/Identity-Management-for-Developers-3.png 768w,\n/static/ae7f2787548da3aaf4aa37a410fde974/d0143/Identity-Management-for-Developers-3.png 1025w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>The business IT infrastructure of today is more varied, diverse, and complex than ever before. Environments there were earlier confined to on-premises and are not hosted on multiple clouds and IoT devices. </p>\n<p>However, this modern open perimeter has been posing fundamental challenges for cybersecurity. It requires a <a href=\"https://www.loginradius.com/blog/2019/10/cloud-computing-security-challenges/\">zero-trust environment</a> to thrive in the development and operations (DevOps) life cycle. It takes not only the right tools and technology to bring this approach into effect, but a shift in philosophy focused on the holistic integration of security within the DevOps lifecycle.</p>\n<p><a href=\"https://www.loginradius.com/resource/pii-data-breach-report/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsSAAALEgHS3X78AAABaElEQVQY00WQOU8CURSFiYXADBECBBzRAUEWZRFFhnHYR1ZBE7VRpDCWJC6NlWhjxS/RykQbozEx0YrG0sbCn3K882C0OHnv5t733XOewRzKQRMXzoGPFGAh8WNx4Tz0vibTggIuqsIp78CR2IA5VoEpUoQpmIVpPGMYwfJwxkuwhRVYAjIpQ7UK92oN1miJPWDAIPXjVYjlA0Sr++CkXRjjNXAhvZ8dAbWLX25BaXeRUPfgSaoMyvslWJfGDkiO5Qo86SbcK1VMp+rwZjYhZloQ1prgyRQD6tuFZAV+qQFfug5XrMhg/HyaAfXIxoUsbDEVswSZk9sQ17cI3PhLwCJrhfZftgg59aZgFEl0avepoAx7rMz6BiGJXn+Ar+8f3D+94fbhGXePL3gffuL1Y0iLypgMKP9AR7TAABy5shPcRfUMRRcompFmJnwSpO0j9C4HODy7Quekj85pH8cXN+ieX8OyWGBzvw4LwSbThPvuAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"protecting pii against data breaches\"\n        title=\"protecting pii against data breaches\"\n        src=\"/static/8ae28768fa7a47b91a86b0e9441f9c50/e5715/protecting-pii-against-data-breaches.png\"\n        srcset=\"/static/8ae28768fa7a47b91a86b0e9441f9c50/a6d36/protecting-pii-against-data-breaches.png 650w,\n/static/8ae28768fa7a47b91a86b0e9441f9c50/e5715/protecting-pii-against-data-breaches.png 768w,\n/static/8ae28768fa7a47b91a86b0e9441f9c50/63ff0/protecting-pii-against-data-breaches.png 2887w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<p>The safety mechanisms embedded in DevOps offers the following benefits (but not confined to): </p>\n<ul>\n<li>Greater pace and agility for development and security teams.</li>\n<li>The ability to adapt quickly to change.</li>\n<li>Better cooperation and coordination between teams. </li>\n<li>More options for automated construction and quality assurance assessments. </li>\n<li>Early vulnerability detection in code.</li>\n</ul>\n<h2 id=\"how-loginradius-provides-ideal-identity-management-for-developers\" style=\"position:relative;\"><a href=\"#how-loginradius-provides-ideal-identity-management-for-developers\" aria-label=\"how loginradius provides ideal identity management for developers permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How LoginRadius Provides Ideal Identity Management for Developers</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 60.61538461538461%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsSAAALEgHS3X78AAAB3UlEQVQoz3VTTVMTQRDdA8xHALmlcrAKSyEQIB9ERbLZCMnmQ0OEC6JIlLLK4uL/Pz9f90yWgHromtme2dev3+tJXDWD3+nCVXtwB0O4wxFjGPbMhbPsr9D8/gCrtT7v5nBcJZfowe57uPqYawDw8tPe45zekRCw7ZTnp/AsvJVewjcmsI0Peh4AhRF/VAAJYclDL6y59zvpA9O9M3iCGeY36zlq+TXW31zA1gbKNNGqbM+2ZjD9XzDZHKZ7y+oEfXUSwMkgyDHUNqU9y3ypPsKLzgzruxmstM1CiTCzx1cwna8wpz+xwihP7vF8eBdY1c4UZMFQ2W6HcPs5gaLu8U4iG5N9h313DUtmK70f2Jre4+Xlb2y2qI1clPaXzSETF3Oit48myRoACWLSWzL9DMPYyL7hWY9tty9Yua+sFs4WrMWUBeBSMdVQgXp3Qb/0BqsdRncOezSLI5Q/jNNilGLoRBRy6Niw+uEY5uQLzZhr+xKu/Yk6dWDpeulggEp7jMrbczXDVwkkzGUKlttWhlFoda451VCBRXipTuFLTc5Ya4ry64/Bbbruyd7LrP4L8Kl7y5qJi2tkWG6NUDk+1+9i+GO7jwD/97SK5yUaE2SjMcZac1KY4aJB/gnoH4qDX4mZerxLAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Identity Management for Developers 4\"\n        title=\"Identity Management for Developers 4\"\n        src=\"/static/e1fbed736a6c0586dfb399ebdd60a613/e5715/Identity-Management-for-Developers-4.png\"\n        srcset=\"/static/e1fbed736a6c0586dfb399ebdd60a613/a6d36/Identity-Management-for-Developers-4.png 650w,\n/static/e1fbed736a6c0586dfb399ebdd60a613/e5715/Identity-Management-for-Developers-4.png 768w,\n/static/e1fbed736a6c0586dfb399ebdd60a613/d0143/Identity-Management-for-Developers-4.png 1025w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>Identity is the cornerstone of the modern consumer experience. A good, scalable <a href=\"https://www.loginradius.com/blog/2019/06/perfect-ciam-platform/\">CIAM solution</a> allows you to manage consumer identity and access securely.</p>\n<p>LoginRadius' admin-friendly UI seamlessly implements identity management and balances the skills of your developers. Consequently, it will significantly reduce the developer's effort. For example, you can easily control who is allowed to sign in to your site, how they can do it, and what they can access once they have successfully signed in. </p>\n<p>Here are the core capabilities of LoginRadius identity management for developers. </p>\n<ul>\n<li><strong>Low-friction consumer registration</strong>: LoginRadius offers flexible account setup choices like standard login, social login, and self-serve registration for hassle-free entry into your web properties.</li>\n<li><strong>Multi-factor authentication (MFA):</strong> LoginRadius offers identity management for developers by making it easier to safeguard consumer data with <a href=\"https://www.loginradius.com/blog/2019/06/what-is-multi-factor-authentication/\">extra protection layers.</a> The CIAM provider allows a plethora of authentication methods including, phone calls, SMS/text messages, email verification, time-based code, hardware token, security questions, biometrics, Google Authenticator, etc. each time they want to access their accounts.</li>\n<li><strong>Single Sign-On (SSO)</strong>: SSO can provide easy access to multiple websites or applications using a single set of credentials. LoginRadius offers different ways to integrate via the web, mobile, and federated SSO. Developers can create connections with external identity providers by implementing OAuth 2.0, SAML, or OpenID Connect standards.</li>\n<li><strong>Compliance management</strong>: Developers can add authorization policies through LoginRadius. The CIAM provider is well compliant with formal data protection regulations across the globe, like the <a href=\"https://www.loginradius.com/blog/identity/ccpa-vs-gdpr-the-compliance-war/\">EU's GDPR and California's CCPA</a>.</li>\n<li><strong>Data privacy and security</strong>: LoginRadius follows safety protocols to safeguard consumer data and avoid illicit intrusions. The identity provider is compliant with regulatory bodies like AICPA SOC 2, ISAE 3000, Cloud Security Alliance, Privacy Shield, and more.</li>\n</ul>\n<h2 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion</h2>\n<p>Identity management for developers is required more than ever. It should be seamless, simple, and secure. The development team is under extreme pressure to build digital experiences that disrupt their industry or differentiate their business. </p>\n<p>No wonder meeting the demands of both businesses and consumers is an uphill ride. The right CIAM solution comes with improved data security and identity management features that meet the developers' need for top-notch experiences.  </p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABYElEQVQY0z2RO08CURCFN0hcWRZQHhYUKBHFBR+sUQQWefoAE4HCArXSWGhiZUGhsTHGEBsLf4AxdkQriZWWNtrY+HuOMwNaTO69k3PPfOdeZWS2BO9cGS4jD//8Ktyxgpx575kpQp20oE/nMGquQ4+uwBkvw5uswUcajfYOowBtKgsH1RBplQAJ+SI3fH2TwYkMeJBu5OCJF6XHYtvYEtRYCcF8E9HCNgbMGmxGGfbxJNSIJR4Kk+lU7niPjI3EjKiYkofYwykEEmtINQ5gVvewUN1FokJrhdaNHSzX9xG26gSShsKT1UhGCISQjJmKDbk33Kd3Ulwm5UThbAOh9JZUMLkpfQaTyCKmy0yl8Rv1yTiuFs1KnwcpoUWcXNzg8/sHj8+veHjq4r7zgvePL3S6b6Ljp1KYwE9x2Jjfgen+4rti+f8P4jjF5hFa13c4Pm/36qyN08tbHLau5DM56S/3nMSX+4NvoQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Book a demo banner\"\n        title=\"Book a demo banner\"\n        src=\"/static/c4fac6b24f15c7b7ba84deec1d1107ac/e5715/Book-a-demo-banner.png\"\n        srcset=\"/static/c4fac6b24f15c7b7ba84deec1d1107ac/a6d36/Book-a-demo-banner.png 650w,\n/static/c4fac6b24f15c7b7ba84deec1d1107ac/e5715/Book-a-demo-banner.png 768w,\n/static/c4fac6b24f15c7b7ba84deec1d1107ac/2bef9/Book-a-demo-banner.png 1024w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"October 29, 2020","updated_date":null,"description":"Identity management for developers isn't a tough nut to crack, especially if you know how to play your cards right. As a creator of front-end or back-end applications, you will eventually experience the need to collect and store consumer information like their identities and other profile details. Learning the basics of identity management for developers can place you in a strong position to communicate what you need and why.","title":"Identity Management for Developers: Why it's required more than ever","tags":["customer-experience"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.408450704225352,"src":"/static/10130a8dad4a69fbc2be7a6427a1d9c6/33aa5/Identity-Management-for-Developers.jpg","srcSet":"/static/10130a8dad4a69fbc2be7a6427a1d9c6/f836f/Identity-Management-for-Developers.jpg 200w,\n/static/10130a8dad4a69fbc2be7a6427a1d9c6/2244e/Identity-Management-for-Developers.jpg 400w,\n/static/10130a8dad4a69fbc2be7a6427a1d9c6/33aa5/Identity-Management-for-Developers.jpg 768w","sizes":"(max-width: 768px) 100vw, 768px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},{"node":{"excerpt":"The problem with passwords is that they can be guessed, hacked, or coerced out of consumers through social engineering or phishing attacks…","fields":{"slug":"/identity/loginradius-launches-passwordless-login-with-magic-link-or-otp/"},"html":"<p>The problem with passwords is that they can be guessed, hacked, or coerced out of consumers through social engineering or phishing attacks. So, why not eliminate the main source of insecurity by going passwordless?  </p>\n<p>The recently launched Passwordless Login with Magic Link or OTP feature by LoginRadius gets authentication right by hitting all the right chords—streaming consumer experience, enhancing account security, and improving adaptive security (to name a few).</p>\n<h2 id=\"intent-behind-the-launch\" style=\"position:relative;\"><a href=\"#intent-behind-the-launch\" aria-label=\"intent behind the launch permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Intent Behind the Launch</h2>\n<p>Passwordless Login with Magic Link or OTP reduces friction during the registration and login processes. Once the customer enters the Email Address or Phone Number, they receive a magic link via email or OTP on the phone number. As the consumer clicks the magic link or enters the OTP, LoginRadius creates an account (provided it doesn’t already exist), and the consumer automatically logs into the account.</p>\n<p><a href=\"https://www.loginradius.com/resource/passwordless-login-magic-link-otp-datasheet\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABi0lEQVQY0z1QS0uCQRT9KqzvM9FSsKdZWmmakqaZpamfZmpR9oBauAla5CratLBNRJSbWvQLgjZB1CKiRYvAXUEJ0ZMWQo//UElymhmzgTNz79xzz7kznNDpAYXU4EW1cQgygmojiUkuNRRrJfDtA5CaRdQ6x6G0iBBMInijD0LHIHhaJydHibRZZQ1CYfJD1uWDvFuEyh5BnSMKucnHiCVBmTWMlmAC5tAseOckqixhCOSe/zPlSu4a1yi6AjPQeSeh6R8jBC9q7DEorCEmREVrLUE0EZM62zAaHBFoXTGSR6C2hYuGdEK6URj80/BMLcAeTUDvmYC6Zxjq/jhqekaYIG2Q6Nwob3VBSV7T6IyivjcCid6NijbX/yvYhFWkYf/4DLnXd1zf3uP24RmPLznk3j7gjs+jTNtH4MTS2jZu7p5wcHKOvcNThsxlFkdnF8ykkohzUupMgsxVFnR9fX4in/9GofDD8sBcElxzLyOLJF7Z3EVyNY1kKo3F1BaW13ewsLJB/trPBvsFYCXd+pSePL4AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Passwordless Login with OTP\"\n        title=\"Passwordless Login with OTP\"\n        src=\"/static/26573cadf0032216ac8fe2b2b10bd22f/e5715/DS-Passwordless-Login-with-Magic-Link-or-OTP-1.png\"\n        srcset=\"/static/26573cadf0032216ac8fe2b2b10bd22f/a6d36/DS-Passwordless-Login-with-Magic-Link-or-OTP-1.png 650w,\n/static/26573cadf0032216ac8fe2b2b10bd22f/e5715/DS-Passwordless-Login-with-Magic-Link-or-OTP-1.png 768w,\n/static/26573cadf0032216ac8fe2b2b10bd22f/2bef9/DS-Passwordless-Login-with-Magic-Link-or-OTP-1.png 1024w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<p><a href=\"https://www.loginradius.com/passwordless-login/\">Passwordless Login</a> with Magic Link or OTP is designed by LoginRadius to help your business in the following ways: </p>\n<ul>\n<li><strong>Streamlined consumer experience</strong>: One-step registration and login reduce friction for consumers. Furthermore, consumers do not need to create or remember passwords to access their accounts.</li>\n<li><strong>Consumer familiarity</strong>: This method of authentication is quickly catching up among consumers as one of the most preferred trends. Since it is already popular, you need not worry about educating your consumers about it.</li>\n<li><strong>Enhanced account security</strong>: Since a magic link or OTP is dynamically generated and sent over to the recipient on request, it eliminates the risk associated with password attacks and offers better account security.</li>\n<li><strong>Improved adaptive security</strong>: You can pre-define the Magic Link or OTP expiry time as an adaptive security measure for your consumers. Additionally, you can also be disabling access to accounts for a limited time due to multiple, pre-defined failed login attempts.</li>\n</ul>\n<h2 id=\"key-capabilities-of-passwordless-login-with-magic-link-or-otp\" style=\"position:relative;\"><a href=\"#key-capabilities-of-passwordless-login-with-magic-link-or-otp\" aria-label=\"key capabilities of passwordless login with magic link or otp permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Key Capabilities of Passwordless Login with Magic Link or OTP</h2>\n<ul>\n<li><strong>Log in with Magic Link</strong>: The consumer can log in directly by clicking the link received in the email without the need to pre-register their email on your application.</li>\n<li><strong>Login with OTP</strong>: The consumer can log into the application directly by entering the OTP received on their phone number without the need to pre-register their phone number on your application.</li>\n<li><strong>Magic Link and OTP Settings</strong>: You can configure email or SMS settings from the LoginRadius Admin Console. You can set the request limit for the maximum number of times a consumer can request the magic link or OTP within a limited time. You can also set the disable duration for which the magic link or OTP request remains disable if the consumer exceeded the defined request limit. Additionally, you can set the token expiry duration for which the magic link or OTP will remain active.</li>\n<li><strong>Email and SMS Templates</strong>: You can configure and personalize the content of email and SMS templates that your consumer will receive during the login. You can add, edit, delete, or send text email or SMS to verify your configuration. </li>\n</ul>\n<p>LoginRadius also supports various <strong>implementation and deployment methods</strong> that you can choose depending on your business needs.</p>\n<ul>\n<li><strong>Identity Experience Framework (IDX):</strong> You can directly use the pre-designed Passwordless Login with Magic Link or OTP page with the <a href=\"https://www.loginradius.com/resource/loginradius-identity-experience-framework-datasheet\">Identity Experience Framework</a> of LoginRadius, after completing all configurations.</li>\n<li><strong>JavaScript</strong>: You can generate embedded Passwordless Login with Magic Link or OTP page using the LoginRadius JavaScript Libraries. </li>\n<li><strong>SDK and APIs</strong>: You can use the entire open-source web and mobile SDKs to build off and modify the code to serve your unique requirements. Similarly, various APIs support the desired extensive flow of features and custom use cases for your business.</li>\n</ul>\n<h2 id=\"a-final-word\" style=\"position:relative;\"><a href=\"#a-final-word\" aria-label=\"a final word permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>A Final Word</h2>\n<p>Times are changing. The majority of consumers do not look forward to creating and entering passwords anymore. Passwordless Login with Magic Link or OTP by LoginRadius is the one-click solution for consumers’ fast-paced authentication needs. It helps businesses improve their security posture while providing a better consumer experience. </p>\n<p><a href=\"https://www.loginradius.com/book-a-demo/\"><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 768px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.307692307692307%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABYElEQVQY0z2RO08CURCFN0hcWRZQHhYUKBHFBR+sUQQWefoAE4HCArXSWGhiZUGhsTHGEBsLf4AxdkQriZWWNtrY+HuOMwNaTO69k3PPfOdeZWS2BO9cGS4jD//8Ktyxgpx575kpQp20oE/nMGquQ4+uwBkvw5uswUcajfYOowBtKgsH1RBplQAJ+SI3fH2TwYkMeJBu5OCJF6XHYtvYEtRYCcF8E9HCNgbMGmxGGfbxJNSIJR4Kk+lU7niPjI3EjKiYkofYwykEEmtINQ5gVvewUN1FokJrhdaNHSzX9xG26gSShsKT1UhGCISQjJmKDbk33Kd3Ulwm5UThbAOh9JZUMLkpfQaTyCKmy0yl8Rv1yTiuFs1KnwcpoUWcXNzg8/sHj8+veHjq4r7zgvePL3S6b6Ljp1KYwE9x2Jjfgen+4rti+f8P4jjF5hFa13c4Pm/36qyN08tbHLau5DM56S/3nMSX+4NvoQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"LoginRadius Book Free Demo\"\n        title=\"LoginRadius Book Free Demo\"\n        src=\"/static/c4fac6b24f15c7b7ba84deec1d1107ac/e5715/Book-a-demo-1024x310-1-1.png\"\n        srcset=\"/static/c4fac6b24f15c7b7ba84deec1d1107ac/a6d36/Book-a-demo-1024x310-1-1.png 650w,\n/static/c4fac6b24f15c7b7ba84deec1d1107ac/e5715/Book-a-demo-1024x310-1-1.png 768w,\n/static/c4fac6b24f15c7b7ba84deec1d1107ac/2bef9/Book-a-demo-1024x310-1-1.png 1024w\"\n        sizes=\"(max-width: 768px) 100vw, 768px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></a></p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"October 29, 2020","updated_date":null,"description":"The problem with passwords is that they can be guessed, hacked, or coerced out of consumers through social engineering attacks. So, why not eliminate the main source of insecurity by going passwordless?","title":"Announcement - LoginRadius Launches Passwordless Login with Magic Link or OTP, Keeps Barriers Low During Registration and Login","tags":["passwordless login","data security","cx"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.408450704225352,"src":"/static/8581df55215c9923ff8f7d662a69849e/6051d/DS-Login-with-Magic-Link-or-OTP.png","srcSet":"/static/8581df55215c9923ff8f7d662a69849e/69585/DS-Login-with-Magic-Link-or-OTP.png 200w,\n/static/8581df55215c9923ff8f7d662a69849e/497c6/DS-Login-with-Magic-Link-or-OTP.png 400w,\n/static/8581df55215c9923ff8f7d662a69849e/6051d/DS-Login-with-Magic-Link-or-OTP.png 769w","sizes":"(max-width: 769px) 100vw, 769px"}}},"author":{"id":"Karl Wittig","github":null,"avatar":null}}}},{"node":{"excerpt":"Why IoT and AI together make the perfect match! Statistics suggest that a whopping 64 billion IoT devices can be speculated by 2025. When we…","fields":{"slug":"/engineering/ai-and-iot-the-perfect-match/"},"html":"<h1 id=\"why-iot-and-ai-together-make-the-perfect-match\" style=\"position:relative;\"><a href=\"#why-iot-and-ai-together-make-the-perfect-match\" aria-label=\"why iot and ai together make the perfect match permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why IoT and AI together make the perfect match!</h1>\n<p><a href=\"https://www.businessinsider.com/internet-of-things-report?IR=T\">Statistics</a> suggest that a whopping <strong>64 billion IoT devices can be speculated by 2025</strong>. When we talk about the latest technologies shaping the IT industry, Artificial Intelligence and the Internet of Things are often top the list. No wonder these technologies complement each other so well. The duet has revamped the conventional solutions both on the industrial and business fronts.\n</p>\n<p>Consolidating IoT with AI can help us make <em>Intelligent Machine</em>s. These smart automation systems not only help in facilitating the monotonous tasks but making witty decisions without even the slightest of human involvement.\n</p>\n<h2 id=\"how-ai-enhances-iot-based-systems\" style=\"position:relative;\"><a href=\"#how-ai-enhances-iot-based-systems\" aria-label=\"how ai enhances iot based systems permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How AI enhances IoT-based Systems?</h2>\n<p>A typical IoT system integrates various sensors, servo motors, either on an Arduino board or Raspberry pi board. This integrated circuit is then fit into the device that is intended to be made smart. Now, these devices generate data. The data can either be structured or unstructured. The devices actually become smart when they invoke the experiential analysis from this data. This is where AI comes into the picture.\n</p>\n<p>Both IoT and AI have their part to play. IoT server generates humongous data, while AI has the potential to decipher and derive insights from it. Hence, by coupling both the capabilities, one can establish an intelligent-acting system.\n</p>\n<p>Businesses and Enterprises across verticals can leverage the IoT-based analysis to make efficacious decisions and creative plans. An artificial Intelligence-based IoT-system can also provide enhanced security and confidentiality.\n</p>\n<h2 id=\"why-use-ai-enabled-iot-systems\" style=\"position:relative;\"><a href=\"#why-use-ai-enabled-iot-systems\" aria-label=\"why use ai enabled iot systems permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why use AI-enabled IoT Systems?</h2>\n<h3 id=\"increased-efficiency\" style=\"position:relative;\"><a href=\"#increased-efficiency\" aria-label=\"increased efficiency permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Increased Efficiency</h3>\n<p>The continuous data streams, along with complex data points, can be analyzed using various Machine Learning algorithms like Linear or Logistic Regression, Random Forest, etc. Which, in turn, can help find the loopholes that need to be fixed for efficient system execution.\n</p>\n<p>It also helps in identifying the deficiencies and find an optimal alternative for a pre-existing architecture. Thus, eventually resulting in increased efficiency.\n</p>\n<h3 id=\"reliable-disaster-recovery\" style=\"position:relative;\"><a href=\"#reliable-disaster-recovery\" aria-label=\"reliable disaster recovery permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reliable Disaster Recovery</h3>\n<p>AI-enabled IoT systems can predict a wide range of risk points well in advance. This not only helps in mitigating the risk but also ensures a smooth recovery just in case the system failure occurs. This serves as a dual benefit saving the overhead expenses and avoiding a breakdown facilitating BAU (Business as Usual).\n</p>\n<p>Thus, enterprises should have a well-structured business continuity plan in place so that the risk mitigation can be implemented. IoT-based smart devices get a high degree of benefit when it comes to mitigating risk and disaster recovery, provided they have a research-intensive analysis in place.\n</p>\n<h3 id=\"better-scalability-prospects\" style=\"position:relative;\"><a href=\"#better-scalability-prospects\" aria-label=\"better scalability prospects permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Better Scalability Prospects</h3>\n<p>The low-end sensors and ICs which form the entire IoT system may not be cent percent accurate at all times. But, if the system has an AI filter that analyzes the data and sends the refined version for further processing, the scalability prospects can be increased dramatically.\n\nThink of it as a screening mechanism wherein the machine learning techniques analyze and filter the valid data points and transmit if further to give a more concrete overview of things.\n</p>\n<h3 id=\"reduced-overhead-expenditure\" style=\"position:relative;\"><a href=\"#reduced-overhead-expenditure\" aria-label=\"reduced overhead expenditure permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reduced Overhead Expenditure</h3>\n<p>The smart systems are actually 'smart' when they employ experiential learning and caters to the users with a predictive fault-tolerant mechanism. The predictive maintenance enables the users to forecast possible damages and breakdowns well in time.\n\nAnother facet to the reduced expenditure is the reduced operational cost. The integration of AI into the IoT system saves the cost and effort for an explicit mechanism to handle data concerns.\n</p>\n<p>These were the benefits that an AI-based IoT-system offers to its users. Now, let's look at the real-world implementation of the same.\n</p>\n<h2 id=\"real-life-implications\" style=\"position:relative;\"><a href=\"#real-life-implications\" aria-label=\"real life implications permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Real-Life Implications</h2>\n<h3 id=\"self-driving-cars\" style=\"position:relative;\"><a href=\"#self-driving-cars\" aria-label=\"self driving cars permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Self Driving Cars</h3>\n<p>Self-Driving Cars are the best example of AI+IoT based system in the real world. These cars can predict the pedestrian's movements and suggest possible measures to be taken for the cognitive sensing machines. It helps in finding the suitable driving speed, amount of time, and the optimum path to reach a destination.\n</p>\n<h1 id=\"summing-up\" style=\"position:relative;\"><a href=\"#summing-up\" aria-label=\"summing up permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summing Up</h1>\n<p> Thus, if we critically analyze the integration of Artificial Intelligence with the Internet of Things, then it is a win-win situation. The AI-based systems manage the data streams and evaluate data points in real-time to make wise decisions in order to optimize the performance and efficiency of the smart devices and automation systems.</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"October 28, 2020","updated_date":null,"description":"AI and IOT are very popular these days. Let's understand Why IoT and AI together make the perfect match!","title":"IoT and AI - The Perfect Match","tags":["AI","IOT"],"pinned":null,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.5037593984962405,"src":"/static/b1b9c80796e949acd1bf6657ca06bcb3/14b42/cover.jpg","srcSet":"/static/b1b9c80796e949acd1bf6657ca06bcb3/f836f/cover.jpg 200w,\n/static/b1b9c80796e949acd1bf6657ca06bcb3/2244e/cover.jpg 400w,\n/static/b1b9c80796e949acd1bf6657ca06bcb3/14b42/cover.jpg 800w,\n/static/b1b9c80796e949acd1bf6657ca06bcb3/47498/cover.jpg 1200w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Devansh Agarwal","github":"Devanshh","avatar":null}}}}]},"markdownRemark":{"excerpt":"Identity is evolving, and developers are at the forefront of this transformation. Every day brings a new learning—adapting to new standards…","fields":{"slug":"/identity/developer-first-identity-provider-loginradius/"},"html":"<p>Identity is evolving, and developers are at the forefront of this transformation. Every day brings a new learning—adapting to new standards and refining approaches to building secure, seamless experiences.</p>\n<p>We’re here to support developers on that journey. We know how important simplicity, efficiency, and well-structured documentation are when working with identity and access management solutions. That’s why we’ve redesigned the <a href=\"https://www.loginradius.com/\">LoginRadius website</a>—to be faster, more intuitive, and developer-first in every way.</p>\n<p>The goal? Having them spend less time searching and more time building.</p>\n<h2 id=\"whats-new-and-improved-on-the-loginradius-website\" style=\"position:relative;\"><a href=\"#whats-new-and-improved-on-the-loginradius-website\" aria-label=\"whats new and improved on the loginradius website permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What’s New and Improved on the LoginRadius Website?</h2>\n<p>LoginRadius’ vision is to give developers a product that simplifies identity management so they can focus on building, deploying, and scaling their applications. To enhance this experience, we’ve spent the last few months redesigning our interface— making navigation more intuitive and reassuring that essential resources are easily accessible.</p>\n<p>Here’s a closer look at what’s new and why it’s important:</p>\n<h3 id=\"a-developer-friendly-dark-theme\" style=\"position:relative;\"><a href=\"#a-developer-friendly-dark-theme\" aria-label=\"a developer friendly dark theme permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>A Developer-Friendly Dark Theme</h3>\n<p><img src=\"/f46881583c7518a93bb24e94c32320de/a-developer-friendly-dark-theme.webp\" alt=\"This image shows how LoginRadius offers several authentication methods like traditional login, social login, passwordless login, passkeys and more in a dark mode.\">    </p>\n<p>Developers spend long hours working in dark-themed IDEs and terminals, so we’ve designed the LoginRadius experience to be developer-friendly and align with that preference.</p>\n<p>The new dark mode reduces eye strain, enhances readability, and provides a seamless transition between a coding environment and our platform. Our new design features a clean, modern aesthetic with a consistent color scheme and Barlow typography, ensuring better readability. High-quality graphics and icons are thoughtfully placed to enhance the content without adding visual clutter.</p>\n<p>So, whether you’re navigating our API docs or configuring authentication into your system, our improved interface will make those extended development hours more comfortable and efficient.</p>\n<h3 id=\"clear-categorization-for-loginradius-capabilities\" style=\"position:relative;\"><a href=\"#clear-categorization-for-loginradius-capabilities\" aria-label=\"clear categorization for loginradius capabilities permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Clear Categorization for LoginRadius Capabilities</h3>\n<p><img src=\"/e5358b82be414940f3fb146013845933/capabilities.webp\" alt=\"This image shows a breakdown of all the LoginRadius CIAM capabilities, including authentication, security, UX, scalability and multi-brand management.\"></p>\n<p>We’ve restructured our website to provide a straightforward breakdown of our customer identity and access management platform capabilities, helping you quickly find what you need:</p>\n<ul>\n<li>Authentication: Easily understand <a href=\"https://www.loginradius.com/blog/identity/authentication-option-for-your-product/\">how to choose the right login method</a>, from traditional passwords and OTPs to social login, federated SSO, and passkeys with few lines of code.</li>\n<li>Security: Implement no-code security features like bot detection, IP throttling, breached password alerts, DDoS protection, and adaptive MFA to safeguard user accounts.</li>\n<li>User Experience: Leverage AI builder, hosted pages, and drag-and-drop workflows to create smooth, branded sign-up and login experiences.</li>\n<li>High Performance &#x26; Scalability: Confidently scale with sub-100ms API response times, 100% uptime, 240K+ RPS, and 28+ global data center regions.</li>\n<li>Multi-Brand Management: Efficiently manage multiple identity apps, choosing isolated or shared data stores based on your brand’s unique needs.</li>\n</ul>\n<p>This structured layout ensures you can quickly understand each capability and how it integrates into your identity ecosystem.</p>\n<h3 id=\"developer-first-navigation\" style=\"position:relative;\"><a href=\"#developer-first-navigation\" aria-label=\"developer first navigation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Developer-First Navigation</h3>\n<p><img src=\"/a8c155c2b6faf3d5f4b4de4e2b14d763/developers-menu.webp\" alt=\"This image shows the LoginRadius menu bar, highlighting the developer dropdown.\">   </p>\n<p>We’ve been analyzing developer workflows to identify how you access key resources. That’s why we redesigned our navigation with one goal in mind: to reduce clicks and make essential resources readily available.</p>\n<p>The new LoginRadius structure puts APIs, SDKs, and integration guides right at the menu bar under the Developers dropdown so you can get started faster. Our Products, Solutions, and Customer Services are also clearly categorized, helping development teams quickly find the right tools and make informed decisions.</p>\n<h3 id=\"quick-understanding-of-integration-benefits\" style=\"position:relative;\"><a href=\"#quick-understanding-of-integration-benefits\" aria-label=\"quick understanding of integration benefits permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Quick Understanding of Integration Benefits</h3>\n<p><img src=\"/b2f9a964a2da0ea83e2f8596b833bba7/we-support-your-tech-stack.webp\" alt=\"This image shows a list of popular programming languages and frameworks offered by LoginRadius.\"></p>\n<p>Developers now have a clear view of the tech stack available with LoginRadius, designed to support diverse business needs.</p>\n<p>Our platform offers pre-built SDKs for Node.js, Python, Java, and more, making CIAM integration seamless across popular programming languages and frameworks.</p>\n<h2 id=\"over-to-you-now\" style=\"position:relative;\"><a href=\"#over-to-you-now\" aria-label=\"over to you now permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Over to You Now!</h2>\n<p>Check out our <a href=\"https://www.loginradius.com/\">revamped LoginRadius website</a> and see how the improved experience makes it easier to build, scale, and secure your applications.</p>\n<p>Do not forget to explore the improved navigation and API documentation, and get started with our free trial today. We’re excited to see what you’ll build with LoginRadius!</p>\n<style class=\"grvsc-styles\">\n  .grvsc-container {\n    overflow: auto;\n    -webkit-overflow-scrolling: touch;\n    padding-top: 1rem;\n    padding-top: var(--grvsc-padding-top, var(--grvsc-padding-v, 1rem));\n    padding-bottom: 1rem;\n    padding-bottom: var(--grvsc-padding-bottom, var(--grvsc-padding-v, 1rem));\n    border-radius: 8px;\n    border-radius: var(--grvsc-border-radius, 8px);\n    font-feature-settings: normal;\n  }\n  \n  .grvsc-code {\n    display: inline-block;\n    min-width: 100%;\n  }\n  \n  .grvsc-line {\n    display: inline-block;\n    box-sizing: border-box;\n    width: 100%;\n    padding-left: 1.5rem;\n    padding-left: var(--grvsc-padding-left, var(--grvsc-padding-h, 1.5rem));\n    padding-right: 1.5rem;\n    padding-right: var(--grvsc-padding-right, var(--grvsc-padding-h, 1.5rem));\n  }\n  \n  .grvsc-line-highlighted {\n    background-color: var(--grvsc-line-highlighted-background-color, transparent);\n    box-shadow: inset var(--grvsc-line-highlighted-border-width, 4px) 0 0 0 var(--grvsc-line-highlighted-border-color, transparent);\n  }\n  \n</style>","frontmatter":{"date":"February 21, 2025","updated_date":null,"description":"LoginRadius’ vision is to give developers a product that simplifies identity management so they can focus on building, deploying, and scaling their applications. To enhance this experience, we’ve redesigned our website interface, making navigation more intuitive and reassuring that essential resources are easily accessible.","title":"Revamped & Ready: Introducing the New Developer-First LoginRadius Website","tags":["Developer tools","API","Identity Management","User Authentication"],"pinned":true,"coverImage":{"childImageSharp":{"fluid":{"aspectRatio":1.7857142857142858,"src":"/static/80b4e4fbe176a10a327d273504607f32/58556/hero-section.webp","srcSet":"/static/80b4e4fbe176a10a327d273504607f32/61e93/hero-section.webp 200w,\n/static/80b4e4fbe176a10a327d273504607f32/1f5c5/hero-section.webp 400w,\n/static/80b4e4fbe176a10a327d273504607f32/58556/hero-section.webp 800w,\n/static/80b4e4fbe176a10a327d273504607f32/99238/hero-section.webp 1200w,\n/static/80b4e4fbe176a10a327d273504607f32/7c22d/hero-section.webp 1600w,\n/static/80b4e4fbe176a10a327d273504607f32/1258b/hero-section.webp 2732w","sizes":"(max-width: 800px) 100vw, 800px"}}},"author":{"id":"Rakesh Soni","github":"oyesoni","avatar":"rakesh-soni.jpg"}}}},"pageContext":{"limit":6,"skip":666,"currentPage":112,"type":"///","numPages":161,"pinned":"ee8a4479-3471-53b1-bf62-d0d8dc3faaeb"}},"staticQueryHashes":["1171199041","1384082988","2100481360","23180105","528864852"]}