<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Akilesh</title>
    <description>The latest articles on Forem by Akilesh (@akilesh).</description>
    <link>https://forem.com/akilesh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F608965%2F3fec689a-6a13-4fe0-b3b5-17ddf3928bb1.png</url>
      <title>Forem: Akilesh</title>
      <link>https://forem.com/akilesh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/akilesh"/>
    <language>en</language>
    <item>
      <title>Custom Theme with MUI/Material and MUI/Joy</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Sat, 19 Apr 2025 17:54:01 +0000</pubDate>
      <link>https://forem.com/akilesh/custom-theme-with-muimaterial-and-muijoy-48e8</link>
      <guid>https://forem.com/akilesh/custom-theme-with-muimaterial-and-muijoy-48e8</guid>
      <description>&lt;h3&gt;
  
  
  Below implementation custom color's with Mui/Joy &amp;amp; Material with Next.js &lt;code&gt;/page&lt;/code&gt; route
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;ThemeProvider&lt;/code&gt; component which we will be using it to store our custom theme, I have added custom colors and break points feel free to use it as your starting point.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CssVarsProvider is deprecated works for now but need to replace it in future releases&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;ThemeProvider.tsx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;extendTheme&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;materialExtendTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;CssVarsProvider&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;MaterialCssVarsProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;THEME_ID&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;MATERIAL_THEME_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mui/material/styles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CssVarsProvider&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;JoyCssVarsProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mui/joy/styles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;CssBaseline&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mui/material/CssBaseline&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;declare&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mui/material/styles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Palette&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;white&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;contrastText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nl"&gt;black&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;lightest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;we&lt;/span&gt;
    &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;PaletteOptions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;white&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;contrastText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;black&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nl"&gt;lightest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;theme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;colorSchemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;palette&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FAFAFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Winter&lt;/span&gt;
                    &lt;span class="na"&gt;paper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FAFAFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Winter&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#00008B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Royal&lt;/span&gt;
                    &lt;span class="na"&gt;contrastText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FAFAFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#E6E6F0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#dfdff7&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;secondary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#0A64BC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// Sea&lt;/span&gt;
                    &lt;span class="na"&gt;contrastText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FAFAFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#157811&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Wealth&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#D53F55&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Red Rose&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;white&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FAFAFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Winter&lt;/span&gt;
                    &lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#FFFFFF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// vennila white&lt;/span&gt;
                    &lt;span class="na"&gt;contrastText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#1B2D44&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#0A0A0A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Jet&lt;/span&gt;
                    &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#1B2D44&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Midnight&lt;/span&gt;
                    &lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#666666&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Platinum 40&lt;/span&gt;
                    &lt;span class="na"&gt;lightest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#D9D9D9&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Platinum&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;

            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;breakpoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;sm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;481&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;md&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;769&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;lg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1025&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;xl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1201&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;satisfies&lt;/span&gt; &lt;span class="nx"&gt;Parameters&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;materialExtendTheme&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;materialTheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;materialExtendTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ThemeProvider&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MaterialCssVarsProvider&lt;/span&gt; &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;MATERIAL_THEME_ID&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;materialTheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;JoyCssVarsProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CssBaseline&lt;/span&gt; &lt;span class="na"&gt;enableColorScheme&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;JoyCssVarsProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;MaterialCssVarsProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets import and wrap &lt;code&gt;ThemeProvider&lt;/code&gt; around our main &lt;code&gt;_app.jsx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;_app.jsx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ThemeProvider&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./ThemeProvider&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pageProps&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ThemeProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;pageProps&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ThemeProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example usage&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mui/material&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;
    &lt;span class="na"&gt;sx&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primary.main&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;white.light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;500&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;14px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;textTransform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    Save
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  My take
&lt;/h3&gt;

&lt;p&gt;From my personal experience I feel &lt;code&gt;mui/joy&lt;/code&gt; doesn't hold its position comparing to its elder brother &lt;code&gt;mui/material&lt;/code&gt; Its not a fair comparison cause its still in beta version still I tried and at the end of the day I dont have the seamless integration feeling even after I got everything work together.&lt;/p&gt;

&lt;p&gt;I dont recommend to use it in your production environment (have fun testing in your side project’s) there is long way to go. I highly suggest you to stick with  &lt;code&gt;mui/material&lt;/code&gt; no need to make thing's complicated than they are.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Embed Substack Signup Form in React</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Tue, 19 Dec 2023 05:30:40 +0000</pubDate>
      <link>https://forem.com/akilesh/embed-substack-signup-form-in-react-32oi</link>
      <guid>https://forem.com/akilesh/embed-substack-signup-form-in-react-32oi</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;" This article is published using &lt;a href="https://www.lamento.in/" rel="noopener noreferrer"&gt;Lamento&lt;/a&gt;🍋&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have used &lt;a href="https://substackapi.com/" rel="noopener noreferrer"&gt;substackapi&lt;/a&gt; to achieve this Custom Embed Substack Signup Form&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;substackUrl&lt;/strong&gt;: Copy your Substack domain URL and replace &lt;a href="//akileshio.substack.com"&gt;akileshio.substack.com&lt;/a&gt; with yours
