<?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: Stephen Ajulu</title>
    <description>The latest articles on Forem by Stephen Ajulu (@stephenajulu).</description>
    <link>https://forem.com/stephenajulu</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%2F243345%2F9a3af99e-7461-414f-bf10-5c599fd60a01.jpeg</url>
      <title>Forem: Stephen Ajulu</title>
      <link>https://forem.com/stephenajulu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/stephenajulu"/>
    <language>en</language>
    <item>
      <title>How to Create a Dev Environment in Windows 10: Part 1</title>
      <dc:creator>Stephen Ajulu</dc:creator>
      <pubDate>Thu, 09 Jul 2020 16:08:07 +0000</pubDate>
      <link>https://forem.com/stephenajulu/how-to-create-a-dev-environment-in-windows-10-part-1-16d6</link>
      <guid>https://forem.com/stephenajulu/how-to-create-a-dev-environment-in-windows-10-part-1-16d6</guid>
      <description>&lt;p&gt;Hi, guys? Long time, huh? Hope you are all doing great! and you are all safe and sound. Today i would like to help you create a development/hacking environment in Windows 10. So let’s get started with Part 1: First Installation.&lt;/p&gt;

&lt;p&gt;First you’ll need to make sure you have a Windows 10, updated to 10th May 202 version(Windows 10, Version 2004, Build 19041 or higher).&lt;/p&gt;

&lt;p&gt;Now i would like you to install the Windows Subsystem for Linux v1 and 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here’s the installation:
&lt;/h2&gt;

&lt;h2&gt;
  
  
  WSL1
&lt;/h2&gt;

&lt;p&gt;Before installing any Linux distributions on Windows, you must enable the “Windows Subsystem for Linux” optional feature.&lt;/p&gt;

&lt;p&gt;Open PowerShell as Administrator and run:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;To only install WSL 1, you should now restart your machine and move on to &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/install-win10#install-your-linux-distribution-of-choice" rel="noopener noreferrer"&gt;Install your Linux distribution of choice&lt;/a&gt;, otherwise wait to restart and move on to update to WSL 2. Read more about &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/compare-versions" rel="noopener noreferrer"&gt;Comparing WSL 2 and WSL 1&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  WSL2
&lt;/h2&gt;

&lt;p&gt;To update to WSL 2, you must meet the following criteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running Windows 10, &lt;a href="https://ajulusthoughts.wordpress.com/2020/07/09/how-to-create-a-dev-environment-in-windows-10-part-1/windowsupdate" rel="noopener noreferrer"&gt;updated to version 2004&lt;/a&gt;, &lt;strong&gt;Build 19041&lt;/strong&gt; or higher.&lt;/li&gt;
&lt;li&gt;Check your Windows version by selecting the &lt;strong&gt;Windows logo key + R&lt;/strong&gt;, type &lt;strong&gt;winver&lt;/strong&gt;, select &lt;strong&gt;OK&lt;/strong&gt;. (Or enter the &lt;em&gt;&lt;code&gt;ver&lt;/code&gt;&lt;/em&gt; command in Windows Command Prompt). Please &lt;a href="https://ajulusthoughts.wordpress.com/2020/07/09/how-to-create-a-dev-environment-in-windows-10-part-1/windowsupdate" rel="noopener noreferrer"&gt;update to the latest Windows version&lt;/a&gt; if your build is lower than 19041. &lt;a href="https://www.microsoft.com/software-download/windows10" rel="noopener noreferrer"&gt;Get Windows Update Assistant&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Enable the ‘Virtual Machine Platform’ optional component
&lt;/h4&gt;

&lt;p&gt;Before installing WSL 2, you must enable the “&lt;em&gt;Virtual Machine Platform&lt;/em&gt;” optional feature.&lt;/p&gt;

&lt;p&gt;Open PowerShell as Administrator and run: PowerShell&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Restart&lt;/strong&gt; your machine to complete the WSL install and update to WSL 2.&lt;/p&gt;

&lt;h4&gt;
  
  
  Set WSL 2 as your default version
&lt;/h4&gt;

&lt;p&gt;Run the following command in PowerShell to set WSL 2 as the default version when installing a new Linux distribution: PowerShell&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --set-default-version 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You might see this message after running that command: &lt;em&gt;&lt;code&gt;WSL 2 requires an update to its kernel component. For information please visit&lt;/code&gt;&lt;/em&gt;&lt;a href="https://aka.ms/wsl2kernel" rel="noopener noreferrer"&gt;&lt;em&gt;&lt;code&gt;https://aka.ms/wsl2kernel&lt;/code&gt;&lt;/em&gt;&lt;/a&gt;. Please follow the link (&lt;a href="https://aka.ms/wsl2kernel" rel="noopener noreferrer"&gt;https://aka.ms/wsl2kernel&lt;/a&gt;) and install the MSI from that page on our documentation to install a Linux kernel on your machine for WSL 2 to use. Once you have the kernel installed, please run the command again and it should complete successfully without showing the message.&lt;/p&gt;

&lt;p&gt;Note&lt;/p&gt;

&lt;p&gt;The update from WSL 1 to WSL 2 may take several minutes to complete depending on the size of your targeted distribution. If you are running an older (legacy) installation of WSL 1 from Windows 10 Anniversary Update or Creators Update, you may encounter an update error. Follow these instructions to &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/install-legacy#uninstallingremoving-the-legacy-distro" rel="noopener noreferrer"&gt;uninstall and remove any legacy distributions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If &lt;em&gt;&lt;code&gt;wsl --set-default-version&lt;/code&gt;&lt;/em&gt; results as an invalid command, enter &lt;em&gt;&lt;code&gt;wsl --help&lt;/code&gt;&lt;/em&gt;. If the &lt;em&gt;&lt;code&gt;--set-default-version&lt;/code&gt;&lt;/em&gt; is not listed, it means that your OS doesn’t support it and you need to update to version 2004, Build 19041 or higher.&lt;/p&gt;

&lt;h4&gt;
  
  
  Install your Linux distribution of choice
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://aka.ms/wslstore" rel="noopener noreferrer"&gt;Microsoft Store&lt;/a&gt; and select your favorite Linux distribution. &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwsl%2Fmedia%2Fstore.png" alt="View of Linux distributions in the Microsoft Store"&gt; The following links will open the Microsoft store page for each distribution:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9pjn388hp8c9" rel="noopener noreferrer"&gt;Ubuntu 16.04 LTS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9N9TNGVNDL3Q" rel="noopener noreferrer"&gt;Ubuntu 18.04 LTS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9n6svws3rx71" rel="noopener noreferrer"&gt;Ubuntu 20.04 LTS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9NJFZK00FGKV" rel="noopener noreferrer"&gt;openSUSE Leap 15.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9MZ3D1TRP8T1" rel="noopener noreferrer"&gt;SUSE Linux Enterprise Server 12 SP5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9PN498VPMF3Z" rel="noopener noreferrer"&gt;SUSE Linux Enterprise Server 15 SP1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9PKR34TNCV07" rel="noopener noreferrer"&gt;Kali Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9MSVKQC78PK6" rel="noopener noreferrer"&gt;Debian GNU/Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9n6gdm4k2hnc" rel="noopener noreferrer"&gt;Fedora Remix for WSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9NV1GV1PXZ6P" rel="noopener noreferrer"&gt;Pengwin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9N8LP0X93VCP" rel="noopener noreferrer"&gt;Pengwin Enterprise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/store/apps/9p804crf0395" rel="noopener noreferrer"&gt;Alpine WSL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a development environment i recommend &lt;a href="https://www.microsoft.com/store/apps/9n6svws3rx71" rel="noopener noreferrer"&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt;&lt;/a&gt; and for Hacking i recommend &lt;a href="https://www.microsoft.com/store/apps/9PKR34TNCV07" rel="noopener noreferrer"&gt;&lt;strong&gt;Kali Linux&lt;/strong&gt;&lt;/a&gt;. But feel free to choose any you like. Linux is linux and we will be working mostly on the terminal.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From the distribution’s page, select “Get”. &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwsl%2Fmedia%2Fubuntustore.png" alt="Linux distributions in the Microsoft store"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Set up a new distribution
&lt;/h4&gt;

&lt;p&gt;The first time you launch a newly installed Linux distribution, a console window will open and you’ll be asked to wait for a minute or two for files to de-compress and be stored on your PC. All future launches should take less than a second.&lt;/p&gt;

&lt;p&gt;You will then need to &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/user-support" rel="noopener noreferrer"&gt;create a user account and password for your new Linux distribution&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwsl%2Fmedia%2Fubuntuinstall.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%2Fdocs.microsoft.com%2Fen-us%2Fwindows%2Fwsl%2Fmedia%2Fubuntuinstall.png" alt="Ubuntu unpacking in the Windows console"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Set your distribution version to WSL 1 or WSL 2
&lt;/h4&gt;