```
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;substackUrl: "akileshio.substack.com",&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b3pvrfr53fhrilrd5g6l.png)

* **theme**: To customize colors you can use pre-defined style `purple`, `orange` or `green` in theme or if you wanted to add your own colors scheme add `custom` in theme and add your colors to `primary, input, email &amp;amp; text`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;theme: "custom",&lt;br&gt;
colors: {&lt;br&gt;
        primary: "#FFFFFF",&lt;br&gt;
        input: "#334155",&lt;br&gt;
        email: "#FFFFFF",&lt;br&gt;
        text: "#000000",&lt;br&gt;
      }&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
**Here is your final code:**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;import React, { useEffect } from 'react';&lt;/p&gt;

&lt;p&gt;const SubstackWidget = () =&amp;gt; {&lt;br&gt;
  useEffect(() =&amp;gt; {&lt;br&gt;
    // Define the CustomSubstackWidget on the window object&lt;br&gt;
    window.CustomSubstackWidget = {&lt;br&gt;
      substackUrl: "akileshio.substack.com",&lt;br&gt;
      placeholder: "&lt;a href="mailto:example@gmail.com"&gt;example@gmail.com&lt;/a&gt;",&lt;br&gt;
      buttonText: "Subscribe",&lt;br&gt;
      theme: "custom",&lt;br&gt;
      colors: {&lt;br&gt;
        primary: "#FFFFFF",&lt;br&gt;
        input: "#334155",&lt;br&gt;
        email: "#FFFFFF",&lt;br&gt;
        text: "#000000",&lt;br&gt;
      },&lt;br&gt;
    };&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Create a new script element
const script = document.createElement('script');

// Set the source of the script to the Substack widget script
script.src = "https://substackapi.com/widget.js";
script.async = true;

// Append the script to the body
document.body.appendChild(script);

// Cleanup function to remove the script when the component unmounts
return () =&amp;gt; {
  document.body.removeChild(script);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}, []);&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;/p&gt;
&lt;br&gt;
  );&lt;br&gt;
};

&lt;p&gt;export default SubstackWidget;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
I you want to make your users redirect to custom URL after they signup, visit (substackapi)[https://substackapi.com/] to Unlock  Custom Redirect for $3.99/month.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>substack</category>
      <category>react</category>
      <category>form</category>
      <category>newsletter</category>
    </item>
    <item>
      <title>What is BUN</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Tue, 26 Sep 2023 04:21:26 +0000</pubDate>
      <link>https://forem.com/akilesh/what-is-bun-1fa1</link>
      <guid>https://forem.com/akilesh/what-is-bun-1fa1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;'' This article is published using &lt;a href="https://www.lamento.in/"&gt;Lamento&lt;/a&gt;🍋&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The All Rounder:
&lt;/h2&gt;

&lt;p&gt;Bun is a all in one toolkit for JavaScript developer helps us to do the same task (running, building, testing, and debugging) but faster &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What's the point of having hi-end gaming PC when the player isn't good at the game he is just bad but faster &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What makes BUN special?&lt;/strong&gt; it's fast &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes BUN fast?&lt;/strong&gt; BUN is written in ZIG and uses JavaScriptCore engine which powers WebKit browsers such as Safari while Node and Deno uses V8. . The team has spent a ton of time optimizing it&lt;/p&gt;

&lt;h2&gt;
  
  
  Bun has 4 main trump cards: 🎴
&lt;/h2&gt;

&lt;h3&gt;
  
  
  JavaScript runtime" 🏃
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Node.js compatibility &amp;amp; BUN APIs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A node and Deno alternative but has built-in support for Node APIs which makes existing node.js project and npm package works fine with bun. Although most of the Node API works with BUN but its not completely compatible with Node do cheack this Node.js compatibility to know more about supported APIs. BUN has its own standard-library APIs are designed to be fast and easy-to-use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How BUN handles ESM issue&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Bun supports both CommonJS and ES modules there is no need to including "type": "module" in package.json and it can even use import and require(), in the same file&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import lodash from "lodash";&lt;br&gt;
const express = require('express')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bun has built-in support for SQLite. Which has written in written in native code to be faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Framework:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;BUN can be paired with Server frameworks (Express, Koa, and Hono), full-stack frameworks (Next.js, Remix, Nuxt, Astro, SvelteKit, Nest, SolidStart, and Vite)&lt;/p&gt;

&lt;h3&gt;
  
  
  Package manager"💼
&lt;/h3&gt;

&lt;p&gt;BUN isn't the first one who has tried to speed up NPM, there are yarn and pnpn who have their own way of doing things&lt;/p&gt;

&lt;p&gt;To attain it's peak performance bun has 2 main ingredient's&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Global Module Cache: The system stores copies of software modules that has previously downloaded from the npm registry. Instead of repeatedly downloading the same packages it stores in global module cache and uses them when ever needed. &lt;code&gt;pnpm to uses this method&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fastest System Calls: System calls are fundamental functions provided by the operating system that allow programs to interact with the hardware. It optimizes its interactions with the underlying operating system to ensure that it performs tasks as efficiently as possible.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Its possible to use BUN as a package manager even when its not used as a runtime&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Bundler"📦
&lt;/h3&gt;

&lt;p&gt;Bun is a JavaScript and TypeScript bundler and minifier that can be used to bundle code for the browser, Node.js, and other platforms. It's heavily inspired by esbuild and provides a compatible plugin API.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bun build ./index.tsx --outdir ./build&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bun's fast native bundler is now in beta&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bun introduces JavaScript Macros are used to make a sequence of computing instructions available to the programmer as a single program statement. Macros runs JavaScript functions at bundle-time. The value returned from these functions are directly inlined into the bundle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing libraries"🧪
&lt;/h3&gt;

&lt;p&gt;Bun has a built-in testing module bun:test that is fully Jest-compatible . Tests are executed with the Bun runtime&lt;/p&gt;

&lt;p&gt;It supports:&lt;/p&gt;

&lt;p&gt;TypeScript and JSX&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Snapshot testing&lt;/li&gt;
&lt;li&gt;Lifecycle hooks&lt;/li&gt;
&lt;li&gt;UI &amp;amp; DOM testing&lt;/li&gt;
&lt;li&gt;Watch mode with --watch&lt;/li&gt;
&lt;li&gt;Script pre-loading with --preload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tests are written in JavaScript or TypeScript with a Jest-like API. Refer to &lt;a href="https://bun.sh/docs/test/writing"&gt;Writing tests&lt;/a&gt; for full documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing bun:
&lt;/h3&gt;

&lt;p&gt;Mac/Linux/WSL ( Windows Subsystem for Linux ) &lt;/p&gt;

&lt;p&gt;CURL:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -fsSL https://bun.sh/install | bash&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;NPM:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install -g bun&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows : Sadly windows user's cant able to experience bun at the moment as it is in highly experimental phases. Join #windows channel on BUNs Discord for updates.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Using WSL ( Windows Subsystem for Linux ) we can install and run BUN in window's&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>bunjs</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Customizing Google Chrome Dino Game Characters 🦖</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Wed, 14 Jun 2023 17:01:37 +0000</pubDate>
      <link>https://forem.com/akilesh/dino-run-evolved-into-nezuko-run-115g</link>
      <guid>https://forem.com/akilesh/dino-run-evolved-into-nezuko-run-115g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;" This article is published using &lt;a href="https://www.lamento.in/" rel="noopener noreferrer"&gt;Lamento&lt;/a&gt;🍋&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is my custom png with nezuko charn which I am going to replace the default dino with.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fucicjzjz9gqhlsn4j1z7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fucicjzjz9gqhlsn4j1z7.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧭 Navigate
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.tochrome://dino/"&gt;chrome://dino/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Developer tool
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Ctrl + Shift + C&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Select &lt;code&gt;offline-resources&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznmaopxt04rbrz30e9kr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznmaopxt04rbrz30e9kr.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Change asserts URL
&lt;/h2&gt;

&lt;p&gt;change src of &lt;code&gt;offline-resources-1x&lt;/code&gt; &amp;amp; &lt;code&gt;offline-resources-2x&lt;/code&gt; to &lt;a href="https://i.ibb.co/37DSwDX/nezuko.png" rel="noopener noreferrer"&gt;https://i.ibb.co/37DSwDX/nezuko.png&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lil Nezuko chan 🏃‍♀️
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep5sze91iuyuwxisdrvg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep5sze91iuyuwxisdrvg.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>chrome</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Absolute Imports: Leveraging '@' for Efficient Direct Imports</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Mon, 12 Dec 2022 06:42:00 +0000</pubDate>
      <link>https://forem.com/akilesh/absolute-imports-540n</link>
      <guid>https://forem.com/akilesh/absolute-imports-540n</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;" This article is published using &lt;a href="https://www.lamento.in/"&gt;Lamento&lt;/a&gt;🍋&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Layout from "../components/layout";
import { fetcher } from '../lib/fetcher';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add this configuration in your tsconfig.json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    "baseUrl": ".",
    "paths": {
      "@/components/*": ["components/*"],
      "@/lib/*": ["lib/*"],
      "@/hooks/*": ["lib/hooks/*"]
    },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import Button from '@components/Layout'
import { fetcher } from '@lib/fetcher';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;make sure to restart the application in your localhost &lt;br&gt;
Reference:&lt;br&gt;
&lt;a href="https://www.netlify.com/blog/2020/12/07/absolute-imports-in-next.js/"&gt;https://www.netlify.com/blog/2020/12/07/absolute-imports-in-next.js/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Connect Server Using Terminal &amp; SSH</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Sun, 04 Dec 2022 18:30:00 +0000</pubDate>
      <link>https://forem.com/akilesh/types-of-ways-to-connect-using-ssh-3j43</link>
      <guid>https://forem.com/akilesh/types-of-ways-to-connect-using-ssh-3j43</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;'' This article is published using &lt;a href="https://www.lamento.in/"&gt;Lamento&lt;/a&gt;🍋&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Using terminal we are going to establish a remote connection to a Remote Server like (Droplet, E2C or any cloud vm).&lt;/p&gt;

&lt;p&gt;If you are using Linux or Mac you are good to go but in windows you should download &lt;a href="https://git-scm.com/downloads"&gt;git-bash&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;1) Now to generate your SSH key type his commends in your terminal.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's better to generate SSH keys inside &lt;code&gt;.ssh&lt;/code&gt; folder&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

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

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

&lt;/div&gt;



&lt;p&gt;2) Now name your key &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;you can name your key what ever suits for you&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;3) Don't need any passphrase&lt;/p&gt;

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

&lt;p&gt;We have generated two files public key &amp;amp; private key&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;public key - Used by the Server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;private key - Used by the Client&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;4) Open the public key files&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
cat ur-key-name.pub

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

&lt;/div&gt;



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

&lt;p&gt;We need to provide our public key to the remote server by opening it in terminal and copy the phrase.&lt;/p&gt;

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

&lt;p&gt;5) To establish connection between client with server&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
ssh -i ./droplet-ssh-key root@157.245.104.56

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Abbreviation: ssh -i keyfile target_machineusername@host&lt;/p&gt;

&lt;p&gt;&lt;a href="https://askubuntu.com/questions/817626/whats-the-meaning-of-i-in-ssh"&gt;What's the meaning of -i in ssh?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By providing the private keyfile and our server username and ip address we are opening a connection between client and server&lt;/p&gt;

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

&lt;p&gt;If you see the above message we have successfully connected our client with the server&lt;/p&gt;

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

&lt;p&gt;You can check your system specification with this commends&lt;br&gt;
&lt;/p&gt;

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


df -h


lscpu

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

&lt;/div&gt;



&lt;p&gt;To terminate the session enter &lt;code&gt;exit&lt;/code&gt; in terminal.&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>cloud</category>
      <category>bash</category>
      <category>aws</category>
    </item>
    <item>
      <title>Connect using BASH</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Sat, 03 Dec 2022 11:08:48 +0000</pubDate>
      <link>https://forem.com/akilesh/bash-ssh-create-connect-461k</link>
      <guid>https://forem.com/akilesh/bash-ssh-create-connect-461k</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;" This article is published using &lt;a href="https://www.lamento.in/"&gt;Lamento&lt;/a&gt;🍋&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Install Bash
&lt;/h2&gt;

&lt;p&gt;If you have Linux or mac OS running on your device you are blessed with free bash integration but in windows you should install and configure it. luckily for windows we can use &lt;a href="https://git-scm.com/downloads"&gt;Git Bash&lt;/a&gt; as an alternative &amp;amp; Powershell to works fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Path
&lt;/h2&gt;

&lt;p&gt;Open your Bash terminal on the folder where you needed the SSH key to be generated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate key gen
&lt;/h2&gt;

&lt;p&gt;1- Enter this command to start the ssh generation process.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;2- It will ask you to assign the path where it need to be store the generated token.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bfck6c78b2zeibz176r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bfck6c78b2zeibz176r.png" alt="Image description" width="800" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3- A passphrase will be asked for generations but this could be omitted just leave it empty and press enter.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flhujqu8nsp02iate7vmy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flhujqu8nsp02iate7vmy.png" alt="Image description" width="800" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4- The ssh key is generated on the specific location successfully.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx39d8lz67bvmn913n8nv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx39d8lz67bvmn913n8nv.jpg" alt="Image description" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5- Enter this command to view the files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat your-ssh.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;6- Paste the pub ssh key in this text area and assign a name to it.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1subxnugmw0hr2t4j3nr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1subxnugmw0hr2t4j3nr.png" alt="Image description" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7- To connect with the cloud computer from your terminal use this command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -i ./plausible-ssh root@13x.5x.x6.8x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Here root is your digital ocean Droplets user name &amp;amp; follow up the ip address of the droplet.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ssh</category>
      <category>bash</category>
      <category>droplet</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Enhance Next.js with Vercel Analytics: A Step-by-Step Guide</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Tue, 25 Oct 2022 20:13:02 +0000</pubDate>
      <link>https://forem.com/akilesh/vercel-analytics-3531</link>
      <guid>https://forem.com/akilesh/vercel-analytics-3531</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;" This article is published using &lt;a href="https://www.lamento.in/" rel="noopener noreferrer"&gt;Lamento&lt;/a&gt;🍋&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We have a new player entered the field of analytics.&lt;br&gt;
Just by taking a quick glance at Vercel Analytics it looks somewhat similar to plausible analytics, but beauty should be admired no hard work should go unnoticed.&lt;br&gt;
First let's set up an exiting Next.js v-12 application with this analytics.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Enable Vercel Analytics
&lt;/h2&gt;

&lt;p&gt;Go to your &lt;a href="https://vercel.com/dashboard" rel="noopener noreferrer"&gt;vercel dashboard&lt;/a&gt; and choose your project which you need to enable analytic.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4spvjiswrtjbq9len0rl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4spvjiswrtjbq9len0rl.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open analytics tab then select Audiences tab if it's your 1st time it will ask you to enable from the dialog.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6yuodoz0pwfmlj5sg5f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6yuodoz0pwfmlj5sg5f.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Install Dependencies
&lt;/h2&gt;

&lt;p&gt;In your project, install this package to monitor the application from Vercel dashboard.&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/@vercel/analytics" rel="noopener noreferrer"&gt;@vercel/analytics&lt;/a&gt; allows you to track page views in your Next.js app or any other website that is deployed to Vercel. All page views are automatically tracked in the app.&lt;/p&gt;

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

npm install @vercel/analytics


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

&lt;/div&gt;

&lt;p&gt;or&lt;/p&gt;


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

&lt;p&gt;yarn add @vercel/analytics&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  

&lt;ol&gt;
&lt;li&gt;Inject the Analytics script
&lt;/li&gt;
&lt;/ol&gt;
&lt;/h2&gt;


&lt;p&gt;Import the Analytics component which is a wrapper around the tracking script, offering us more seamless integration with Next.js.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pages/_app.ts&lt;/code&gt;&lt;/p&gt;


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

&lt;p&gt;import { Analytics } from '@vercel/analytics/react';&lt;/p&gt;

&lt;p&gt;function MyApp({ Component, pageProps }) {&lt;br&gt;
  return (&lt;br&gt;
    &amp;lt;&amp;gt;&lt;br&gt;
      &amp;lt;Component {...pageProps} /&amp;gt;&lt;br&gt;
      &amp;lt;Analytics /&amp;gt;&lt;br&gt;
    &amp;lt;/&amp;gt;&lt;br&gt;
  );&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;export default MyApp;&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  

&lt;ol&gt;
&lt;li&gt;Deploy
&lt;/li&gt;
&lt;/ol&gt;
&lt;/h2&gt;


&lt;p&gt;Push your code to your version control and By deploying the application to Vercel we can see all the analytics instinct.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To see the updated visible, open your domain and preview the dashboard. The changes will be visible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Finally
&lt;/h2&gt;

&lt;p&gt;Vercel have provided a minimal and primary use case where it&lt;br&gt;
check our site traffic and get all the essential insights.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tgdpr95ffyfn7ot18lk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tgdpr95ffyfn7ot18lk.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Notable Features
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Visitors count&lt;/li&gt;
&lt;li&gt;Page Views&lt;/li&gt;
&lt;li&gt;Top Pages (Pages which are the most visited)&lt;/li&gt;
&lt;li&gt;Top Referrers (Sites refer the most traffic)&lt;/li&gt;
&lt;li&gt;Countries&lt;/li&gt;
&lt;li&gt;Operating Systems&lt;/li&gt;
&lt;li&gt;Browsers&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Vercel says this feature will be free only at beta stage in the future it may offer in paid tires.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>analytics</category>
      <category>vercel</category>
      <category>nextjs</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Analytics using Plausible</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Mon, 27 Jun 2022 15:51:15 +0000</pubDate>
      <link>https://forem.com/akilesh/plausible-in-minutes-12gh</link>
      <guid>https://forem.com/akilesh/plausible-in-minutes-12gh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;" This article is published using &lt;a href="https://www.lamento.in/" rel="noopener noreferrer"&gt;Lamento&lt;/a&gt;🍋&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Plausible is a lightweight web analytics tool used to check your web traffic and also pinpoints from where the traffic comes from with clear visual charts and Email/Slack reports.&lt;/p&gt;

&lt;p&gt;In this blog I used next.js for reference to show how plausible works, but plausible will work on any framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Login/Create
&lt;/h2&gt;

&lt;p&gt;Create a &lt;a href="//ttps://plausible.io/"&gt;plausible account&lt;/a&gt; to get started and click the add website button.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a website
&lt;/h2&gt;

&lt;p&gt;Enter your domain name in the text area (provide the domain name which you have access to) and location will be automatically set accordingly to your device location.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt7wwf1k6bsbth2nzfy4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt7wwf1k6bsbth2nzfy4.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code snippet
&lt;/h2&gt;

&lt;p&gt;A code snippet will be generated from our previous details, and it needs to be pasted in our project's head.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6o4skzsguhdxqn5dttv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6o4skzsguhdxqn5dttv.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let's add this script to our project in our way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Create a meta.tsx file under the components directive and paste the below snippet.&lt;/p&gt;

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

import Head from 'next/head'

export default function Meta() {
    return (
        &amp;lt;Head&amp;gt;
            &amp;lt;script
                defer
                data-domain="akilesh.io"
                src="https://plausible.io/js/plausible.js"&amp;gt;
            &amp;lt;/script&amp;gt;
        &amp;lt;/Head&amp;gt;
    )
}


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

&lt;/div&gt;

&lt;p&gt;Now you can import this meta component to your layout.tsx component if you have one. If not, you can add it to this component to other components which have access to all the pages.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The ides here is to make the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag accessible by the whole application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Domain dashboard
&lt;/h2&gt;

&lt;p&gt;Go to your domain dashboard &lt;a href="https://plausible.io/**your_domain_name**" rel="noopener noreferrer"&gt;https://plausible.io/**your_domain_name**&lt;/a&gt; and stay relaxed. Plausible will handle all the complicated process and in a few seconds you will see your webpage's stats.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screen shot:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This will be your dashboard until you get someone to visit your website.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7973h142mlz0svlrbcj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7973h142mlz0svlrbcj.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This is a line chart represents about the total visitors and also will identify unique visitors from the total traffic then the duration of the visiting period.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsuubpfjp7kgizvoyd3j.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsuubpfjp7kgizvoyd3j.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This dashboard will give a detail representation&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F215pq7m2w8u3vbqdo13s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F215pq7m2w8u3vbqdo13s.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Top Sources (From where the traffic comes).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pages (On what page the user entered, exit).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Location.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devices, Browser, OS.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3rftmrsz55ljw9rfk3b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3rftmrsz55ljw9rfk3b.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have successfully integrated an open source analytics tool into our web application. Now we can get to know about your traffic source from where it comes to on which device the user has viewed from.&lt;/p&gt;

&lt;p&gt;To setup plausible manually from your hosting service subscribe to my &lt;a href="https://akilesh.io" rel="noopener noreferrer"&gt;newsletter&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'll promise to make it within next Monday plz bear with me.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>analytics</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Sentry Advanced Deployment Configuration</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Mon, 20 Jun 2022 11:17:46 +0000</pubDate>
      <link>https://forem.com/akilesh/sentry-advanced-deployment-configuration-bp2</link>
      <guid>https://forem.com/akilesh/sentry-advanced-deployment-configuration-bp2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;" This article is published using &lt;a href="https://www.lamento.in/"&gt;Lamento&lt;/a&gt;🍋&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Vercel
&lt;/h2&gt;

&lt;p&gt;Add sentry integration to your &lt;a href="https://vercel.com/integrations/sentry"&gt;Vercel account&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click &lt;code&gt;add integration&lt;/code&gt; it will prompt a popup in which we need to select the project which need sentry to integrate with.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywc2v42x1pbeqibcaesq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywc2v42x1pbeqibcaesq.jpg" alt="Image description" width="541" height="547"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next a popup will be shown from the Sentry about the project integration. Make sure the right &lt;code&gt;vercel project&lt;/code&gt; is matched with the &lt;code&gt;Sentry project&lt;/code&gt;. This will link our sentry project to Vercel.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fni2ikt4jb16jggcojctp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fni2ikt4jb16jggcojctp.jpg" alt="Image description" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Slack
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Now for the slack integration go to the &lt;a href="https://sentry.io/settings/akilesh-et/integrations/slack/"&gt;slack integrations&lt;/a&gt; panel and click on &lt;code&gt;Add workspace&lt;/code&gt;. This will pop up a slack authentication where you need to select your workspace.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1pg5d94ddd40s4nx4ob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh1pg5d94ddd40s4nx4ob.png" alt="Image description" width="690" height="978"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alert rule needs to be added to trigger the notification when ever the application crashes. Go to &lt;code&gt;Alert&lt;/code&gt; choose the Errors need to be notified when it happens and click on &lt;code&gt;Set conditions&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;According to your needs, you can configure the settings and experiment with them.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy977h2z1stdg1mbb5p0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy977h2z1stdg1mbb5p0e.png" alt="Image description" width="800" height="816"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Take my configuration as a reference for setting conditions. You can also ignore my config and create a new one.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Save the rule. When ever the application crashes and according to your alert condition the notification will be sent to your Slack channel.&lt;/p&gt;

&lt;p&gt;You have successfully integrated an error monitor into your application with the Slack notification 🔔.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Sentry with Next.js</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Mon, 13 Jun 2022 03:22:38 +0000</pubDate>
      <link>https://forem.com/akilesh/sentry-with-nextjs-c1m</link>
      <guid>https://forem.com/akilesh/sentry-with-nextjs-c1m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;" This article is published using &lt;a href="https://www.lamento.in/" rel="noopener noreferrer"&gt;Lamento&lt;/a&gt;🍋&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sentry is a crash reporting platform that provides you with "real-time insight into production deployments with info to reproduce and fix crashes".&lt;/p&gt;

&lt;p&gt;In this blog we will see how to integrate sentry into an existing next.js application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing 📥
&lt;/h2&gt;

&lt;p&gt;Add Sentry’s Next.js &lt;a href="https://github.com/getsentry/sentry-javascript/tree/master/packages/nextjs" rel="noopener noreferrer"&gt;SDK&lt;/a&gt; to your next.js projects.&lt;/p&gt;

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

yarn add @sentry/nextjs


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Automatic Configuration 🛠
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

npx @sentry/wizard -i nextjs


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

&lt;/div&gt;

&lt;p&gt;Choose your project from below listed options on your CLI then the setup wiz will automatically create configuration file's with default values and your API key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcommunity.ops.io%2Fremoteimages%2Fuploads%2Farticles%2F9rc7nf1qol4e9rpnhw4b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcommunity.ops.io%2Fremoteimages%2Fuploads%2Farticles%2F9rc7nf1qol4e9rpnhw4b.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generated file's:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sentry.client.config.js&lt;/li&gt;
&lt;li&gt;sentry.server.config.js&lt;/li&gt;
&lt;li&gt;.sentryclirc (Where the token key will be stored)&lt;/li&gt;
&lt;li&gt;sentry.properties&lt;/li&gt;
&lt;li&gt;next.config.wizardcopy.js (if next.config.js already exists).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Modify next.config.js 🔧
&lt;/h2&gt;

&lt;p&gt;If &lt;code&gt;next.config.js&lt;/code&gt; does already exist in your project, the app will automatically create a &lt;code&gt;next.config.wizardcopy.js&lt;/code&gt; then we'll need to manually copy the snippet into &lt;code&gt;next.config.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2e86ay9o6ue3aiop5th.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2e86ay9o6ue3aiop5th.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

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

/** @type {import('next').NextConfig} */
const { withSentryConfig } = require( '@sentry/nextjs' );

const nextConfig = {
  reactStrictMode: true
}

const sentryWebpackPluginOptions = {
  // Additional config options for the Sentry Webpack plugin. Keep in mind that
  // the following options are set automatically, and overriding them is not
  // recommended:
  //   release, url, org, project, authToken, configFile, stripPrefix,
  //   urlPrefix, include, ignore

  silent: true, // Suppresses all logs
  // For all available options, see:
  // https://github.com/getsentry/sentry-webpack-plugin#options.
};

module.exports = withSentryConfig( nextConfig, sentryWebpackPluginOptions );


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Backend 🔙
&lt;/h2&gt;

&lt;p&gt;In an application to capture errors and monitor server performance of the API, we will wrap the handlers with a Sentry function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import { withSentry } from '@sentry/nextjs';

const handler = async (req, res) =&amp;gt; {
  // your API calls...
}

export default withSentry(handler);


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Reference:&lt;/strong&gt;&lt;/p&gt;

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

import type { NextApiRequest, NextApiResponse } from "next"
import { withSentry } from "@sentry/nextjs";

const handler = async (req: NextApiRequest, res: NextApiResponse) =&amp;gt; {
  res.status(200).json({ name: "Akilesh" });
};

export default withSentry(handler);


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Testing 🧪
&lt;/h2&gt;

&lt;p&gt;To check every thing works fine, we will trigger a button click event in a frontend component that throws an error.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

            &amp;lt;button type="button" onClick={() =&amp;gt; {
              throw new Error("Sentry Frontend Error");
            }}&amp;gt;
              Throw error
            &amp;lt;/button&amp;gt;


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

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge5mp9511b3pblxd4qtd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fge5mp9511b3pblxd4qtd.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now check your &lt;a href="https://sentry.io" rel="noopener noreferrer"&gt;sentry dashboard&lt;/a&gt; to know more about the errors and performance metrics.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fweglklcc6yl52vodrp4e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fweglklcc6yl52vodrp4e.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment (Vercel) 🛫
&lt;/h2&gt;

&lt;p&gt;Assuming that your next.js project has deployed on vercel.&lt;/p&gt;

&lt;p&gt;Add environment variable to your project in vercel &lt;code&gt;Project Settings &amp;gt; General &amp;gt; Environment Variables&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SENTRY_AUTH_TOKEN&lt;/code&gt;: in environment variable with your sentry auth token which will be present in your &lt;code&gt;.sentryclirc&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;You have successfully integrated sentry with your web application 🥳. To get notified 🔔 in your Slack and Vercel integration check out this &lt;a href="https://dev.to/akilesh/sentry-advanced-deployment-configuration-bp2"&gt;post&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sentry</category>
      <category>nextjs</category>
      <category>productivity</category>
      <category>performance</category>
    </item>
    <item>
      <title>Reinforcement learning in Super Mario bros Pt.2</title>
      <dc:creator>Akilesh</dc:creator>
      <pubDate>Thu, 30 Dec 2021 06:40:07 +0000</pubDate>
      <link>https://forem.com/akilesh/reinforcement-learning-in-super-mario-bros-pt2-1kkm</link>
      <guid>https://forem.com/akilesh/reinforcement-learning-in-super-mario-bros-pt2-1kkm</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/akilesh/reinforcement-learning-in-super-mario-bros-56i9"&gt;Before getting here you should setup &amp;amp; preprocess the environment tap your index or thumb finger hovering on me&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are building an AI 🤖 to play 🎮 Super Mario Bros by reinforcement learning method and  RL has four key elements.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Agent 🕵️&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fci08mafxz4ofrqd3mzzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fci08mafxz4ofrqd3mzzi.png" alt="Image description" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
Agent can take some action in an environment to have some rewards or penalties.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reward 🏆&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fadjcc16bwgdh83rxgce3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fadjcc16bwgdh83rxgce3.png" alt="Image description" width="586" height="597"&gt;&lt;/a&gt;&lt;br&gt;
depending upon agent action he will get a reward or a penalty&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Environment 🖼️&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd15ul9wlg69thijvq4ny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd15ul9wlg69thijvq4ny.png" alt="Image description" width="721" height="208"&gt;&lt;/a&gt;&lt;br&gt;
The place where all happens. Agent does specify work according to the AI by analyzing environment and reward or penalty is given by how good or bad does the agent perform in that environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Action 🎬&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfmjrjdbbongss6nihlf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfmjrjdbbongss6nihlf.gif" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
The task given to the agent do certain tasks.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The Algorithm we use is PPO &lt;a href="https://stable-baselines3.readthedocs.io/en/master/modules/ppo.html"&gt;Proximal Policy Optimization&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🚂 Train the model to play
&lt;/h2&gt;



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

from stable_baselines3 import PPO

from stable_baselines3.common.callbacks import BaseCallback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we are importing os to work with our file which helps when we save our model every 10000 games or steps so we can have a backup of our progress.&lt;/p&gt;

&lt;p&gt;Imported our main Algorithm PPO that will be used to train our AI model or reinforcement learning model&lt;/p&gt;

&lt;p&gt;then we imported &lt;a href="https://stable-baselines3.readthedocs.io/en/master/guide/callbacks.html"&gt;Base Callback&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To save the model 💾&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class TrainAndLoggingCallback(BaseCallback):

    def __init__(self, check_freq, save_path, verbose=1):
        super(TrainAndLoggingCallback, self).__init__(verbose)
        self.check_freq = check_freq
        self.save_path = save_path

    def _init_callback(self):
        if self.save_path is not None:
            os.makedirs(self.save_path, exist_ok=True)

    def _on_step(self):
        if self.n_calls % self.check_freq == 0:
            model_path = os.path.join(self.save_path, 'best_model_{}'.format(self.n_calls))
            self.model.save(model_path)

        return True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above step is optional you can skip it if you need. The process happening in the above step is we are saving the trained data at a set of callback intervals. So if we need we don't need to train the model again we can reuse this. Make sure you have enough storage space the model produces a hefty amount of data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Locate file 📁&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CHECKPOINT_DIR = './train/'
LOG_DIR = './logs/'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are specifying where the produced data is located at &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup Callback 📞🔙&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;callback = TrainAndLoggingCallback(check_freq=10000, save_path=CHECKPOINT_DIR)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is just the instance of the TrainAndLoggingCallback(). What we are doing here is to save our model every 1000 steps or every 1000 games &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We just have it as a backup for future reference else we need to re-run the whole training process.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;We are going to setup our PPO model 💃&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model = PPO('CnnPolicy', env, verbose=1, tensorboard_log=LOG_DIR, learning_rate=0.000001, 
            n_steps=512) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What we have done is create a variable called &lt;code&gt;model&lt;/code&gt; and set that to &lt;code&gt;PPO&lt;/code&gt; which is our model and passing parameters:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;CnnPolicy&lt;/code&gt;- It is like a computer-based brain like a Neural Network in deep learning. A bunch of neurons communicate with each other and learn the relationship between different variables. Then there are various policies for different tasks. We used &lt;code&gt;CnnPolicy&lt;/code&gt; because when it comes to image-based problems this model has its upper hand,
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;env&lt;/code&gt; - Our environment which we preprocessed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;verbose=1&lt;/code&gt; - This gives us the data when we train the model. like setting it to &lt;code&gt;0 no output, 1 info, 2 debug&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tensorboard_log=LOG_DIR&lt;/code&gt; - This helps us to view the metric of how our training is performing as we are running our model.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;learning_rate=0.000001&lt;/code&gt; - The learning rate, can be a function of the current progress remaining.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;n_steps=512&lt;/code&gt; - The number of steps to run for each environment per update.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The hardest thing in any deep learning or machine learning is Getting the data in the right format.&lt;br&gt;
This one-line code created a temporary AI model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;AI model starts to learn 📖&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model.learn(total_timesteps=100000, callback=callback)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where our AI model starts to learn we are passing some parameters:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;total_timesteps=100000&lt;/code&gt; - The total number of samples (env steps) to train on.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;callback=callback&lt;/code&gt; - called at every step with the state of the algorithm.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;You will get some details about the current process while running &lt;code&gt;model.learn&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6tkee2qzj889ef4zu6a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6tkee2qzj889ef4zu6a.jpg" alt="Image description" width="486" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you see the above then you are good to go else check the previous step or do it as a developer does stackoverflow it.&lt;/p&gt;

&lt;p&gt;Let's break down the resulting log by just taking look at some important values to notice.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;fps&lt;/code&gt; : Frame Per Second&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;iterations&lt;/code&gt; : Number of times the process repeated.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;time_elapsed&lt;/code&gt; : How long it been training for.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;total_timesteps&lt;/code&gt; : How many frames our model goes through.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Training Metrics :&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;entropy_loss&lt;/code&gt; (⬇️)  : In reinforcement learning, a similar situation can occur if the agent discovers a strategy that results in a reward that is better than it was receiving when it first started, but very far from a strategy that would result in an optimal reward.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;explained_variance&lt;/code&gt; (⬆️) : The explained variance is used to measure the proportion of the variability of the predictions of a machine learning model. Simply put, it is the difference between the expected value and the predicted value.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;learning_rate&lt;/code&gt; (📚): It is a tuning parameter in an optimization algorithm that determines the step size at each iteration while moving toward a minimum of a loss function.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;loss&lt;/code&gt; (⬇️) : loss is the value of the cost function for our training data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;value_loss&lt;/code&gt; (⬇️)  : val_loss is the value of cost function for our cross-validation data&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Finally ✨
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Load model ⌛&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model = PPO.load('./train/best_model_1000000')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are loading the trained model to our algorithm and saying the PPO algorithm to use that specific trained model to play Mario in our case it's &lt;code&gt;best_model_1000000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ai Plays Mario 🤖&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;state = env.reset()
while True: 

    action, _ = model.predict(state)
    state, reward, done, info = env.step(action)
    env.render()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we are starting our game and loop through the game. Previously we used some random actions to move Mario now we are using the model.predict(state) to predict according to the model and give certain actions to Mario.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Akilesh2112/AI-Mario"&gt;Source Code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article is created by referring to &lt;a href="https://youtu.be/2eeYqJ0uBKE?feature=shared"&gt;Nicholasrenotte work&lt;/a&gt; all credit goes to him.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;" This article is published using &lt;a href="https://www.lamento.in/"&gt;Lamento&lt;/a&gt;🍋&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>gym</category>
      <category>stablebaselines3</category>
      <category>openaigym</category>
      <category>python</category>
    </item>
  </channel>
</rss>