&lt;p&gt;You can check the WSL version assigned to each of the Linux distributions you have installed by opening the PowerShell command line and entering the command (only available in &lt;a href="https://ajulusthoughts.wordpress.com/2020/07/09/how-to-create-a-dev-environment-in-windows-10-part-1/windowsupdate" rel="noopener noreferrer"&gt;Windows Build 19041 or higher&lt;/a&gt;): &lt;em&gt;&lt;code&gt;wsl -l -v&lt;/code&gt;&lt;/em&gt; PowerShell&lt;/p&gt;

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

&lt;/div&gt;

&lt;p&gt;To set a distribution to be backed by either version of WSL please run: PowerShell&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --set-version &amp;lt;distribution name&amp;gt; &amp;lt;versionNumber&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Make sure to replace &lt;em&gt;&lt;/em&gt; with the actual name of your distribution and &lt;em&gt;&lt;/em&gt; with the number ‘1’ or ‘2’. You can change back to WSL 1 at anytime by running the same command as above but replacing the ‘2’ with a ‘1’.&lt;/p&gt;

&lt;p&gt;Additionally, if you want to make WSL 2 your default architecture you can do so with this command: PowerShell&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --set-default-version 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This will set the version of any new distribution installed to WSL 2.&lt;/p&gt;

&lt;p&gt;Now we need a good terminal emulator application to manage the OS you’ve installed. I recommend &lt;a href="http://hyper.is/" rel="noopener noreferrer"&gt;Hyper&lt;/a&gt; and &lt;a href="https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=&amp;amp;cad=rja&amp;amp;uact=8&amp;amp;ved=2ahUKEwihjb2xzb_qAhXIxoUKHZk6CwcQFjAAegQIARAB&amp;amp;url=https%3A%2F%2Fwww.microsoft.com%2Fen-us%2Fp%2Fwindows-terminal%2F9n0dx20hk701&amp;amp;usg=AOvVaw0T3sd9IQM_S3Udg4fr3Xkz" rel="noopener noreferrer"&gt;Windows Terminal&lt;/a&gt;. I use Hyper.&lt;/p&gt;

&lt;p&gt;If you are a beginner go over here to learn about basic terminal commands: &lt;a href="https://ajulusthoughts.wordpress.com/2019/05/30/basic-linux-commands/" rel="noopener noreferrer"&gt;&lt;strong&gt;Terminal Commands&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That’s the end of part 1. Part 2: &lt;a href="https://ajulusthoughts.wordpress.com/2020/07/09/how-to-create-a-dev-environment-in-windows-10-part-2/" rel="noopener noreferrer"&gt;&lt;strong&gt;Coming Soon&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wsl2</category>
      <category>development</category>
      <category>devops</category>
      <category>windows10</category>
    </item>
    <item>
      <title>Resources for Building a Beautiful Progressive JAMstack Blog</title>
      <dc:creator>Stephen Ajulu</dc:creator>
      <pubDate>Mon, 06 Apr 2020 10:13:45 +0000</pubDate>
      <link>https://forem.com/stephenajulu/resources-for-building-a-beautiful-progressive-jamstack-blog-133d</link>
      <guid>https://forem.com/stephenajulu/resources-for-building-a-beautiful-progressive-jamstack-blog-133d</guid>
      <description>&lt;p&gt;Hey guys? We are back again this time i want to share with you the tools i used to build this project. I would like to thank the creators and team behind these tools. I use these tools regularly in personal and client projects. But they contributed a great deal to this project. Even though i used a theme. Part 3 is coming soon and you may see UI changes hence the reason i reserved that for last. If you haven’t see part 1 and 2 i suggest you do.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://ajulusthoughts.wordpress.com/2020/03/31/building-a-beautiful-progressive-jamstack-blog-part-1/"&gt;&lt;strong&gt;&lt;em&gt;Building a Beautiful Progressive JAMstack Blog Part&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;&lt;em&gt;1&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&amp;amp;&lt;br&gt;&lt;br&gt;
&lt;a href="https://ajulusthoughts.wordpress.com/2020/04/05/building-a-beautiful-progressive-jamstack-blog-part-2/"&gt;&lt;strong&gt;&lt;em&gt;Building a Beautiful Progressive JAMstack Blog Part 2&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Part 1 and Part 2&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  STATIC SITE GENERATOR: &lt;a href="https://gohugo.io"&gt;&lt;strong&gt;HUGO&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  THEME: &lt;a href="https://github.com/forestryio/hugo-theme-novela"&gt;&lt;strong&gt;HUGO VERSION OF NARATIVE’S NOVELA&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  HOST: &lt;a href="https://github.com"&gt;&lt;strong&gt;GITHUB&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  CONTINUOUS DEPLOYMENT: &lt;a href="https://netlify.com"&gt;&lt;strong&gt;NETLIFY&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  DOMAIN NAME: &lt;a href="https://namecheap.com"&gt;&lt;strong&gt;NAMECHEAP&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  HEADLESS GIT BASED CMS: &lt;a href="https://forestry.io"&gt;&lt;strong&gt;FORESTRY CMS&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  MANIFEST, ICONS AND BASIC SERVICE WORKER GENERATOR: &lt;a href="https://pwastarter.love2dev.com"&gt;&lt;strong&gt;PWASTARTER&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  PWA SCRIPTS(WEB SHARE, PUSH NOTIFICATIONS): &lt;a href="https://pwabuilder.com"&gt;&lt;strong&gt;PWABUILDER&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  PERFORMANCE TESTING: &lt;a href="https://developers.google.com/speed/pagespeed/insights/"&gt;*&lt;em&gt;PAGESPEED INSIGHTS *&lt;/em&gt;&lt;/a&gt;&amp;amp; &lt;a href="https://gtmetrix.com/"&gt;&lt;strong&gt;GTMETRIX&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  SCREENSHOT TOOL: &lt;a href="https://screenshots.firefox.com/"&gt;&lt;strong&gt;FIREFOX SCREENSHOT&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  COMMENTS: &lt;a href="https://utteranc.es"&gt;&lt;strong&gt;UTTERANCES&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  IMAGE CONVERSION TOOL: &lt;a href="https://file-converter.org/"&gt;&lt;strong&gt;FILE CONVERTER&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  IMAGE OPTIMIZATION &amp;amp; COMPRESSION: &lt;a href="https://nikkhokkho.sourceforge.io/static.php?page=FileOptimizer"&gt;&lt;strong&gt;FILE OPTIMIZER&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  NEWSLETTER TOOL: &lt;a href="https://formspree.com"&gt;&lt;strong&gt;FORMSPREE&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  SECURITY, CACHING AND MORE: &lt;a href="https://cloudflare.com"&gt;&lt;strong&gt;CLOUDFLARE&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  CODE EDITOR: &lt;a href="https://code.visualstudio.com/"&gt;&lt;strong&gt;VISUAL STUDIO CODE&lt;/strong&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Go check out these awesome blogs for more awesome content:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://techknow.co.ke"&gt;&lt;strong&gt;TechKnow Africa&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stream254.com"&gt;&lt;strong&gt;Stream254&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tmj.home.blog"&gt;&lt;strong&gt;TMJ&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stephenajulu.com"&gt;&lt;strong&gt;Ajulu’s Blog&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>blog</category>
      <category>jamstack</category>
      <category>pwa</category>
      <category>progressivewebapp</category>
    </item>
    <item>
      <title>Building a Beautiful Progressive JAMstack Blog Part 2: Day 4 to 7</title>
      <dc:creator>Stephen Ajulu</dc:creator>
      <pubDate>Sun, 05 Apr 2020 12:36:58 +0000</pubDate>
      <link>https://forem.com/stephenajulu/building-a-beautiful-progressive-jamstack-blog-part-2-day-4-to-7-3hbd</link>
      <guid>https://forem.com/stephenajulu/building-a-beautiful-progressive-jamstack-blog-part-2-day-4-to-7-3hbd</guid>
      <description>&lt;p&gt;Hey guys? Welcome to Part 2 of building the beautiful, fast, SEO optimized, progressive JAMstack blog.&lt;/p&gt;

&lt;p&gt;If you didn’t check out part 1, kindly go do so here: &lt;a href="https://ajulusthoughts.wordpress.com/2020/03/31/building-a-beautiful-progressive-jamstack-blog-part-1/"&gt;&lt;strong&gt;https://ajulusthoughts.wordpress.com/2020/03/31/building-a-beautiful-progressive-jamstack-blog-part-1/&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So we are continuing with Part 2.&lt;/p&gt;

&lt;p&gt;Shall we begin?&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 4
&lt;/h2&gt;

&lt;p&gt;Nothing much to do so i did a bit of research&lt;/p&gt;

&lt;h2&gt;
  
  
  DAY 5
&lt;/h2&gt;

&lt;p&gt;Here’s where the knowledge of Day 4 come to play.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linked the Manifest.json and all the app icons/favicons to the head section as you can remember i couldn’t do this because i was using the original theme’s layout folder so the only way was to copy their layout file to mine and that wasn’t an ideal situation. So i found a solution, Netlify’s Snippet Injection tool.(oh thank you &lt;a href="https://netlify.com"&gt;&lt;strong&gt;netlify&lt;/strong&gt;&lt;/a&gt;) I had heard of this tool but it was back then when i was using &lt;a href="https://jekyllrc.org"&gt;&lt;strong&gt;Jekyll&lt;/strong&gt;&lt;/a&gt;(another very good static site generator with thousands of themes), back then i only had 1 site deployed in netlify and i didn’t need to tool. So to continue i managed to link them successfully and the website began acting like and app.&lt;/li&gt;
&lt;li&gt;Linked the Service Worker Register to the bottom of the body using the same Netlify Snippet Tool&lt;/li&gt;
&lt;li&gt;Added the SEO meta tags together with the manifest.json and app icons&lt;/li&gt;
&lt;li&gt;Added more Hugo Shortcodes and paired them with forestry snippets(since am using forestry as my CMS there’s no need to add the shortcodes manually just create a ___.snippet file in /.forestry/snippets/……. as for shortcodes they go under /layouts/shortcodes/…….. I’ll show you how to do this in just a bit.&lt;/li&gt;
&lt;li&gt;Researched&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End of Day 5&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DAY 6
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Added more hugo shortcodes and their respective forestry snippets&lt;/li&gt;
&lt;li&gt;Added a &lt;a href="https://blog.stephenajulu.com/feed.json"&gt;&lt;strong&gt;json feed&lt;/strong&gt;&lt;/a&gt; because ……….. why not?&lt;/li&gt;
&lt;li&gt;Added a &lt;a href="https://blog.stephenajulu.com/404/"&gt;&lt;strong&gt;custom 404&lt;/strong&gt;&lt;/a&gt; page replacing Netlify’s version&lt;/li&gt;
&lt;li&gt;Added a Comment system that uses Github Issues as the base, the comments system is called &lt;a href="https://utteranc.es"&gt;&lt;strong&gt;Utterances&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Researched&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End of Day 6&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DAY 7
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Did a few tweaks and hacks&lt;/li&gt;
&lt;li&gt;Added Google Analytics&lt;/li&gt;
&lt;li&gt;Turned all images to .webp format because of it’s compression and small file size therefore bringing the total homepage size to 432kb from 3.4mb&lt;/li&gt;
&lt;li&gt;Resized my author image from 1124×1024 to 160×60 or something there about(cant remember the correct sizes but they near those i have mentioned)&lt;/li&gt;
&lt;li&gt;Minified and Unified a few Javascript files&lt;/li&gt;
&lt;li&gt;Removed Google Analytics 🤣 It was slowing down my site because of the requests it made and also privacy issues&lt;/li&gt;
&lt;li&gt;Managed to make the PageSpeed Desktop Score 100 while Mobile is at 98 99(fluctuates)&lt;/li&gt;
&lt;li&gt;Increase page size from 432kb to 532kb(🤣 by adding an important images that was 50 49kb each that were required for SEO)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now to the good relationship i have discovered between hugo shortcodes and forestry snippets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m4WSQa7e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/04/screenshot_2020-04-05-stephenajulu-ajulusthoughts1-hugo-shortcodes.png%3Fw%3D1012" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m4WSQa7e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/04/screenshot_2020-04-05-stephenajulu-ajulusthoughts1-hugo-shortcodes.png%3Fw%3D1012" alt="github hugo shortcodes" title="Hugo Shortcodes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6v56gFBu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/04/screenshot_2020-04-05-stephenajulu-ajulusthoughts1-forestry-snippets.png%3Fw%3D1012" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6v56gFBu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/04/screenshot_2020-04-05-stephenajulu-ajulusthoughts1-forestry-snippets.png%3Fw%3D1012" alt="github forestry snippets" title="Forestry Snippet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see for every shortcode there’s a snippet, that’s because shortcodes usually have a small piece of code to embed in the page you want it to be activated.&lt;/p&gt;

&lt;p&gt;So the first piece of code goes to the /layouts/shortcodes/shortcodename.html while the last one goes to .forestry/snippets/snippetname.snippet. This ensures that i don’t have to copy the last code everywhere manually, i just access them within forestry cms’s ui like this&lt;/p&gt;

&lt;p&gt;So now instead of copying the shortcode link everywhere you can just add it as a forestry cms snippet and use it where you would like. Note: This only works if you use Forestry CMS&lt;/p&gt;

&lt;h2&gt;
  
  
  UNFINISHED WORK
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Resize all images to a good size&lt;/li&gt;
&lt;li&gt;SEO Optimize the site&lt;/li&gt;
&lt;li&gt;Find a good free resource light analytic service&lt;/li&gt;
&lt;li&gt;Copy all posts from &lt;a href="https://ajulusthoughts.wordpress.com"&gt;&lt;strong&gt;Ajulu’s Thoughts&lt;/strong&gt;&lt;/a&gt; to &lt;a href="https://blog.stephenajulu.com"&gt;&lt;strong&gt;Ajulu’s Blog&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cache all assets&lt;/li&gt;
&lt;li&gt;Add Web Share&lt;/li&gt;
&lt;li&gt;Add Push Notifications&lt;/li&gt;
&lt;li&gt;Link back to &lt;a href="https://stephenajulu.com"&gt;&lt;strong&gt;https://stephenajulu.com&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Add Service Worker Version 3 that caches everything&lt;/li&gt;
&lt;li&gt;Debug&lt;/li&gt;
&lt;li&gt;Optimize&lt;/li&gt;
&lt;li&gt;Make changes to ui&lt;/li&gt;
&lt;li&gt;Release it back to the wild as Novela v3&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;PageSpeed Insights&lt;/em&gt; for blog.stephenajulu.com
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Mobile Score&lt;/em&gt; : 98 99&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
TTT, First Meaningful Paint, First Contentful Paint, First CPU idle: 1.3 seconds&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Desktop Score&lt;/em&gt; : 100&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
TTT, First Meaningful Paint, First Contentful Paint, First CPU idle: 0.5 seconds&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Our Goal is 100 in Both&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://ajulusthoughts.wordpress.com"&gt;&lt;strong&gt;Ajulu’s Thoughts&lt;/strong&gt;&lt;/a&gt; – Delivering Quality Tech, Cybersecurity &amp;amp; Dev Content Since November 2016
&lt;/h3&gt;

&lt;p&gt;Hey Devs? Found anything wrong with this info? Kindly write your comment down below on what to change.&lt;/p&gt;

&lt;p&gt;I will appreciate it, if you take 10 seconds of your time to check out my donations page and donate to the blog and other causes. 40% of the donation goes to buying this blog an official domain name, the rest goes to charity eg supporting children homes. Any amount received will be shown, from whom and to where it went. I will also include screenshots of inflow and outflow. So go check it out: &lt;a href="https://ajulusthoughts.wordpress.com/donate/"&gt;&lt;strong&gt;Donations&lt;/strong&gt;&lt;/a&gt; and donate! You can also buy me something via the wishing list. Thank you and have a wonderful day.&lt;/p&gt;

&lt;p&gt;Before i go, i would like to praise and thank all my favorite tools, products and companies&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com"&gt;&lt;strong&gt;Github&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://netlify.com"&gt;&lt;strong&gt;Netlify&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=""&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forestry.io"&gt;&lt;strong&gt;Forestry CMS&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://formspree.io"&gt;&lt;strong&gt;Formspree&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pwastarter.love2dev.com"&gt;&lt;strong&gt;PWAStarter&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pwabuilder.com"&gt;&lt;strong&gt;PWABuilder&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://namecheap.com"&gt;&lt;strong&gt;Namecheap&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gohugo.io"&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jekyllrc.org"&gt;&lt;strong&gt;Jekyll&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il'l do a review of each but for now i can recommend anyone to these. They are the best.&lt;/p&gt;

</description>
      <category>jamstack</category>
      <category>progressivewebapp</category>
      <category>blog</category>
      <category>progressivewebapplication</category>
    </item>
    <item>
      <title>Building a Beautiful Progressive JAMstack Blog Part 1: Day 1 to 3</title>
      <dc:creator>Stephen Ajulu</dc:creator>
      <pubDate>Tue, 31 Mar 2020 16:09:02 +0000</pubDate>
      <link>https://forem.com/stephenajulu/building-a-beautiful-progressive-jamstack-blog-part-1-day-1-to-3-49c6</link>
      <guid>https://forem.com/stephenajulu/building-a-beautiful-progressive-jamstack-blog-part-1-day-1-to-3-49c6</guid>
      <description>&lt;p&gt;Hey guys? Today we will be building a beautiful, fast, SEO optimized, progressive JAMstack blog for free. Step by step.&lt;/p&gt;

&lt;p&gt;Shall we begin?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 1&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Choose The Best Static Site Generator. Weigh Pros and Cons. Research.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Choice 1: Jekyll&lt;/em&gt;&lt;/strong&gt; – Built on Ruby on Rails, Very Good Community, Extensive Knowledge, Used and Endorsed by &lt;a href="https://github.com"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;, Very Slow Build. Not good with large blogs(over 30 posts) due to slow build time. Hence not suitable.
❌&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Choice 2: Gatsby&lt;/em&gt;&lt;/strong&gt; – Built on React, GraphQl and Webpack, Excellent Community, Lack of Sufficient Knowledge, Used and Endorsed by &lt;a href="https://contentful.com"&gt;&lt;strong&gt;Contentful&lt;/strong&gt;&lt;/a&gt;, Lighting Fast Build, Good With Everything, But Not Suitable Due To Time Constraint. However Further Research to Be Done For Future Purposes.
✖️&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Choice 3: Hugo&lt;/em&gt;&lt;/strong&gt; – Built on Go, Excellent Community, Sufficient Knowledge, Used and Endorsed by &lt;a href="https://forestry.io"&gt;&lt;strong&gt;Forestry.io&lt;/strong&gt;&lt;/a&gt;, Fast Build, Very Good for Big Blogs, In fact its Built for Large Websites and Blogs.
✔️&lt;/li&gt;
&lt;li&gt;Choice? &lt;strong&gt;Hugo&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End of Day 1&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 2&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Find a good Hugo theme&lt;/li&gt;
&lt;li&gt;Build the blog&lt;/li&gt;
&lt;li&gt;Host on GitHub&lt;/li&gt;
&lt;li&gt;Create 2 branches(Master and Test Features)&lt;/li&gt;
&lt;li&gt;Add to netlify for continuous deployment&lt;/li&gt;
&lt;li&gt;Assign master branch domain name: blog.stephenajulu.com&lt;/li&gt;
&lt;li&gt;Research&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End of Day 2&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day 3&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a manifest.json&lt;/li&gt;
&lt;li&gt;Generate favicons and app icons for Android, IOS, and Windows&lt;/li&gt;
&lt;li&gt;Create a splashscreen&lt;/li&gt;
&lt;li&gt;Build the “Add To Homescreen” script(a2hs.js, .min.js &amp;amp; .css)&lt;/li&gt;
&lt;li&gt;Build the Service Worker(sw.js) with precache on&lt;/li&gt;
&lt;li&gt;Upload to GitHub (110 icons, manifest.json, sw.js)&lt;/li&gt;
&lt;li&gt;Research&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End of Day 3&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you are up to date.&lt;br&gt;&lt;br&gt;
The reason i documented my process here is so that anyone can learn.&lt;br&gt;&lt;br&gt;
I am a crappy dev, i don’t know as much js as i wish i knew.&lt;br&gt;&lt;br&gt;
But i believe we all have something to learn from each other.&lt;br&gt;&lt;br&gt;
Ask me questions in the comment section and I’ll answer them to the best of my knowledge.&lt;br&gt;&lt;br&gt;
I am building a Progressive JAMstack Blog.&lt;br&gt;&lt;br&gt;
You can view the up to date version here: &lt;a href="https://blog.stephenajulu.com"&gt;&lt;strong&gt;https://blog.stephenajulu.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Unfinished Work&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Linking the manifest.json to the head&lt;/li&gt;
&lt;li&gt;Adding a few meta tags for SEO&lt;/li&gt;
&lt;li&gt;Add the Service Worker register to the bottom of the body tag&lt;/li&gt;
&lt;li&gt;Add the Add to Homescreen below the service worker register&lt;/li&gt;
&lt;li&gt;Add the Web Share API&lt;/li&gt;
&lt;li&gt;Add the Push Notifications API&lt;/li&gt;
&lt;li&gt;Link the blog back to &lt;a href="https://stephenajulu.com"&gt;&lt;strong&gt;stephenajulu.com&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Debug and make sure everything works well including the service worker.&lt;/li&gt;
&lt;li&gt;Copy all blog posts from &lt;a href="https://ajulusthoughts.wordpress.com"&gt;&lt;strong&gt;https://ajulusthoughts.wordpress.com&lt;/strong&gt;&lt;/a&gt; to &lt;a href="https://blog.stephenajulu.com"&gt;&lt;strong&gt;https://blog.stephenajulu.com&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Optimize Image Assets&lt;/li&gt;
&lt;li&gt;Add gzip&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once all the steps are done, the blog should be able to be installed (like a native app), viewed offline (no internet thanks to the Service Worker), and when there’s internet i should be able to inform those who’ve installed it (thanks to the Push Notifications API) that there’s a new blog post, and inform them on the coming give away that is strictly reserved for them, among other things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; I keep reiterating my personal site every year, working on a new design, using hugo as well but still haven’t assigned the domain name, so you can get the sneak peak of the new design here: &lt;a href="https://stephenajulu.nelify.com"&gt;&lt;strong&gt;https://stephenajulu.nelify.com&lt;/strong&gt;&lt;/a&gt; it’s version 5. The previous versions are in the footer of &lt;a href="https://stephenajulu.com"&gt;&lt;strong&gt;https://stephenajulu.com&lt;/strong&gt;&lt;/a&gt;. Now why do i do this? To learn new technologies while doing something meaningful and also to make sure my site is up-to date. &lt;strong&gt;Also note&lt;/strong&gt; &lt;a href="https://ajulusthoughts.wordpress.com"&gt;&lt;strong&gt;ajulusthoughts.wordpress.com&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;is my sweetheart nothing would ever replace it unless it looks exactly like it and promises better performance&lt;/strong&gt;. It took me 5 years to build this blog, i am not throwing it away. It will still be updated and will remain great, might even get it’s domain name(ajulusthoughts.com) but &lt;a href="https://blog.stephenajulu.com"&gt;&lt;strong&gt;blog.stephenajulu.com&lt;/strong&gt;&lt;/a&gt; will be more like a personal blog while this remains a brand blog.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Important things to know&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;progressive web application&lt;/strong&gt; is just a website that behaves like a native app(like the ones installed from google play store). Thanks to a service worker, the website can be accessed online because the sw caches the site. It can be installed upon visiting the website, you’ll either see a pop-up(thanks to the Add to Homescreen script) or see a home icon with a plus on it(if Firefox). Progressive Web Apps are faster than any website you’ve seen because of the cache feature. This new blog uses a headless cms: &lt;a href="https://forestry.io"&gt;&lt;strong&gt;Forestry.io&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Those things left should take 2 days. I run into a bit of a hiccup, an issue with the blog that needs to be fixed. Already submitted an issue via github, so it should be resolved by tomorrow. It’s the reason i didn’t complete the process today. I can’t add the scripts to the head and body section because i forgot to include the “layouts/partials/head.html” and “layouts/index.md”&lt;br&gt;&lt;br&gt;
I also forgot, I’ll be adding a newsletter section to every page but that’s until the above issues are fixed.&lt;/p&gt;

&lt;p&gt;To experience PWAs, visit this link: &lt;a href="https://tomango.co.uk"&gt;&lt;strong&gt;https://tomango.co.uk&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Static Site Generators, Headless CMS, JAMstack, Progressive Web Applications and Serverless are the Future!Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost effective&lt;/li&gt;
&lt;li&gt;Lighting fast&lt;/li&gt;
&lt;li&gt;Can be used on any device(cross platform)&lt;/li&gt;
&lt;li&gt;No servers&lt;/li&gt;
&lt;li&gt;Feature Rich&lt;/li&gt;
&lt;li&gt;Can increase engagement way more than native apps and traditional websites&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For security and even faster speeds, I have passed it through Cloudflare and enabled all of Netlify’s asset optimization. The site isn’t as fast as it should be due to the fact that i haven’t added the service worker register.&lt;/p&gt;

&lt;p&gt;Also note PWAs don’t have a good desktop support yet, only Desktop Chromiums(Chrome, Brave, Opera etc) support PWAs(according to my tests, Firefox is yet to release an update with support but PWAs are fully supported by Android, Smart TVs, Smart Watches, KAIOS, Linux, Chrome OS and such. PWAs can also be uploaded to all the stores (Google Play, Microsoft, KAIOS Stores and among others)&lt;/p&gt;

&lt;h3&gt;
  
  
  PageSpeed Insights FOR blog.stephenajulu.com
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Mobile Score&lt;/em&gt; : 96&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
TTT, First Meaningful Paint, First Contentful Paint, First CPU idle: 2 seconds&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Desktop Score&lt;/em&gt; : 97&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
TTT, First Meaningful Paint, First Contentful Paint, First CPU idle: 0.7 seconds&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;Our Goal is 98 or 99&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sadly Day 4 will start tomorrow as i am working on fixing the hiccup we encountered myself, no response on the issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Click/Doubleclick/Rightclick These Images To Get A Full Screen View
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Desktop/Laptop Screenshot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LiillkzK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/03/screenshot_2020-03-31-stephen-ajulus-blog-full.jpg%3Fw%3D160" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LiillkzK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/03/screenshot_2020-03-31-stephen-ajulus-blog-full.jpg%3Fw%3D160" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  TABLET SCREENSHOT
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RgHae9Mj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/03/screenshot_2020-03-31-stephen-ajulus-blog-tablet.png%3Fw%3D105" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RgHae9Mj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/03/screenshot_2020-03-31-stephen-ajulus-blog-tablet.png%3Fw%3D105" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Phone Screenshot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YErmaeWm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/03/screenshot_2020-03-31-stephen-ajulus-blog-phone.png%3Fw%3D27" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YErmaeWm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/03/screenshot_2020-03-31-stephen-ajulus-blog-phone.png%3Fw%3D27" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://ajulusthoughts.wordpress.com"&gt;&lt;strong&gt;Ajulu’s Thoughts&lt;/strong&gt;&lt;/a&gt; – Delivering Quality Tech, Cybersecurity &amp;amp; Dev Content Since November 2016
&lt;/h3&gt;

&lt;p&gt;Hey Devs? Found anything wrong with this info? Kindly write your comment down below on what to change.&lt;/p&gt;

&lt;p&gt;I will appreciate it, if you take 10 seconds of your time to check out my donations page and donate to the blog and other causes. 40% of the donation goes to buying this blog an official domain name, the rest goes to charity eg supporting children homes. Any amount received will be shown, from whom and to where it went. I will also include screenshots of inflow and outflow. So go check it out: &lt;a href="https://ajulusthoughts.wordpress.com/donate/"&gt;&lt;strong&gt;Donations&lt;/strong&gt;&lt;/a&gt; and donate! You can also buy me something via the wishing list. Thank you and have a wonderful day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://owlsectechnologies.co.ke"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GOxhkJMP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://ajulusthoughts.files.wordpress.com/2020/02/my-post38.png%3Fw%3D1024" alt=""&gt;&lt;/a&gt;OwlSec Technologies design and develop fast, secure and search engine optimized progressive websites that use JAMstack or CMS based technologies e.g WordPress, Drupal and more. Making sure a business or individual has not just an online presence but also a lead generation strategy.&lt;br&gt;&lt;br&gt;
Get a quote: &lt;a href="//mailto:info@owlsectechnologies.co.ke"&gt;&lt;strong&gt;info@owlsectechnologies.co.ke&lt;/strong&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Visit our website: &lt;a href="https://owlsectechnologies.co.ke"&gt;&lt;strong&gt;owlsectechnologies.co.ke&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;SOURCE:&lt;/strong&gt; &lt;a href="https://ajulusthoughts.wordpress.com/2020/03/31/building-a-beautiful-progressive-jamstack-blog-part-1/"&gt;&lt;strong&gt;AJULU'S THOUGHTS&lt;/strong&gt;&lt;/a&gt;
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>Markdown Cheatsheet</title>
      <dc:creator>Stephen Ajulu</dc:creator>
      <pubDate>Thu, 21 Nov 2019 17:39:49 +0000</pubDate>
      <link>https://forem.com/stephenajulu/markdown-cheatsheet-io2</link>
      <guid>https://forem.com/stephenajulu/markdown-cheatsheet-io2</guid>
      <description>&lt;p&gt;Headers&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;br&gt;
7&lt;br&gt;
8&lt;br&gt;
9&lt;br&gt;
10&lt;br&gt;
11&lt;br&gt;
12&lt;br&gt;
13&lt;br&gt;
14&lt;/p&gt;

&lt;h1&gt;
  
  
  H1
&lt;/h1&gt;

&lt;h2&gt;
  
  
  H2
&lt;/h2&gt;

&lt;h3&gt;
  
  
  H3
&lt;/h3&gt;

&lt;h4&gt;
  
  
  H4
&lt;/h4&gt;

&lt;h5&gt;
  
  
  H5
&lt;/h5&gt;

&lt;h6&gt;
  
  
  H6
&lt;/h6&gt;

&lt;p&gt;Alternatively, for H1 and H2, an underline-ish style:&lt;/p&gt;

&lt;h1&gt;
  
  
  Alt-H1
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Alt-H2
&lt;/h2&gt;

&lt;p&gt;H1&lt;br&gt;
H2&lt;br&gt;
H3&lt;br&gt;
H4&lt;br&gt;
H5&lt;br&gt;
H6&lt;/p&gt;

&lt;p&gt;Alternatively, for H1 and H2, an underline-ish style:&lt;br&gt;
Alt-H1&lt;br&gt;
Alt-H2&lt;br&gt;
Emphasis&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;br&gt;
7&lt;/p&gt;

&lt;p&gt;Emphasis, aka italics, with &lt;em&gt;asterisks&lt;/em&gt; or &lt;em&gt;underscores&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Strong emphasis, aka bold, with &lt;strong&gt;asterisks&lt;/strong&gt; or &lt;strong&gt;underscores&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Combined emphasis with &lt;strong&gt;asterisks and &lt;em&gt;underscores&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Strikethrough uses two tildes. &lt;del&gt;Scratch this.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Emphasis, aka italics, with asterisks or underscores.&lt;/p&gt;

&lt;p&gt;Strong emphasis, aka bold, with asterisks or underscores.&lt;/p&gt;

&lt;p&gt;Combined emphasis with asterisks and underscores.&lt;/p&gt;

&lt;p&gt;Strikethrough uses two tildes. Scratch this.&lt;br&gt;
Lists&lt;/p&gt;

&lt;p&gt;(In this example, leading and trailing spaces are shown with with dots: ⋅)&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;br&gt;
7&lt;br&gt;
8&lt;br&gt;
9&lt;br&gt;
10&lt;br&gt;
11&lt;br&gt;
12&lt;br&gt;
13&lt;br&gt;
14&lt;br&gt;
15&lt;br&gt;
16&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First ordered list item&lt;/li&gt;
&lt;li&gt;Another item
⋅⋅* Unordered sub-list.&lt;/li&gt;
&lt;li&gt;Actual numbers don't matter, just that it's a number
⋅⋅1. Ordered sub-list&lt;/li&gt;
&lt;li&gt;And another item.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;⋅⋅⋅You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we'll use three here to also align the raw Markdown).&lt;/p&gt;

&lt;p&gt;⋅⋅⋅To have a line break without a paragraph, you will need to use two trailing spaces.⋅⋅&lt;br&gt;
⋅⋅⋅Note that this line is separate, but within the same paragraph.⋅⋅&lt;br&gt;
⋅⋅⋅(This is contrary to the typical GFM line break behaviour, where trailing spaces are not required.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unordered list can use asterisks&lt;/li&gt;
&lt;li&gt;Or minuses&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Or pluses&lt;/p&gt;

&lt;p&gt;First ordered list item&lt;br&gt;
Another item&lt;br&gt;
    Unordered sub-list.&lt;br&gt;
Actual numbers don’t matter, just that it’s a number&lt;br&gt;
Ordered sub-list&lt;br&gt;
And another item.You can have properly indented paragraphs within list items. Notice the blank line above, and the leading spaces (at least one, but we’ll use three here to also align the raw Markdown). To have a line break without a paragraph, you will need to use two trailing spaces. Note that this line is separate, but within the same paragraph. (This is contrary to the typical GFM line break behavior, where trailing spaces are not required.)&lt;/p&gt;

&lt;p&gt;Unordered list can use asterisks&lt;br&gt;
Or minuses&lt;br&gt;
Or pluses&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Links&lt;/p&gt;

&lt;p&gt;There are two ways to create links.&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;br&gt;
7&lt;br&gt;
8&lt;br&gt;
9&lt;br&gt;
10&lt;br&gt;
11&lt;br&gt;
12&lt;br&gt;
13&lt;br&gt;
14&lt;br&gt;
15&lt;br&gt;
16&lt;br&gt;
17&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.google.com" rel="noopener noreferrer"&gt;I'm an inline-style link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.google.com" rel="noopener noreferrer"&gt;I'm an inline-style link with title&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[I'm a reference-style link][Arbitrary case-insensitive reference text]&lt;/p&gt;

&lt;p&gt;&lt;a href="//../blob/master/LICENSE"&gt;I'm a relative reference to a repository file&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[You can use numbers for reference-style link definitions][1]&lt;/p&gt;

&lt;p&gt;Or leave it empty and use the [link text itself].&lt;/p&gt;

&lt;p&gt;URLs and URLs in angle brackets will automatically get turned into links.&lt;br&gt;
&lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;http://www.example.com&lt;/a&gt; or &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;http://www.example.com&lt;/a&gt; and sometimes&lt;br&gt;
example.com (but not on Github, for example).&lt;/p&gt;

&lt;p&gt;Some text to show that the reference links can follow later.&lt;/p&gt;

&lt;p&gt;[arbitrary case-insensitive reference text]&lt;/p&gt;

&lt;p&gt;: &lt;a href="https://www.mozilla.org" rel="noopener noreferrer"&gt;https://www.mozilla.org&lt;/a&gt; [1]: &lt;a href="http://slashdot.org" rel="noopener noreferrer"&gt;http://slashdot.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[link text itself]&lt;/p&gt;

&lt;p&gt;: &lt;a href="http://www.reddit.com" rel="noopener noreferrer"&gt;http://www.reddit.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m an inline-style link&lt;/p&gt;

&lt;p&gt;I’m an inline-style link with title&lt;/p&gt;

&lt;p&gt;I’m a reference-style link&lt;/p&gt;

&lt;p&gt;I’m a relative reference to a repository file&lt;/p&gt;

&lt;p&gt;You can use numbers for reference-style link definitions&lt;/p&gt;

&lt;p&gt;Or leave it empty and use the link text itself.&lt;/p&gt;

&lt;p&gt;URLs and URLs in angle brackets will automatically get turned into links. &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;http://www.example.com&lt;/a&gt; or &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;http://www.example.com&lt;/a&gt; and sometimes example.com (but not on GitHub, for example).&lt;/p&gt;

&lt;p&gt;Some text to show that the reference links can follow later.&lt;br&gt;
Images&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;br&gt;
7&lt;/p&gt;

&lt;p&gt;Here's our logo (hover to see the title text):&lt;/p&gt;

&lt;p&gt;Inline-style:&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%2Fgithub.com%2Fadam-p%2Fmarkdown-here%2Fraw%2Fmaster%2Fsrc%2Fcommon%2Fimages%2Ficon48.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%2Fgithub.com%2Fadam-p%2Fmarkdown-here%2Fraw%2Fmaster%2Fsrc%2Fcommon%2Fimages%2Ficon48.png" title="Logo Title Text 1" alt="alt text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reference-style:&lt;br&gt;
![alt text][logo]&lt;/p&gt;

&lt;p&gt;[logo]&lt;/p&gt;

&lt;p&gt;: &lt;a href="https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png" rel="noopener noreferrer"&gt;https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png&lt;/a&gt; “Logo Title Text 2”&lt;/p&gt;

&lt;p&gt;Here’s our logo (hover to see the title text):&lt;br&gt;
alt text&lt;/p&gt;

&lt;p&gt;Inline-style:&lt;br&gt;
alt text&lt;/p&gt;

&lt;p&gt;Reference-style:&lt;br&gt;
Code and Syntax Highlighting&lt;/p&gt;

&lt;p&gt;Code blocks are part of the Markdown spec, but syntax highlighting isn’t. However, many renders – like GitHub and Markdown Here – support syntax highlighting. Which languages are supported and how those language names should be written will vary from renderer to renderer. Markdown Here supports highlighting for dozens of languages (and not-really-languages, like diffs and HTTP headers); to see the complete list, and how to write the language names, see the highlight.js demo page.&lt;br&gt;
1&lt;/p&gt;

&lt;p&gt;Inline &lt;code&gt;code&lt;/code&gt; has &lt;code&gt;back-ticks around&lt;/code&gt; it.&lt;/p&gt;

&lt;p&gt;Inline code has back-ticks around it.&lt;/p&gt;

&lt;p&gt;Blocks of code are either fenced by lines with three back-ticks&lt;br&gt;
&lt;br&gt;
 ```, or are indented with four spaces. I recommend only using the fenced code blocks – they’re easier and only they support syntax highlighting.&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;br&gt;
7&lt;br&gt;
8&lt;br&gt;
9&lt;br&gt;
10&lt;br&gt;
11&lt;br&gt;
12&lt;br&gt;
13&lt;br&gt;
14&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
javascript
var s = "JavaScript syntax highlighting";
alert(s);


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

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
s = "Python syntax highlighting"
print s


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

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

No language indicated, so no syntax highlighting.
But let's throw in a &amp;lt;b&amp;gt;tag&amp;lt;/b&amp;gt;.


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

&lt;/div&gt;



&lt;p&gt;1&lt;br&gt;
2&lt;/p&gt;

&lt;p&gt;var s = "JavaScript syntax highlighting";&lt;br&gt;
alert(s);&lt;br&gt;
1&lt;br&gt;
2&lt;/p&gt;

&lt;p&gt;s = "Python syntax highlighting"&lt;br&gt;
print s&lt;br&gt;
1&lt;br&gt;
2&lt;/p&gt;

&lt;p&gt;No language indicated, so no syntax highlighting in Markdown Here (varies on Github).&lt;br&gt;
But let's throw in a &lt;b&gt;tag&lt;/b&gt;.&lt;br&gt;
Tables&lt;/p&gt;

&lt;p&gt;Tables aren’t part of the core Markdown spec, but they are part of GFM and Markdown Here supports them. They are an easy way of adding tables to your email – a task that would otherwise require copy-pasting from another application.&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;br&gt;
7&lt;br&gt;
8&lt;br&gt;
9&lt;br&gt;
10&lt;br&gt;
11&lt;br&gt;
12&lt;br&gt;
13&lt;br&gt;
14&lt;br&gt;
15&lt;br&gt;
16&lt;/p&gt;

&lt;p&gt;Colons can be used to align columns.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tables&lt;/th&gt;
&lt;th&gt;Are&lt;/th&gt;
&lt;th&gt;Cool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;col 3 is&lt;/td&gt;
&lt;td&gt;right-aligned&lt;/td&gt;
&lt;td&gt;$1600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;col 2 is&lt;/td&gt;
&lt;td&gt;centered&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zebra stripes&lt;/td&gt;
&lt;td&gt;are neat&lt;/td&gt;
&lt;td&gt;$1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There must be at least 3 dashes separating each header cell.&lt;br&gt;
The outer pipes (|) are optional, and you don't need to make the&lt;br&gt;
raw Markdown line up prettily. You can also use inline Markdown.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Markdown&lt;/th&gt;
&lt;th&gt;Less&lt;/th&gt;
&lt;th&gt;Pretty&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Still&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;renders&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;nicely&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Colons can be used to align columns.&lt;br&gt;
Tables  Are Cool&lt;br&gt;
col 3 is    right-aligned   $1600&lt;br&gt;
col 2 is    centered    $12&lt;br&gt;
zebra stripes   are neat    $1&lt;br&gt;
There must be at least 3 dashes separating each header cell. The outer pipes (  ) are optional, and you don’t need to make the raw Markdown line up prettily. You can also use inline Markdown.&lt;br&gt;
Markdown    Less    Pretty&lt;br&gt;
Still   renders nicely&lt;br&gt;
1   2   3&lt;br&gt;
Blockquotes&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Blockquotes are very handy in email to emulate reply text.&lt;br&gt;
This line is part of the same quote.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quote break.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can &lt;em&gt;put&lt;/em&gt; &lt;strong&gt;Markdown&lt;/strong&gt; into a blockquote.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Blockquotes are very handy in email to emulate reply text. This line is part of the same quote.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Quote break.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This is a very long line that will still be quoted properly when it wraps. Oh boy let’s keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can put Markdown into a blockquote.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Inline HTML&lt;/p&gt;

&lt;p&gt;You can also use raw HTML in your Markdown, and it’ll mostly work pretty well.&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;br&gt;
7&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;Definition list&lt;/dt&gt;
  &lt;dd&gt;Is something people use sometimes.&lt;/dd&gt;
 
  &lt;dt&gt;Markdown in HTML&lt;/dt&gt;
  &lt;dd&gt;Does *not* work **very** well. Use HTML &lt;em&gt;tags&lt;/em&gt;.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Definition list something people use sometimes. Markdown in HTML. Does &lt;em&gt;not&lt;/em&gt; work &lt;strong&gt;very&lt;/strong&gt; well. Use HTML tags.&lt;br&gt;
Horizontal Rule&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;br&gt;
7&lt;br&gt;
8&lt;br&gt;
9&lt;br&gt;
10&lt;br&gt;
11&lt;br&gt;
12&lt;br&gt;
13&lt;/p&gt;

&lt;p&gt;Three or more...&lt;/p&gt;




&lt;p&gt;Hyphens&lt;/p&gt;




&lt;p&gt;Asterisks&lt;/p&gt;




&lt;p&gt;Underscores&lt;/p&gt;

&lt;p&gt;Three or more…&lt;/p&gt;

&lt;p&gt;Hyphens&lt;/p&gt;

&lt;p&gt;Asterisks&lt;/p&gt;

&lt;p&gt;Underscores&lt;br&gt;
Line Breaks&lt;/p&gt;

&lt;p&gt;My basic recommendation for learning how line breaks work is to experiment and discover – hit  once (i.e., insert one newline), then hit it twice (i.e., insert two newlines), see what happens. You’ll soon learn to get what you want. “Markdown Toggle” is your friend.&lt;/p&gt;

&lt;p&gt;Here are some things to try out:&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
4&lt;br&gt;
5&lt;br&gt;
6&lt;/p&gt;

&lt;p&gt;Here's a line for us to start with.&lt;/p&gt;

&lt;p&gt;This line is separated from the one above by two newlines, so it will be a &lt;em&gt;separate paragraph&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This line is also a separate paragraph, but...&lt;br&gt;
This line is only separated by a single newline, so it's a separate line in the &lt;em&gt;same paragraph&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Here’s a line for us to start with.&lt;/p&gt;

&lt;p&gt;This line is separated from the one above by two newlines, so it will be a separate paragraph.&lt;/p&gt;

&lt;p&gt;This line is also begins a separate paragraph, but… This line is only separated by a single newline, so it’s a separate line in the same paragraph.&lt;/p&gt;

&lt;p&gt;(Technical note: Markdown Here uses GFM line breaks, so there’s no need to use MD’s two-space line breaks.)&lt;br&gt;
Youtube videos&lt;/p&gt;

&lt;p&gt;They can’t be added directly but you can add an image with a link to the video like this:&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.youtube.com/watch?feature=player_embedded&amp;amp;v=YOUTUBE_VIDEO_ID_HERE&amp;lt;br&amp;gt;%0A" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.youtube.com%2Fvi%2FYOUTUBE_VIDEO_ID_HERE%2F0.jpg"&gt;
alt="IMAGE ALT TEXT HERE" width="240" height="180" border="10" /&amp;gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or, in pure Markdown, but losing the image sizing and border:&lt;br&gt;
1&lt;/p&gt;

&lt;p&gt;[![IMAGE ALT TEXT HERE](&lt;a href="http://img.youtube.com/vi/YOUTUBE_VIDEO_ID_HERE/0" rel="noopener noreferrer"&gt;http://img.youtube.com/vi/YOUTUBE_VIDEO_ID_HERE/0&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>
JAMstack, Headless CMS and beyond! Part 1</title>
      <dc:creator>Stephen Ajulu</dc:creator>
      <pubDate>Thu, 21 Nov 2019 17:36:24 +0000</pubDate>
      <link>https://forem.com/stephenajulu/jamstack-headless-cms-and-beyond-part-1-4ad8</link>
      <guid>https://forem.com/stephenajulu/jamstack-headless-cms-and-beyond-part-1-4ad8</guid>
      <description>&lt;p&gt;Why i and many others believe JAMstack, PROGRESSIVE WEB APPS, Static Site Generators and Headless CMS are the future! PART 1.&lt;/p&gt;

&lt;p&gt;I am sure some of you have heard or seen some of these terms before. But for those who haven’t let us start from the beginning.&lt;/p&gt;

&lt;p&gt;During the start of the age of the internet, static site were prevalent. You had to know how to write HTML to be called a Web Developer. Back then WordPress didn’t exist. All you had was HTML, CSS and JavaScript, eventually WordPress came and promised a clean interface, no coding skills need and a whole lot of themes/templates which you could edit by yourself through their interface. Since then wordpress has pretty much become an internet ruler along side Google. But now the tide is shifting, will you shift as well.&lt;br&gt;
Introducing Static Site Generators, Headless CMS and JAMstack&lt;br&gt;
JAMstack&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the JAMstack?
&lt;/h3&gt;

&lt;p&gt;You may have already seen or worked on a JAMstack site! They do not have to include all attributes of JavaScript, APIs, and Markup. They might be built using by hand, or with Jekyll, Hugo, Nuxt, Next, Gatsby, or another static site generator…&lt;/p&gt;

&lt;p&gt;The thing that they all have in common is that they don’t depend on a web server.&lt;br&gt;
JAVASCRIPT&lt;/p&gt;

&lt;p&gt;Any dynamic programming during the request/response cycle is handled by JavaScript, running entirely on the client. This could be any front end framework, library, or even vanilla JavaScript. eg Jekyll, Gatsby, Nuxtjs, Nextjs, Hugo, Hexo, Vuejs.&lt;br&gt;
API&lt;/p&gt;

&lt;p&gt;All server-side processes or database actions are abstracted into reusable APIs, accessed over HTTPS with JavaScript. These can be custom-built or leverage third-party services. eg GitHub API PI, Vero API, Google sheets API, YouTube API.&lt;br&gt;
MARKUP&lt;/p&gt;

&lt;p&gt;Templated markup should be pre-built at deploy time, usually using a site generator for content sites, or a build tool for web apps.&lt;br&gt;
When is your site not built with the JAMstack?&lt;/p&gt;

&lt;p&gt;Any project that relies on a tight coupling between client and server is not built with the JAMstack. This would include:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A single page app that uses isomorphic rendering to build views on the server at run time.
A monolithic server-run web app that relies on Ruby, Node, or another backend language.
A site built with a server-side CMS like WordPress, Drupal, Joomla, or Squarespace.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Why choose JAMstack?
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Better performance – Why wait for pages to build on the fly when you can generate them at deploy time? When it comes to minimizing the time to first byte, nothing beats pre-built files served over a CDN.
Higher Security – With server-side processes abstracted into microservice APIs, surface areas for attacks are reduced. You can also leverage the domain expertise of specialist third-party services. And also with server side CMS you get a larger surface area prone to attack.
Affordable, Easier Scaling – When your deployment amounts to a stack of files that can be served anywhere, scaling is a matter of serving those files in more places. CDNs are perfect for this, and often include scaling in all of their plans.
Better Developer Experience – Loose coupling and separation of controls allow for more targeted development and debugging, and the expanding selection of CMS options for site generators remove the need to maintain a separate stack for content and marketing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  STATIC SITE GENERATORS
&lt;/h2&gt;

&lt;p&gt;First, How does a static website work?&lt;/p&gt;

&lt;p&gt;Static websites do not generate content on the fly. This means that when a users visits the page, the content that is displayed is pulled directly from a file and does not require compilation or generation prior to showing up in the browser.&lt;/p&gt;

&lt;p&gt;A great analogy that I read over on David Walsh’s blog is to consider a static website like a newspaper. Once it’s printed, you simply open it and read it exactly as intended with no need to wait. The newspaper is already on your step, waiting to be read whenever you choose to pick it up.&lt;/p&gt;

&lt;p&gt;This is essentially how a static site generator works. The content is usually stored in a flat file format as opposed to a database and uses templates to generate the structure of the page. This means you receive a pure HTML file when visiting the page as opposed to waiting for the database to generate it on the fly.&lt;/p&gt;

&lt;p&gt;Site generators or Static Site Generators are a must-use build tool for modern websites. They basically make it much easier to create, build and compile a modern website. They come and all shapes and sizes, and even though HTML, CSS and Javascript always comes out the other end, the language the site generators are written in varies.&lt;/p&gt;

&lt;p&gt;Static site generators expand on static websites to make them more appealing to developers and offer several benefits. In a nutshell, most static site generators offer the following features:&lt;br&gt;
Templates&lt;/p&gt;

&lt;p&gt;Most static site generators offer an easy means of templating a website by allowing it to be built more easily using layouts and templating engines. Jekyll, for instance, uses the Liquid templating language to process templates.&lt;br&gt;
Writing Content&lt;/p&gt;

&lt;p&gt;Most of these use Markdown as a way of writing a post or page. It is a faster than writing pure html. This way markdown is then converted to HTML.&lt;br&gt;
Now to the generators&lt;/p&gt;

&lt;p&gt;Jekyll is by far the most popular one of those generators. It’s built with Ruby and integrated into GitHub Pages. So, it’s quite popular for personal projects and/or documentation. It has a huge user base and a big directory of plugins.&lt;/p&gt;

&lt;p&gt;Hugo is quite like Jekyll. It’s built on Go and its main point against Jekyll is its blazing fast speed. Jekyll can be quite slow when the actual site is being generated , especially when the number of posts/pages goes up.&lt;br&gt;
But Hugo generates the site in a matter of seconds. There are other abstractions that make Hugo more user-friendly and easier to start with. It does not need as much configuration to create something from scratch.&lt;/p&gt;

&lt;p&gt;Hexo is a newer addition and created with NodeJS. Advertised, and mostly used as a blog platform, it combines the extensibility of Jekyll with the speed of Hugo. (actually faster than Hugo)&lt;/p&gt;

&lt;p&gt;Wintersmith is another one built on top of NodeJS. This one is different as it is quite minimalistic. It basically is a platform that you can customize through some plugins to your needs. It definitely requires some tweaking to make it work, but leaves more space for customization.&lt;/p&gt;

&lt;p&gt;Gatsby is the one framework that brings the static pages to stacks nowadays. It uses React.js and Webpack to create a SPA ( Single Page Application ) with your content. It promises to remove much of the configuration needed for such an application. Doing so, it provides the developer with an easy to use solution that will, in the end, produce a modern and high-end application.&lt;br&gt;
The truth is that Gatsby can be used for many other things than just a blog. Its true limit hasn’t been found yet.(As it only reached its first stable release earlier this month.) This seems to be the WordPress for static sites.&lt;br&gt;
Advantages of static&lt;br&gt;
1) Speed&lt;/p&gt;

&lt;p&gt;Perhaps the most immediately noticeable characteristic of a static site is how fast it is. As mentioned above, there are no database queries to run, no templating and no processing whatsoever on every request.&lt;/p&gt;

&lt;p&gt;Web servers are really good at delivering static pages quickly, and the entire site consists of static HTML files that are sitting on the server, waiting to be served, so a request is served back to the user pretty much instantly.&lt;br&gt;
2) Version control for content&lt;/p&gt;

&lt;p&gt;You can’t even imagine working on a project without version control anymore, can you? Having a repository where people can collaboratively work on files, control exactly who does what and rollback changes when something goes wrong is essential in any software project, no matter how small.&lt;/p&gt;

&lt;p&gt;But what about the content? That’s the keystone of any site and yet it usually sits in a database somewhere else, completely separated from the codebase and its version control system. In a static site, the content is typically stored in flat files and treated as any other component of the codebase. In a blog, for example, that means being able to have the actual posts stored in a GitHub repository and allowing your readers to file an issue when something is wrong or to add a correction with a pull request — how cool is that?&lt;br&gt;
3) Security&lt;/p&gt;

&lt;p&gt;Platforms like WordPress are used by millions of people around the world, meaning they’re common targets for hackers and malicious attacks — no way around it. Wherever there’s user input/authentication or multiple processes running code on every request, there’s a potential security hole to exploit. To be on top of the situation, site administrators need to keep patching their systems with security updates, constantly playing cat and mouse with attackers, a routine that may be overlooked by less experienced users.&lt;/p&gt;

&lt;p&gt;Static sites keep it simple, since there’s not much to mess up when there’s only a web server serving plain HTML pages.&lt;br&gt;
4) Less hassle with the server&lt;/p&gt;

&lt;p&gt;Installing and maintaining the infrastructure required to run a dynamic site can be quite challenging, especially when multiple servers are involved or when something needs to be migrated. There’s packages, libraries, modules and frameworks with different versions and dependencies, there’s different web servers and database engines in different operating systems.&lt;/p&gt;

&lt;p&gt;Sure, a static site generator is a software package with its dependencies as well, but that’s only relevant at build time, when the site is generated. Ultimately, the end result is a collection of HTML files that can be served anywhere, scaled and migrated as needed regardless of the server-side technologies. As for the site generation process, that can be done from an environment that you control locally and not necessarily on the web server that will run the site — heck, you can build an entire site on your laptop and push the result to the web when it’s done.&lt;br&gt;
5) Traffic surges&lt;/p&gt;

&lt;p&gt;Unexpected traffic peaks on a website can be a problem, especially when it relies intensively on database calls or heavy processing. Introducing caching layers such as Varnish or Memcached surely helps, but that ends up introducing more possible points of failure in the system.&lt;/p&gt;

&lt;p&gt;A static site is generally better prepared for those situations, as serving static HTML pages consumes a very small amount of server resources.&lt;/p&gt;
&lt;h2&gt;
  
  
  Headless CMS
&lt;/h2&gt;

&lt;p&gt;A headless CMS is like a traditional CMS, but without a way to present the content being created and stored within it. It simply allows for the creation, reading, updating and deleting (CRUD) of content.&lt;/p&gt;

&lt;p&gt;That might sound counterproductive at first, but the idea is that — thanks to the lack of a front-end delivery layer — brands can use any front-end tool they want to present the content, meaning they can deliver content beyond websites and apps, reaching any channel from kiosks to smartwatches and even inside virtual reality headsets.&lt;/p&gt;

&lt;p&gt;A decoupled CMS works in the same way, but it throws in some handy front-end tools like templates and advanced drag-and-drop content modeling features. Hence, it has a head, it’s just decoupled from it, allowing the organization to draft in other front-end tools on an ad-hoc basis.&lt;/p&gt;

&lt;p&gt;While headless and decoupled architecture are nothing new, the demand for this kind of solution is, as businesses look to deliver content to locations outside of the standard web browser.&lt;/p&gt;

&lt;p&gt;Headless CMS architecture separates back-end content functions (like creation, management, and storage) from front-end functions (like presentation and delivery).&lt;/p&gt;

&lt;p&gt;Headless CMS’ are the opposite of legacy systems like WordPress, Drupal, Joomla, etc. They are all CMS’ that traditionally have to be hosted and built together with the site every time it’s served.&lt;/p&gt;

&lt;p&gt;A headless CMS doesn’t care where it’s serving its content to. It’s no longer attached to the frontend, and the content can be viewed on any platform.&lt;/p&gt;

&lt;p&gt;Headless architecture is partly a response to the way web content has evolved. For a long time, most web content was delivered through a browser, often as a web page. But new connected devices are arriving all the time.&lt;/p&gt;

&lt;p&gt;The advantages of this approach is huge, and it works with JAMstack sites that are many times faster safer and cheaper to scale than traditional sites.&lt;br&gt;
Types of Headless CMS&lt;br&gt;
Type: Git-based / API Driven&lt;/p&gt;

&lt;p&gt;Here we focus on what type of CMS it fall under.&lt;/p&gt;
&lt;h3&gt;
  
  
  Git-based
&lt;/h3&gt;

&lt;p&gt;With a git-based CMS you are pushing changes to git that then triggers a new build of your site.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Full version control on all content out of the box.
All content lives as normal text files so developers can use all the normal tools they use as a developer.
Much easier to rollback.
Is the most homogenous approach with the existing git-based workflow of most web-developers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Not a good solution if you want several apps or sites to pull content from the same CMS.
If you have tons of content, you would in some cases want a database instead.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  API-driven
&lt;/h3&gt;

&lt;p&gt;A CMS that is purely API driven. It does need to run every time a site has a visitor, but it’s an external api instead of having to run it as part of your site.&lt;/p&gt;

&lt;p&gt;For some API-driven CMS Like Contentful and Prismic, you can also just use the api in the build phase, eliminating the need for anything being build on the fly. Though that will lead to longer build times.&lt;/p&gt;

&lt;p&gt;Pros&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The best solution if you have several different apps or sites pulling the same managed content.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Cons&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Not version controlled in Git.
Not as integrated in developer workflow as git-based CMS.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  List of the most common
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Butter CMS
Contentstack
Contentful
dotCMS
Mura
Forestry
Netlify CMS
Cloud CMS
Cockpit CMS
Core dna
Craft CMS
Zesty.io
Directus
Storyblok
GraphQL CMS
Gentics Mesh
Cosmic JS
Kentico Cloud
Prismic.io
Quintype
Sanity
Scrivito
Squidex
DNN Evoq Content
Strapi
Superdesk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  My top personal favorites
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Contentful
Netlify CMS
Forestry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Headless CMS, PWA, Static Site Generators ARE the Future!&lt;/p&gt;

&lt;p&gt;And that’s the end of part 1.&lt;/p&gt;

&lt;p&gt;Part 2, we will cover Progressive Web Apps and get deeper into Static Site Generators and Headless CMS. This was just surface level. I didn’t put them all into 1 post in order to save my reader mental and eye torture through reading a 5000 words post.&lt;/p&gt;

&lt;p&gt;Well. That’s it for today. I would like to ask you to kindly donate to the blog. Donations are on the sidebar on your right.&lt;/p&gt;

&lt;h2&gt;Want the real post? Visit  here: &lt;a href="https://ajulusthoughts.wordpress.com/2019/11/05/jamstack-headless-cms-and-beyond-part-1/"&gt;Ajulu's Thoughts: JAMstack, Headless CMS and Beyond&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Thank you. Have a wonderful day!&lt;/p&gt;

&lt;p&gt;Images Sources:&lt;/p&gt;

&lt;p&gt;Bejamas.io&lt;/p&gt;

&lt;p&gt;Contentful&lt;/p&gt;

</description>
      <category>jamstack</category>
      <category>headlesscms</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
