<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Unclebigbay</title>
    <description>The latest articles on DEV Community by Unclebigbay (@unclebigbay).</description>
    <link>https://dev.to/unclebigbay</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%2F381721%2F2f2a6766-6596-4883-9d5f-6df92f2e0182.jpg</url>
      <title>DEV Community: Unclebigbay</title>
      <link>https://dev.to/unclebigbay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/unclebigbay"/>
    <language>en</language>
    <item>
      <title>Best End-to-End Testing Tools for Web Apps in 2026 (AI Options Included)</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Wed, 25 Jun 2025 06:53:34 +0000</pubDate>
      <link>https://dev.to/unclebigbay/best-end-to-end-testing-tools-for-web-apps-in-2025-ai-options-included-2j6</link>
      <guid>https://dev.to/unclebigbay/best-end-to-end-testing-tools-for-web-apps-in-2025-ai-options-included-2j6</guid>
      <description>&lt;h2&gt;
  
  
  The QA Crisis: Why 85% of Bugs Still Reach Production in 2026
&lt;/h2&gt;

&lt;p&gt;Every developer knows this pain: you ship a "simple" feature on Friday, and by Monday morning, your Slack is exploding with bug reports. Users are frustrated, your team is scrambling, and you're wondering how that "thoroughly tested" checkout flow completely broke on mobile Safari.&lt;/p&gt;

&lt;p&gt;Here's the uncomfortable truth: &lt;strong&gt;85% of website bugs are discovered by users, not during testing.&lt;/strong&gt; Every developer knows this pain: you ship a "simple" feature on Friday, and by Monday morning, your Slack is exploding with bug reports from customers who found issues your tests missed. &lt;a href="https://qualityhive.com/blog/website-bug-statistics-2024" rel="noopener noreferrer"&gt;Source.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But 2026 is different. AI-powered testing tools have finally matured enough to make comprehensive QA accessible to lean teams. Whether you're a solo developer shipping side projects or a startup racing toward product-market fit, you now have options that would have required a full QA department just two years ago.&lt;/p&gt;

&lt;p&gt;This guide breaks down &lt;strong&gt;20+ tools across four categories&lt;/strong&gt; - from battle-tested frameworks to cutting-edge AI QA services - so you can pick what actually works for your team, budget, and sanity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9fom5ek0xedmip9okn4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9fom5ek0xedmip9okn4.jpg" alt="AI powered QA testing" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Quick Navigation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Decision Flowchart ← Start here if you're in a hurry&lt;/li&gt;
&lt;li&gt;
Test Frameworks ← DIY approach&lt;/li&gt;
&lt;li&gt;
Cloud Platforms ← Scale existing tests&lt;/li&gt;
&lt;li&gt;
AI QA Tools ← Smart automation&lt;/li&gt;
&lt;li&gt;
QA-as-a-Service ← Full outsourcing&lt;/li&gt;
&lt;li&gt;
Comparison Table ← Side-by-side analysis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 How to Choose Your Tool (Decision Flowchart)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;👥 What's your team size?

├── Solo dev / 2-3 engineers
│   ├── No QA experience? → Bug0, QA Wolf, or Autify
│   ├── Want to learn? → Playwright + GitHub Actions
│   └── Need quick setup? → Testsigma or BlinqIO
│
├── 4-10 engineers
│   ├── Existing tests? → BrowserStack/LambdaTest + current framework
│   ├── No tests yet? → Bug0, Mabl, or Functionize
│   └── Strong dev team? → Playwright/Cypress + CI/CD
│
└── 10+ engineers
    ├── Enterprise compliance? → Sauce Labs or QASource
    ├── Scaling existing QA? → BrowserStack + dedicated QA hire
    └── Building from scratch? → Bug0 Enterprise or Playwright + AI tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Budget reality check:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💰 &lt;strong&gt;$0-500/month&lt;/strong&gt;: Open source frameworks + GitHub Actions&lt;/li&gt;
&lt;li&gt;💰💰 &lt;strong&gt;$500-2000/month&lt;/strong&gt;: AI QA tools or simple QA service&lt;/li&gt;
&lt;li&gt;💰💰💰 &lt;strong&gt;$2000-5000/month&lt;/strong&gt;: Premium AI platforms or cloud infra&lt;/li&gt;
&lt;li&gt;💰💰💰💰 &lt;strong&gt;$5000+/month&lt;/strong&gt;: Full-service QA or enterprise solutions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚧 What Makes a Great E2E Tool in 2026?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(End-to-end testing simulates real user interactions - clicking buttons, filling forms, navigating pages - to ensure your entire app works as expected.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Based on feedback from 200+ developers and my experience implementing QA at three startups, here are the non-negotiables:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Must-Haves&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Fast setup&lt;/strong&gt; (hours, not weeks)&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;CI/CD integration&lt;/strong&gt; (GitHub Actions, GitLab CI, etc.)&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Cross-browser support&lt;/strong&gt; (at minimum: Chrome, Firefox, Safari)&lt;/li&gt;
&lt;li&gt;🛠️ &lt;strong&gt;Low maintenance burden&lt;/strong&gt; (tests shouldn't break every UI change)&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Clear reporting&lt;/strong&gt; (know exactly what broke and why)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The 2026 Differentiators&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🧠 &lt;strong&gt;AI-powered test generation&lt;/strong&gt; (write tests in English, not code)&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Self-healing tests&lt;/strong&gt; (adapt to UI changes automatically)&lt;/li&gt;
&lt;li&gt;🚫 &lt;strong&gt;Flaky test detection&lt;/strong&gt; (identify and quarantine unreliable tests)&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;Performance insights&lt;/strong&gt; (catch slow pages before users do)&lt;/li&gt;
&lt;li&gt;♿ &lt;strong&gt;Accessibility checking&lt;/strong&gt; (WCAG compliance built-in)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Category 1: Test Frameworks (For Engineers Who Want Full Control)
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Best for: Teams with strong engineering resources who want to own their QA pipeline&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These open-source frameworks give you complete control over test creation, execution, and maintenance. You write the code, manage the infrastructure, and customize everything to your exact needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Pro tip&lt;/strong&gt;: All frameworks below integrate well with GitHub Actions. I'll show you a sample workflow at the end of this section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foeal3hcbac9t24lbtx3g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foeal3hcbac9t24lbtx3g.jpg" alt="Test Frameworks (For Engineers Who Want Full Control)" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Playwright&lt;/strong&gt; ⭐ &lt;em&gt;Developer Favorite&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Microsoft's modern automation framework that's quickly becoming the gold standard for E2E testing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Playwright test example - notice how clean this is&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;test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&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;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user can complete checkout&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="add-to-cart"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-testid="checkout"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;locator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;h1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toContainText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Order Confirmed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🌟 &lt;strong&gt;GitHub Stars&lt;/strong&gt;: 65,000+ (very active community)&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Medium (great docs, lots of examples)&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Browser Support&lt;/strong&gt;: Chrome, Firefox, Safari, Edge&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Mobile&lt;/strong&gt;: Excellent (real device testing)&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Performance&lt;/strong&gt;: Fast parallel execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why developers love it&lt;/strong&gt;: Modern API, excellent debugging tools, built-in waiting strategies that eliminate flaky tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality check&lt;/strong&gt;: You'll need 1-2 weeks to get comfortable, and ongoing maintenance as your app evolves.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://playwright.dev/" rel="noopener noreferrer"&gt;Playwright.dev&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Cypress&lt;/strong&gt; ⭐ &lt;em&gt;Beginner Friendly&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;The framework that made E2E testing accessible to frontend developers. Great developer experience with real-time debugging.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Cypress test - very readable for frontend devs&lt;/span&gt;
&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User Authentication&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should log in successfully&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-cy="email"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-cy="password"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[data-cy="submit"]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;include&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🌟 &lt;strong&gt;GitHub Stars&lt;/strong&gt;: 46,000+&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Low (excellent getting started guide)&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Browser Support&lt;/strong&gt;: Chrome, Firefox, Edge (⚠️ no Safari)&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Mobile&lt;/strong&gt;: Limited&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Performance&lt;/strong&gt;: Good for most use cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Frontend-heavy teams who want quick wins and great developer UX.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gotcha&lt;/strong&gt;: Safari testing requires additional tools, and it can struggle with complex SSR applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cypress.io/" rel="noopener noreferrer"&gt;🔗 Cypress.io&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Selenium&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The grandfather of browser automation. Still relevant for enterprise and legacy applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌟 &lt;strong&gt;GitHub Stars&lt;/strong&gt;: 30,000+&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: High (lots of boilerplate)&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Browser Support&lt;/strong&gt;: Excellent (everything)&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Mobile&lt;/strong&gt;: Good with Appium&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Performance&lt;/strong&gt;: Slower than modern alternatives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Large enterprises with existing Selenium infrastructure or teams using non-JavaScript languages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality check&lt;/strong&gt;: Higher maintenance overhead and slower execution compared to Playwright/Cypress.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.selenium.dev/" rel="noopener noreferrer"&gt;🔗 Selenium.dev&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;TestCafe&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Simple, zero-config testing framework that runs tests in real browsers without WebDriver.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌟 &lt;strong&gt;GitHub Stars&lt;/strong&gt;: 10,000+&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Low&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Browser Support&lt;/strong&gt;: Good&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Mobile&lt;/strong&gt;: Basic&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Performance&lt;/strong&gt;: Good&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Teams wanting simplicity over advanced features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://testcafe.io/" rel="noopener noreferrer"&gt;🔗 Testcafe.io&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Nightwatch.js&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Selenium-based framework with a focus on simplicity and built-in test runner.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌟 &lt;strong&gt;GitHub Stars&lt;/strong&gt;: 12,000+&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Medium&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Browser Support&lt;/strong&gt;: Good (via Selenium)&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Mobile&lt;/strong&gt;: Via Appium&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Performance&lt;/strong&gt;: Moderate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Teams already familiar with Selenium who want a simpler API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nightwatchjs.org/" rel="noopener noreferrer"&gt;🔗 Nightwatch.js&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 Quick Start: Playwright + GitHub Actions
&lt;/h3&gt;

&lt;p&gt;Here's a complete setup that takes 15 minutes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/e2e.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;E2E Tests&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;18'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install Playwright browsers&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx playwright install&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run E2E tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run test:e2e&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload test results&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v4&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;failure()&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;playwright-report&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;playwright-report/&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cost reality&lt;/strong&gt;: Framework is free, but you'll spend $5,000-10,000/month on engineering time for setup, maintenance, and infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  ☁️ Category 2: Traditional Cloud Testing Platforms
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Best for: Teams with existing test suites who need scalable infrastructure&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These platforms don't write tests for you, but they provide robust cloud infrastructure to run your existing tests across thousands of browser/device combinations.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;BrowserStack&lt;/strong&gt; ⭐ &lt;em&gt;Industry Standard&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;The gold standard for cloud testing infrastructure. If you're already writing Playwright/Cypress tests and need to scale them, BrowserStack is your best bet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 1-2 hours (excellent documentation)&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Coverage&lt;/strong&gt;: 3,000+ browser/device combinations&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Analytics&lt;/strong&gt;: Comprehensive dashboards and debugging tools&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: Everything (GitHub, Slack, Jira, Jenkins, etc.)&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: $29-199/month per user
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Run your existing tests on BrowserStack&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;capabilities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bstack:options&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;os&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Windows&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;osVersion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;browserName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Chrome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;browserVersion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;latest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why teams choose it&lt;/strong&gt;: Rock-solid reliability, excellent debugging tools, works with any existing framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consider if&lt;/strong&gt;: You have tests written but need them to run on more browsers/devices than your local setup allows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.browserstack.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;LambdaTest&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Affordable BrowserStack alternative with strong focus on ease of use and developer experience.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 1 hour&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Coverage&lt;/strong&gt;: 3,000+ browser/OS combinations&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Analytics&lt;/strong&gt;: Good dashboards, video recordings&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: GitHub, GitLab, Slack, Asana&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: $15-58/month per user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Budget-conscious teams who want 80% of BrowserStack's features at 60% of the cost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lambdatest.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Sauce Labs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Enterprise-focused platform with advanced debugging and compliance features.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 2-3 hours&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Coverage&lt;/strong&gt;: 2,000+ combinations&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Analytics&lt;/strong&gt;: Advanced performance insights&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: Enterprise tools (Jenkins, Azure DevOps)&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: Custom enterprise pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Large enterprises with compliance requirements (SOC 2, ISO 27001).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://saucelabs.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;TestingBot&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Solid BrowserStack alternative with competitive pricing and good customer support.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 1 hour&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Coverage&lt;/strong&gt;: 1,500+ combinations&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Analytics&lt;/strong&gt;: Standard reporting&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: Major CI/CD tools&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: $50-200/month per user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://testingbot.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;CrossBrowserTesting&lt;/strong&gt; (SmartBear)
&lt;/h3&gt;

&lt;p&gt;Part of the SmartBear testing suite, good for teams already using their tools.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 1-2 hours&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Coverage&lt;/strong&gt;: 2,000+ combinations&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Analytics&lt;/strong&gt;: Integrated with SmartBear suite&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: SmartBear tools, major CI/CD&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: $39-249/month per user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://smartbear.com/product/testcomplete/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Category 3: AI QA Tools (Self-Serve Platforms, In-House Execution)
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Best for: Teams with some QA bandwidth who want AI to handle the heavy lifting&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These tools let your team maintain control while AI handles test creation, maintenance, and optimization. Think of them as smart assistants for your QA process.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Autify&lt;/strong&gt; ⭐ &lt;em&gt;No-Code Champion&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Record tests by clicking through your app, then let AI maintain them as your UI evolves.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;How it works:
1. Record: Click through your app normally
2. Review: AI converts actions into test steps
3. Run: Tests execute automatically on every deploy
4. Maintain: AI auto-heals when UI changes

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Features&lt;/strong&gt;: Auto-healing, smart element detection&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 30 minutes (truly no-code)&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Very low (if you can use your app, you can test it)&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: GitHub, GitLab, Slack, Jira&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: ~$2,000-4,000/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Perfect for&lt;/strong&gt;: Non-technical teams or developers who want to focus on building, not testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality check&lt;/strong&gt;: Less flexible than coded solutions, but 10x faster to implement.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://autify.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Functionize&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Write tests in plain English, and AI converts them into robust browser automation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example test in Functionize:
"Navigate to login page, enter email 'test@example.com',
enter password 'secure123', click login button,
verify dashboard page loads with welcome message"

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Features&lt;/strong&gt;: NLP test generation, visual validation, self-healing&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 2-3 hours&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Low (write tests like instructions to a human)&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: Major CI/CD tools, Slack notifications&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: ~$5,000-10,000/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Teams who want the power of coded tests without writing code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.functionize.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Testsigma&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Low-code platform that turns natural language into automated tests across web, mobile, and APIs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Natural language test:
"Open application URL, click on 'Sign Up' button,
enter 'john@example.com' in email field,
verify error message 'Email already exists' is displayed"

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Features&lt;/strong&gt;: NLP test creation, flaky test detection, auto-suggestions&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 1-2 hours&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Low&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: GitHub, Jira, Slack, Teams&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: ~$1,500-3,500/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Teams testing web + mobile + APIs who want one unified platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://testsigma.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;Qase&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Modern test management platform with AI-powered test planning and execution insights.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Features&lt;/strong&gt;: Test case auto-generation, planning assistance, analytics&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 1 hour&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Low (focuses on organization, not test creation)&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: Everything (50+ integrations)&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: ~$1,000-2,500/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Teams who need better test organization and reporting alongside existing tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://qase.io/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Mabl&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Comprehensive platform combining AI testing with performance monitoring and accessibility scanning.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Features&lt;/strong&gt;: Self-healing tests, visual regression, performance insights&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 2-3 hours&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Medium&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: GitHub, Jenkins, Slack&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: ~$3,000-6,000/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Teams who want testing + performance monitoring + accessibility in one tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mabl.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  6. &lt;strong&gt;BlinqIO&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Turn plain English into Playwright tests. Perfect for teams who love Playwright but want AI assistance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;English: "Go to homepage, click pricing link, verify Enterprise plan shows $99/month"
↓ AI converts to ↓
Playwright: await page.goto('/'), await page.click('a[href="/pricing"]'),
           await expect(page.locator('.enterprise .price')).toContainText('$99');

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Features&lt;/strong&gt;: English-to-Playwright conversion, auto-maintenance&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 30 minutes&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Low (if you know Playwright basics)&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: GitHub Actions, CLI tools&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: ~$500-3,000/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Playwright teams who want to speed up test creation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.blinq.io/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Category 4: AI QA-as-a-Service (Managed QA Execution + AI Tools)
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Best for: Lean teams who want comprehensive QA without building it in-house&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These services combine AI tools with expert QA professionals. You focus on building product; they handle testing entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Bug0&lt;/strong&gt; ⭐ &lt;em&gt;Startup, Modern teams’ Favorite&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;AI agents explore your app like real users, generate tests automatically, and include human QA review for accuracy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82azdcte76cqedwlvvac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82azdcte76cqedwlvvac.png" alt="Bug0 homepage - AI powered QA for lean and modern teams" width="800" height="517"&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;How Bug0 works:
Week 1: AI agents explore your staging app, map user flows
Week 2: Generate comprehensive test suite, human QA review
Week 3: Integrate with GitHub, tests run on every PR
Week 4: 100% critical flow coverage, ongoing maintenance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Approach&lt;/strong&gt;: Autonomous agents + human verification&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: Instant (just provide staging URL)&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Zero (they do everything)&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: GitHub, GitLab, Slack notifications&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: $700-2,000/month (all-inclusive)&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Coverage&lt;/strong&gt;: 100% critical flows in 1 week, 80% total coverage in 4 weeks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Perfect for&lt;/strong&gt;: Startups and lean teams who want enterprise-level QA without the enterprise complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real user feedback&lt;/strong&gt;: &lt;em&gt;"Bug0 is the closest thing to plug-and-play QA testing at scale. Since we started using it at Dub, it's helped us catch multiple bugs before they made their way to prod."&lt;/em&gt; - Steven Tey, Founder of Dub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bug0.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Rainforest QA&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Natural language test writing combined with AI automation and human testers for validation.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Approach&lt;/strong&gt;: Automation + crowd-sourced human testing&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 1-2 weeks&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: Low (write tests in English)&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: GitHub, GitLab, Jira&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: ~$4,000-8,000/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Teams who want fast feedback cycles with human validation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rainforestqa.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;QASource&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Dedicated offshore QA engineers with AI-enhanced workflows and reporting.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Approach&lt;/strong&gt;: Human QA teams + AI optimization tools&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 2-4 weeks&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: None (they handle everything)&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: Enterprise tools, custom reporting&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: ~$8,000-15,000/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Mid-to-large companies who want dedicated QA teams without hiring internally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.qasource.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;BugRaptors&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Blends manual and automated testing using custom AI tools like RaptorGen and RaptorVision.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Approach&lt;/strong&gt;: Custom AI tools + experienced QA teams&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 2-3 weeks&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: None&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: Custom integrations available&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: ~$5,000-10,000/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Companies needing compliance reporting and audit trails.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.bugraptors.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;QA Wolf&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Playwright-based end-to-end test coverage delivered as a fully managed service.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI Approach&lt;/strong&gt;: Playwright + AI maintenance + human oversight&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Setup Time&lt;/strong&gt;: 1 week&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Curve&lt;/strong&gt;: None&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Integrations&lt;/strong&gt;: Direct workflow integration&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Pricing&lt;/strong&gt;: ~$5,000-9,000/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;: Teams who love Playwright but want someone else to manage it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://qawolf.com/" rel="noopener noreferrer"&gt;🔗 Website&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Comprehensive Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;GitHub Stars&lt;/th&gt;
&lt;th&gt;AI Support&lt;/th&gt;
&lt;th&gt;Setup Time&lt;/th&gt;
&lt;th&gt;Learning Curve&lt;/th&gt;
&lt;th&gt;Monthly Cost Range&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Playwright&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Test Framework&lt;/td&gt;
&lt;td&gt;65,000+&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;1-2 weeks&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;$5,000-10,000*&lt;/td&gt;
&lt;td&gt;Modern apps, technical teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cypress&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Test Framework&lt;/td&gt;
&lt;td&gt;46,000+&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;1 week&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;$5,000-10,000*&lt;/td&gt;
&lt;td&gt;Frontend-heavy teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Selenium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Test Framework&lt;/td&gt;
&lt;td&gt;30,000+&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;2-3 weeks&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;$8,000-15,000*&lt;/td&gt;
&lt;td&gt;Enterprise, legacy systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TestCafe&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Test Framework&lt;/td&gt;
&lt;td&gt;10,000+&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;1 week&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;$5,000-8,000*&lt;/td&gt;
&lt;td&gt;Simple testing needs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nightwatch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Test Framework&lt;/td&gt;
&lt;td&gt;12,000+&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;1-2 weeks&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;$6,000-10,000*&lt;/td&gt;
&lt;td&gt;Selenium users wanting simplicity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BrowserStack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud Platform&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;1-2 hours&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;$350-2,400/year&lt;/td&gt;
&lt;td&gt;Scaling existing tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LambdaTest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud Platform&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;$180-700/year&lt;/td&gt;
&lt;td&gt;Budget-conscious teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sauce Labs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud Platform&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;2-3 hours&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Custom pricing&lt;/td&gt;
&lt;td&gt;Enterprise compliance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TestingBot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud Platform&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;$600-2,400/year&lt;/td&gt;
&lt;td&gt;BrowserStack alternative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autify&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI QA Tool&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;td&gt;Very Low&lt;/td&gt;
&lt;td&gt;$2,000-4,000&lt;/td&gt;
&lt;td&gt;No-code test creation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Functionize&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI QA Tool&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;2-3 hours&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;$5,000-10,000&lt;/td&gt;
&lt;td&gt;English-to-test conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Testsigma&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI QA Tool&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;1-2 hours&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;$1,500-3,500&lt;/td&gt;
&lt;td&gt;Multi-platform testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI QA Tool&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;$1,000-2,500&lt;/td&gt;
&lt;td&gt;Test management &amp;amp; reporting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mabl&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI QA Tool&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;2-3 hours&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;$3,000-6,000&lt;/td&gt;
&lt;td&gt;Testing + performance monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BlinqIO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI QA Tool&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;$500-3,000&lt;/td&gt;
&lt;td&gt;Playwright + AI assistance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bug0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;QA-as-a-Service&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;$700-2,000&lt;/td&gt;
&lt;td&gt;Lean teams, full coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rainforest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;QA-as-a-Service&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;1-2 weeks&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;$4,000-8,000&lt;/td&gt;
&lt;td&gt;AI + human validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;QASource&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;QA-as-a-Service&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;2-4 weeks&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;$8,000-15,000&lt;/td&gt;
&lt;td&gt;Dedicated QA teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BugRaptors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;QA-as-a-Service&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;2-3 weeks&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;$5,000-10,000&lt;/td&gt;
&lt;td&gt;Compliance &amp;amp; reporting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;QA Wolf&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;QA-as-a-Service&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;1 week&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;$5,000-9,000&lt;/td&gt;
&lt;td&gt;Managed Playwright service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Framework costs include engineering time (1 QA engineer + infrastructure)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Getting Started: Your Action Plan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;If you're starting from zero&lt;/strong&gt; (no existing tests)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Small team (1-5 devs)&lt;/strong&gt;: Start with &lt;strong&gt;Bug0&lt;/strong&gt; or &lt;strong&gt;Autify&lt;/strong&gt; for instant coverage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want to learn&lt;/strong&gt;: &lt;strong&gt;Playwright&lt;/strong&gt; + GitHub Actions (invest 1-2 weeks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No-code preference&lt;/strong&gt;: &lt;strong&gt;Autify&lt;/strong&gt; or &lt;strong&gt;Testsigma&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;If you have existing tests&lt;/strong&gt; (need to scale)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Playwright/Cypress tests&lt;/strong&gt;: Add &lt;strong&gt;BrowserStack&lt;/strong&gt; or &lt;strong&gt;LambdaTest&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flaky tests problem&lt;/strong&gt;: Try &lt;strong&gt;Mabl&lt;/strong&gt; or &lt;strong&gt;Functionize&lt;/strong&gt; for self-healing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintenance burden&lt;/strong&gt;: Consider &lt;strong&gt;Bug0 or QA Wolf (managed Playwright)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;If you're enterprise&lt;/strong&gt; (compliance, large team)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build in-house&lt;/strong&gt;: &lt;strong&gt;Playwright&lt;/strong&gt; + &lt;strong&gt;Sauce Labs&lt;/strong&gt; + dedicated QA team&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outsource&lt;/strong&gt;: &lt;strong&gt;Bug0, QA Wolf, QASource or BugRaptors&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid&lt;/strong&gt;: &lt;strong&gt;BrowserStack&lt;/strong&gt; + &lt;strong&gt;Bug0&lt;/strong&gt; enterprise plan&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🔍 Common Pitfalls (And How to Avoid Them)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;❌ Starting too big&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Don't try to test everything on day one. Pick 3-5 critical user flows and perfect those first.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;❌ Ignoring flaky tests&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;One flaky test will make your entire team ignore test failures. Use tools with built-in flaky test detection.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;❌ Testing the wrong things&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Focus on user workflows that generate revenue: signup, purchase, core product features. Skip testing your 404 page styling.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;❌ Over-engineering&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You don't need 100% code coverage. You need 100% critical flow coverage. There's a big difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;❌ No clear ownership&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Decide upfront: who fixes broken tests? Who adds new tests for features? Who reviews test results?&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 ROI Timeline: What to Expect
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Week 1-2: Setup &amp;amp; Learning&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Investment: High (time/money)&lt;/li&gt;
&lt;li&gt;Value: Zero (you're still learning)&lt;/li&gt;
&lt;li&gt;Common reaction: "This is harder than I thought"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Month 1-3: Building Momentum&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Investment: Medium (adding tests, fixing issues)&lt;/li&gt;
&lt;li&gt;Value: Low (catching some bugs)&lt;/li&gt;
&lt;li&gt;Common reaction: "Starting to see some value"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Month 3-6: Hitting Stride&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Investment: Low (maintenance only)&lt;/li&gt;
&lt;li&gt;Value: High (preventing major bugs)&lt;/li&gt;
&lt;li&gt;Common reaction: "How did we ship without this?"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Month 6+: Compound Benefits&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Investment: Very low (mostly automated)&lt;/li&gt;
&lt;li&gt;Value: Very high (fast deploys, confidence)&lt;/li&gt;
&lt;li&gt;Common reaction: "QA is our competitive advantage"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real numbers&lt;/strong&gt;: Teams typically see positive ROI within 3-4 months, with bug detection improving by 60-80% in the first year.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 FAQ: Developer Questions Answered
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q: How do I convince my team to invest in E2E testing?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Start with data. Track these metrics for 2 weeks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hours spent fixing production bugs&lt;/li&gt;
&lt;li&gt;Customer complaints about broken features&lt;/li&gt;
&lt;li&gt;Deployment delays due to manual testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then present the cost: "We spent 40 hours last month fixing bugs that E2E tests would have caught. That's $6,000 in engineering time."&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q: What's the difference between unit tests and E2E tests?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Unit tests check individual functions work. E2E tests check that your entire application flow works from a user's perspective. You need both, but E2E tests catch integration issues that unit tests miss.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q: How many E2E tests should we have?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Start with 10-15 tests covering your most critical user flows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User signup/login&lt;/li&gt;
&lt;li&gt;Core product workflows&lt;/li&gt;
&lt;li&gt;Payment/checkout process&lt;/li&gt;
&lt;li&gt;Critical admin functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Add more gradually. 50-100 tests is plenty for most applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q: Should we test in staging or production?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Always test in staging first. Some teams also run smoke tests in production, but your comprehensive suite should run against staging environments that mirror production.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q: How do we handle dynamic content in tests?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Use data attributes (&lt;code&gt;data-testid="submit-button"&lt;/code&gt;) instead of CSS classes or text content. Most modern tools also have smart waiting strategies that handle dynamic loading.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Q: What about mobile testing?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Start with responsive desktop testing (mobile viewport sizes). Add real device testing later if you have mobile-specific features or notice desktop tests don't catch mobile bugs.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The QA landscape in 2026 offers something for every team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No budget, high technical skill&lt;/strong&gt;: Playwright + GitHub Actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small budget, want simplicity&lt;/strong&gt;: Bug0 or Autify&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium budget, scaling existing tests&lt;/strong&gt;: BrowserStack + current framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large budget, enterprise needs&lt;/strong&gt;: Sauce Labs or QASource&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight: &lt;strong&gt;you don't need perfect tests on day one&lt;/strong&gt;. You need reliable tests for your critical flows. Start small, ship with confidence, and iterate.&lt;/p&gt;

&lt;p&gt;AI has fundamentally changed the game. Tools that required months of setup now work in hours. Tests that broke with every UI change now self-heal. The barrier to comprehensive QA has never been lower.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My recommendation&lt;/strong&gt;: If you're reading this and don't have E2E tests yet, pick one tool from this list and start this week. Your future self (and your users) will thank you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your experience with E2E testing? Which tools have worked best for your team? Share your thoughts in the comments below! 👇&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>qa</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Introducing LearnEase - an AI Learning Platform for People in Tech</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Tue, 25 Apr 2023 18:07:34 +0000</pubDate>
      <link>https://dev.to/unclebigbay/introducing-learnease-an-ai-learning-platform-for-people-in-tech-178m</link>
      <guid>https://dev.to/unclebigbay/introducing-learnease-an-ai-learning-platform-for-people-in-tech-178m</guid>
      <description>&lt;p&gt;Excited to announce my latest and first AI project - &lt;strong&gt;LearnEase&lt;/strong&gt;. It's a learning platform powered by AI that enables you to effortlessly learn any concept using simple technical language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo 📺
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/mRdp03De78k"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works 🧑‍💻
&lt;/h2&gt;

&lt;p&gt;Learning a new concept can be challenging, especially when it involves complex topics. That's why LearnEase is here to help. With LearnEase, you can easily define any concept you're interested in learning, and it'll provide you with a simple technical explanation of what you want to learn.&lt;/p&gt;

&lt;p&gt;Click on any of the prompt suggestion buttons or enter what you wish to learn then click the "&lt;strong&gt;GENERATE&lt;/strong&gt;" button as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wiZm-10v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682349835895/e334cfcb-3cda-4399-b3ae-63ea25e8a8f1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wiZm-10v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682349835895/e334cfcb-3cda-4399-b3ae-63ea25e8a8f1.png" alt="guide image" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The AI response framework of LearnEase AI entails the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A definition of the concept you're interested in learning 🤖&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The AI provides you with clear definitions of any concept you want to learn 🤖&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JcgM8hlK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682347237747/8b4fe0fc-d9cc-4497-9a44-caf382b4cfdd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JcgM8hlK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682347237747/8b4fe0fc-d9cc-4497-9a44-caf382b4cfdd.png" alt="guide image" width="800" height="687"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;An analogy that breaks down the concept 🧑‍💻&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But that's not all. LearnEase goes beyond providing definitions. It also includes an analogy section that breaks down the concept into more understandable terms, making it easier for you to relate to it. Additionally, it also provides you with real-world applications of the concept to help you understand how it can be used in practical scenarios.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JoqwFkyJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682347307080/6d4698bb-39b9-44ca-b6fe-3dbf21612d7a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JoqwFkyJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682347307080/6d4698bb-39b9-44ca-b6fe-3dbf21612d7a.png" alt="guide image" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A real-world application of the concept 💼&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To make learning more fun and engaging, LearnEase also suggests fun projects to help you practice the concept. This way, you can apply what you've learned and solidify your understanding of the concept.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--H73kWRhH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682347044917/58faa07b-119c-4d1a-bb09-78c3dc5e472b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--H73kWRhH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682347044917/58faa07b-119c-4d1a-bb09-78c3dc5e472b.png" alt="guide image" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fun projects to help you practice the concept 🌟&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BMZFY5CC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682347347888/ad57258b-ef96-4ed7-b8dc-e7ab86bda313.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BMZFY5CC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682347347888/ad57258b-ef96-4ed7-b8dc-e7ab86bda313.png" alt="guide image" width="800" height="808"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recommendations on what to learn next 🤔&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After you've learned the concept, LearnEase provides recommendations on what to learn next. This way, you can keep building on your knowledge and exploring related topics.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uHSay3K5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682347915453/9911c341-a60f-446a-821e-48e350796f39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uHSay3K5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682347915453/9911c341-a60f-446a-821e-48e350796f39.png" alt="guide image" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A wrap-up summary 🎁&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finally, LearnEase wraps up with a summary of what you've learned. This way, you can easily recall the key points of the concept and have a quick reference for future use. With LearnEase, learning new concepts has never been easier or more enjoyable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZW-60D5E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682348047314/2eb3fd7a-08ca-4495-9e4c-ec041bd9cc48.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZW-60D5E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682348047314/2eb3fd7a-08ca-4495-9e4c-ec041bd9cc48.png" alt="guide image" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also share your feedback on any response on their usefulness.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2W7198VA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682365556694/4b6a820a-0723-4d22-9dcf-27a70e7e26c4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2W7198VA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682365556694/4b6a820a-0723-4d22-9dcf-27a70e7e26c4.png" alt="guide image" width="800" height="151"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  White Board Menu 🚥
&lt;/h2&gt;

&lt;p&gt;The whiteboard menu provides options such as switching focus mode, saving and deleting the AI-generated response, marking responses as favorites and regenerating the AI response.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O0SgkJzn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682365511362/b3f2ddda-39fc-4a25-a1b9-f03e07506dc0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O0SgkJzn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682365511362/b3f2ddda-39fc-4a25-a1b9-f03e07506dc0.png" alt="guide image" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dashboard
&lt;/h2&gt;

&lt;p&gt;The LearnEase dashboard provides access to various features such as creating a new whiteboard, viewing saved and favorite responses and checking your credit balance. The following demonstrates these functionalities:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yJPxg5mL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682367929198/a0bae852-7cce-4425-b72f-8d87c1dc4ce8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yJPxg5mL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682367929198/a0bae852-7cce-4425-b72f-8d87c1dc4ce8.gif" alt="guide image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning Personalization 🧑‍🏫
&lt;/h2&gt;

&lt;p&gt;You can set the language and professional level preference to suit your learning needs.&lt;/p&gt;

&lt;p&gt;Currently supported languages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;English (Default)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Spanish&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Yoruba&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nigeria Pidgin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;French&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you would like me to include more languages, please let me know in the comments section, and I will make sure to index them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classic Mode 💃
&lt;/h2&gt;

&lt;p&gt;The LearnEase whiteboard is in focus 🧘🏽‍♂️ mode by default, you can turn on the classic mode from the whiteboard menu as demonstrated below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bmbvSAkL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682364296369/2d44311b-77bf-4619-befd-4a8b11ab4153.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bmbvSAkL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682364296369/2d44311b-77bf-4619-befd-4a8b11ab4153.gif" alt="guide image" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback from Beta Testers! 🌍
&lt;/h2&gt;

&lt;p&gt;Here's what beta testers are saying!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WsnamnYM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682412897007/aa11ad32-2b6c-440e-89bd-3d69d76fcb75.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WsnamnYM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1682412897007/aa11ad32-2b6c-440e-89bd-3d69d76fcb75.png" alt="guide image" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It's on Product Hunt 🤸‍♂️
&lt;/h2&gt;

&lt;p&gt;LearnEase has been listed on Product Hunt, and you're welcome to show your support by giving it an upvote. Check it out &lt;a href="https://dub.sh/learnease-producthunt"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's open-source 🤩
&lt;/h2&gt;

&lt;p&gt;LearnEase &lt;a href="https://github.com/unclebay143/learnease"&gt;source code&lt;/a&gt; is available on GitHub as part of learning - feel free to read, review, or contribute to it in any way you see fit! Check it out &lt;a href="https://github.com/unclebay143/learnease"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Don't forget to &lt;a href="https://dub.sh/learnease-stargazers"&gt;give it a star&lt;/a&gt; ⭐️&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--96z3eBuk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://pbs.twimg.com/profile_images/1478396594022146048/EiIl-K6l_normal.jpg" alt="unclebigbay profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        unclebigbay
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @unclebigbay143
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kDgU_xDI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      As promised, it's fully open source. Here's the link to the GitHub repo! 🤸‍♂️&lt;br&gt;&lt;br&gt;&lt;a href="https://t.co/AVVds6UJZG"&gt;dub.sh/learnease-gith…&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      10:23 AM - 25 Apr 2023
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1650807746231513088" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OXOJJiQT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1650807746231513088" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--foTp-unf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1650807746231513088" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SFHqU4bF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Wrapping Up 👋
&lt;/h2&gt;

&lt;p&gt;Learn any topic on the go with LearnEase! It offers a seamless learning experience from anywhere, anytime. Start expanding your knowledge today!&lt;/p&gt;

&lt;p&gt;Thank you for checking out &lt;a href="https://dub.sh/learnease"&gt;LearnEase&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>sideprojects</category>
      <category>learning</category>
    </item>
    <item>
      <title>INTRODUCING InvoiceEase: The Simple Solution for Managing Invoices</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Tue, 21 Mar 2023 14:50:46 +0000</pubDate>
      <link>https://dev.to/unclebigbay/introducing-invoiceease-the-simple-solution-for-managing-invoices-1bfl</link>
      <guid>https://dev.to/unclebigbay/introducing-invoiceease-the-simple-solution-for-managing-invoices-1bfl</guid>
      <description>&lt;p&gt;I'm excited to share what I and @&lt;a href="https://dev.to@adeyemodanointed"&gt;Adeyemo Peter&lt;/a&gt; have been working on for a while now- InvoiceEase.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is InvoiceEase?
&lt;/h2&gt;

&lt;p&gt;InvoiceEase is an invoicing tool designed to simplify and streamline the invoicing process for freelancers and small businesses. By providing an intuitive and easy-to-use platform, InvoiceEase helps users create and manage invoices more efficiently with a range of features, such as easy profile management, client management, and invoice management.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo 📺
&lt;/h2&gt;

&lt;p&gt;%[&lt;a href="https://youtu.be/W-nIyNmNshA"&gt;https://youtu.be/W-nIyNmNshA&lt;/a&gt;] &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/invoiceease?utm_source=badge-featured&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-invoiceease"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xQ2JiCID--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.producthunt.com/widgets/embed-image/v1/featured.svg%3Fpost_id%3D385101%26theme%3Dlight%2520align%3D%2522center%2522" alt="InvoiceEase - Streamline your financial processes with InvoiceEase | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Guide to Using InvoiceEase
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 1:&lt;/strong&gt; Create an account
&lt;/h3&gt;

&lt;p&gt;Visit InvoiceEase to &lt;a href="https://invoice-ease.vercel.app/get-started"&gt;sign up&lt;/a&gt; for an account with either your Google or LinkedIn account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F9IcFCih--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678788574614/aa55055d-679f-4320-8e0b-4ae455ba5763.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F9IcFCih--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678788574614/aa55055d-679f-4320-8e0b-4ae455ba5763.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 2:&lt;/strong&gt; Onboarding
&lt;/h3&gt;

&lt;p&gt;You'll be redirected to your dashboard which looks something like below. Follow the onboarding to-do guide widget to complete your onboarding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ax6ZtOd_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678788618579/7198a48a-8df4-4637-bad7-870aa4594df6.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ax6ZtOd_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678788618579/7198a48a-8df4-4637-bad7-870aa4594df6.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 3: Update your profile&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can update your profile and logo from the settings page on your dashboard: The information provided on the profile page will be reusable while creating your invoices, so you won't repeat yourself each time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cTjokfDL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789408504/e871716f-cb5b-4051-aa40-894a737ae1b2.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cTjokfDL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789408504/e871716f-cb5b-4051-aa40-894a737ae1b2.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're setting up your account for the first time. The onboarding wizard will guide you on what next as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SqV9IU50--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789388608/1bb56763-32a0-4a6e-9414-1b83ab4f549a.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SqV9IU50--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789388608/1bb56763-32a0-4a6e-9414-1b83ab4f549a.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 4: Add a payment method&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Payment methods are means by which you want your client to pay you for your service while creating your invoice.&lt;/p&gt;

&lt;p&gt;You can add the following payment methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Bank payment method&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Paypal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stripe (coming soon)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Please comment on this post if you have any payment method you'd want to see on InvoiceEase.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From your settings dashboard, click on the "Add payment method" button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---zDkoe1Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789353198/00e885d3-322f-4950-ba15-f64577da3879.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---zDkoe1Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789353198/00e885d3-322f-4950-ba15-f64577da3879.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, select the payment method you'd like to add from the modal list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aaq-1o0f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789469761/1592766b-dc27-4dc1-85c8-dde3ff53cb36.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aaq-1o0f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789469761/1592766b-dc27-4dc1-85c8-dde3ff53cb36.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and provide the required details in the form modal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4LLDvtRv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789690322/129f0b8c-6e0f-454b-8d75-814d90714ae8.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4LLDvtRv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789690322/129f0b8c-6e0f-454b-8d75-814d90714ae8.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lastly, your payment method will be displayed in the payment methods tab as shown below, where you can also manage them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HnXkdU-N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789616332/bc73b378-8d07-44ad-a839-eeb16dc08c31.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HnXkdU-N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789616332/bc73b378-8d07-44ad-a839-eeb16dc08c31.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're setting up your account for the first time. You can now, proceed to add your client record to which you want to send an invoice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J6aENKNq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789784317/1ca13052-5384-4f9b-bc2c-4bf62af4096c.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J6aENKNq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678789784317/1ca13052-5384-4f9b-bc2c-4bf62af4096c.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Add a client record
&lt;/h3&gt;

&lt;p&gt;To add a new client record in InvoiceEase, simply click on the "Add New Client" option located in the sidebar. From there, you'll be prompted to fill out a form with the required information for the client.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rrSV5H03--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678790081540/521c95d1-ba30-4dcb-bbed-ec7ea58b2bee.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rrSV5H03--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678790081540/521c95d1-ba30-4dcb-bbed-ec7ea58b2bee.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you've added a client, you won't need to fill out their information again each time you create an invoice for them. The information you provide here will be readily available when you create an invoice for the client.&lt;/p&gt;

&lt;p&gt;If you're setting up your account for the first time. The onboarding wizard will guide you on what's next in the onboarding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HdnqF45D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678790364314/2391e0d4-680d-4e25-ab5d-8791459a1c19.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HdnqF45D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678790364314/2391e0d4-680d-4e25-ab5d-8791459a1c19.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The clients you add will be displayed on the Clients page of your dashboard. From there, you can easily manage and update their information as needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C2ZMG_Bz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678790450787/422b17fc-d77b-42ae-820a-0340bf278450.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C2ZMG_Bz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678790450787/422b17fc-d77b-42ae-820a-0340bf278450.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Create an Invoice
&lt;/h3&gt;

&lt;p&gt;Once you have updated your profile, added a payment method, and created a client's record, you are ready to start creating invoices for them.&lt;/p&gt;

&lt;p&gt;To navigate to the page where you can create a new invoice, simply click on the "Create Invoice" option located in the sidebar, or click on the "+ New Invoice" button on your dashboard. This will take you to the new invoice page where you can start creating a new invoice for your clients.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BGBwnOa1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678791153199/3620833c-3925-4f88-ae80-836c921a2897.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BGBwnOa1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678791153199/3620833c-3925-4f88-ae80-836c921a2897.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the invoice page, your profile logo will automatically appear as the default logo on the invoice form. However, you can also choose to update the logo for a specific invoice.&lt;/p&gt;

&lt;p&gt;To get started, simply select the client you want to create the invoice for, followed by the invoice date and due date. Then, choose a payment method from the ones you've previously created in your settings, and fill out the items and amounts for the invoice as demonstrated below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Etpum2Dn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678790969857/719df5ef-bbb2-4e68-986e-455e9e44d5e4.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Etpum2Dn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678790969857/719df5ef-bbb2-4e68-986e-455e9e44d5e4.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the "Generate Invoice" button once you're done and wait for the invoice to be generated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DKxbryOb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678792054675/c4fd5e0b-0a31-4d9c-a132-c137a5aa55af.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DKxbryOb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678792054675/c4fd5e0b-0a31-4d9c-a132-c137a5aa55af.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After successfully generating the invoice, you will be directed to the Invoice page, where you can view, manage, and download the invoice as needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kc3-t9rb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678792314586/75369523-4724-4fba-890f-c64790fc8139.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kc3-t9rb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678792314586/75369523-4724-4fba-890f-c64790fc8139.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Managing Invoice
&lt;/h3&gt;

&lt;p&gt;The invoices you create will be displayed on the Invoices page, as illustrated below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RQb5G-sE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678802497544/29ea377d-e232-46d2-b468-4eebbb65be45.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RQb5G-sE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678802497544/29ea377d-e232-46d2-b468-4eebbb65be45.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To manage an invoice, simply click on the ellipsis icon located in front of the respective invoice on the Invoices page. From there, you can download the invoice, delete it, or update its status according to your needs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o5IyXXeu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678802610874/534150ec-413b-4ddb-9884-6e8967e8ff0b.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o5IyXXeu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678802610874/534150ec-413b-4ddb-9884-6e8967e8ff0b.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dashboard Widgets
&lt;/h2&gt;

&lt;p&gt;The widgets on your dashboard provide valuable insights into your invoice statistics. They display information ranging from pending payments and total paid invoices to the amount earned for each currency, as well as your ten most recent invoices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gc_Ap6v7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678804244945/292495f6-6396-4eb6-8179-d9e7c1214518.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gc_Ap6v7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678804244945/292495f6-6396-4eb6-8179-d9e7c1214518.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These components help you stay on top of your invoicing activities and give you a quick snapshot of your business finances.&lt;/p&gt;

&lt;h3&gt;
  
  
  Total Invoice Widget
&lt;/h3&gt;

&lt;p&gt;The "Total Invoice" widget provides a quick overview of the total number of invoices you've created since you first created your InvoiceEase account. This count excludes any invoices that have been deleted.&lt;/p&gt;

&lt;p&gt;This widget displays the total number of invoices you've created since you created your account excluding deleted invoices.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Uk9Jol8J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678804111895/c1a3a2d9-1021-4b51-bf50-fef8ab570f62.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Uk9Jol8J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678804111895/c1a3a2d9-1021-4b51-bf50-fef8ab570f62.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Awaiting Payments Widget
&lt;/h3&gt;

&lt;p&gt;The "Awaiting Payments" widget on your dashboard displays the number of invoices that are currently awaiting payment, with the client name of the most recently created invoice displayed at the top.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DSZK21Dx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678804032306/8c7dd275-e057-43b8-ad7d-63a0874b1fe2.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DSZK21Dx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678804032306/8c7dd275-e057-43b8-ad7d-63a0874b1fe2.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Total Paid Invoice in Currency Widget
&lt;/h3&gt;

&lt;p&gt;The "Total Paid Invoice in Currency" widget provides an overview of the total amount earned across all invoices in a specific currency. It helps you keep track of your earnings and provides valuable insights into the currencies in which you conduct business.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xEqnSSyz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678803880798/9ecfc46f-b595-417c-ae9e-fc53f930d39d.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xEqnSSyz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678803880798/9ecfc46f-b595-417c-ae9e-fc53f930d39d.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Recent Invoices Widget
&lt;/h3&gt;

&lt;p&gt;The "Recent Invoices" widget on your dashboard displays the ten most recent invoices you've created, with the latest invoice appearing at the top.&lt;/p&gt;

&lt;p&gt;This widget allows you to quickly access and manage your recent invoices by clicking on the ellipsis icon next to each invoice. From there, you can download, delete, or update the status of the invoice as needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eYzpWHZE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678804425074/ef6d61b7-3b0a-4d16-bbe1-4f54b691226e.png%2520align%3D%2522center%2522" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eYzpWHZE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678804425074/ef6d61b7-3b0a-4d16-bbe1-4f54b691226e.png%2520align%3D%2522center%2522" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;In conclusion, InvoiceEase is an invoicing tool designed to simplify and streamline the invoicing process for freelancers and small businesses. It provides an intuitive and easy-to-use platform, helping users create and manage invoices more efficiently with a range of features such as easy profile management, client management, and invoice management.&lt;/p&gt;

&lt;p&gt;The tool also offers an onboarding wizard to guide users through the initial setup process, and dashboard widgets that provide valuable insights into invoice statistics. Overall, InvoiceEase aims to make invoicing a hassle-free experience for freelancers and small businesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  We Want to Hear Your Thoughts
&lt;/h2&gt;

&lt;p&gt;We would greatly appreciate your thoughts and feedback on &lt;a href="https://invoice-ease.vercel.app/"&gt;InvoiceEase&lt;/a&gt;. Whether it's about our site or product, we value your opinion and would love to hear from you.&lt;/p&gt;

&lt;p&gt;You can leave a comment here or send me a direct message on Twitter (&lt;a href="https://twitter.com/unclebigbay143"&gt;@unclebigbay143&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Thank you for taking the time to check out our launch. If you enjoyed our product, we would be grateful if you could share your feedback and give us an upvote on ProductHunt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/invoiceease?utm_source=badge-featured&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-invoiceease"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2esePDXJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://api.producthunt.com/widgets/embed-image/v1/featured.svg%3Fpost_id%3D385101%26theme%3Dlight%2520align%3D%2522left%2522" alt="InvoiceEase - Streamline your financial processes with InvoiceEase | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We hope to continue improving &lt;a href="https://invoice-ease.vercel.app/"&gt;InvoiceEase&lt;/a&gt; and providing a better invoicing experience for freelancers and small businesses alike.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Add Horizontal Lines Before and After a Text in HTML</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Mon, 28 Feb 2022 12:58:32 +0000</pubDate>
      <link>https://dev.to/unclebigbay/how-to-add-horizontal-lines-before-and-after-a-text-in-html-5e6h</link>
      <guid>https://dev.to/unclebigbay/how-to-add-horizontal-lines-before-and-after-a-text-in-html-5e6h</guid>
      <description>&lt;p&gt;This article will guide you on how to add a horizontal line to the right and left side of a text as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmr8ffkguxc0ys8973kab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmr8ffkguxc0ys8973kab.png" alt="HTML text with lines right and left" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;if(busy){ &lt;/p&gt;

&lt;p&gt;Jump to complete code!&lt;/p&gt;

&lt;p&gt;} else {&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create an HTML text tag.
&lt;/h2&gt;

&lt;p&gt;In your HTML file create an &lt;code&gt;h2&lt;/code&gt; tag and give it a class name of &lt;code&gt;hr-lines&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h2 class="hr-lines"&amp;gt;PEACE&amp;lt;/h2&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Adding the Left Line
&lt;/h2&gt;

&lt;p&gt;We'll make use of the CSS &lt;code&gt;:before&lt;/code&gt; pseudo-element to add a line to the left side of the text. Apply the code below to your CSS file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.hr-lines:before{
  content:" ";
  display: block;
  height: 2px;
  width: 130px;
  position: absolute;
  top: 50%;
  left: 0;
  background: red;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the above code, we're creating a new element with a height of &lt;code&gt;2px&lt;/code&gt; and width of &lt;code&gt;130px&lt;/code&gt; before the &lt;code&gt;hr-lines&lt;/code&gt; element using the content property, then giving it an absolute position in order to move it around, we set the top to &lt;code&gt;50%&lt;/code&gt; to make it align with the text at the middle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbszmg5hb1yunlx6wgi3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbszmg5hb1yunlx6wgi3.png" alt="creating a text with left and right lines" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Set the &lt;code&gt;hr-lines&lt;/code&gt; to relative
&lt;/h2&gt;

&lt;p&gt;For the pseudo-elements to be applied to the target element, we must set the position of the element to a relative, this will make all the movement of the &lt;code&gt;:before&lt;/code&gt; and &lt;code&gt;:after&lt;/code&gt; be relative to the parent (text).&lt;/p&gt;

&lt;p&gt;Add the following lines to your CSS files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.hr-lines{
  position: relative;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resulting output&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgz6a2d33bxuzya74vi6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgz6a2d33bxuzya74vi6m.png" alt="creating a text with left and right lines" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can fix this by setting the &lt;code&gt;max-width&lt;/code&gt; and adding &lt;code&gt;margin&lt;/code&gt; to the element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.hr-lines{
  position: relative;
  /*  new lines  */
  max-width: 500px;
  margin: 100px auto;
  text-align: center;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo839fx3nezd9pcojq7j4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo839fx3nezd9pcojq7j4.png" alt="how to create a text with horizontal lines" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're setting the &lt;code&gt;:before&lt;/code&gt; to the left side of the text by setting the &lt;code&gt;left:0&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Adding the Right Line
&lt;/h2&gt;

&lt;p&gt;We'll make use of the &lt;code&gt;:after&lt;/code&gt; pseudo-element to add the right line.&lt;/p&gt;

&lt;p&gt;Add the following lines of code to your CSS file to add the right line to the text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.hr-lines:after{
  content:" ";
  height: 2px;
  width: 130px;
  background: red;
  display: block;
  position: absolute;
  top: 50%;
  right: 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We're setting the &lt;code&gt;:after&lt;/code&gt; to the right side of the text by setting the &lt;code&gt;right:0&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Output:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmr8ffkguxc0ys8973kab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmr8ffkguxc0ys8973kab.png" alt="HTML text with lines right and left" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;


&lt;h2 id="complete-code"&gt; The Complete Code &lt;/h2&gt;

&lt;p&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;h2 class="hr-lines"&amp;gt; PEACE &amp;lt;/h2&amp;gt;

&amp;lt;section&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;p&amp;gt;I wish for peace in Russia &amp;amp; Ukraine&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;index.css&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.hr-lines{
  position: relative;
  max-width: 500px;
  margin: 100px auto;
  text-align: center;
}

.hr-lines:before{
  content:" ";
  height: 2px;
  width: 130px;
  background: red;
  display: block;
  position: absolute;
  top: 50%;
  left: 0;
}

.hr-lines:after{
  content:" ";
  height: 2px;
  width: 130px;
  background: red;
  display: block;
  position: absolute;
  top: 50%;
  right: 0;
}

p{
  text-transform: uppercase;
  color: red;
}

section{
  display: flex;
  justify-content: center;
  align-items:center;
  gap: 1rem;

}

div{
  width: 500px;
    border: 1px solid #ccc;
  padding: 10px;
  height: 100px;
  display: flex;
  justify-content: center;
  align-items: center;
  line-height: 1.4;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;I hope that this article will assist you in creating a text with horizontal right and left lines at some point in the future.&lt;/p&gt;




&lt;p&gt;Wow, what a journey, I am glad you made it to the end of this article, if you enjoyed and learned something new from this article, I will like to connect with you.&lt;/p&gt;

&lt;p&gt;Let's connect on&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href="https://twitter.com/intent/follow?screen_name=unclebigbay143" rel="noopener noreferrer"&gt;Twitter @unclebigbay143&lt;/a&gt; &lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.linkedin.com/in/unclebigbay/" rel="noopener noreferrer"&gt;LinkedIn @unclebigbay&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;See you in the next article. Bye Bye 🙋‍♂️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdl630ryapopr44c65c0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdl630ryapopr44c65c0.png" alt="unclebigbay's blog" width="432" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to build a Flash Title Notification with JavaScript</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Sat, 05 Feb 2022 07:49:52 +0000</pubDate>
      <link>https://dev.to/unclebigbay/how-to-build-a-flash-title-notification-with-javascript-14mi</link>
      <guid>https://dev.to/unclebigbay/how-to-build-a-flash-title-notification-with-javascript-14mi</guid>
      <description>&lt;p&gt;The user's attention is important. How do you call the attention of a user who is on another tab to your website?&lt;/p&gt;

&lt;p&gt;In this article, you will learn how to implement a flash title using LinkedIn sample that looks like this 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uapc9x0X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640170211063/L5fFIZruTn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uapc9x0X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640170211063/L5fFIZruTn.gif" alt="ezgif.com-gif-maker (2).gif" width="800" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When a user is on another tab, flash titles are useful for drawing their attention to the website as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PwfHMPdW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640170513166/-gja67tjJ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PwfHMPdW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640170513166/-gja67tjJ.png" alt="image.png" width="880" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have probably seen a flash title on Facebook and some other websites when you have a new notification on their website.&lt;/p&gt;

&lt;p&gt;So, let's get started with building your own flash title.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YNJitqEH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640171080528/7XAjnTX43.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YNJitqEH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640171080528/7XAjnTX43.webp" alt="giphy.webp" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;This article is in two parts, the HTML part, and the JavaScript part&lt;/p&gt;
&lt;h2&gt;
  
  
  1. The HTML Part
&lt;/h2&gt;

&lt;p&gt;Create a new &lt;code&gt;index.html&lt;/code&gt; and add the HTML5 boilerplate that I've created below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

    &amp;lt;!-- SCRIPT --&amp;gt;
    &amp;lt;script src="index.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;A version with LinkedIn Favicon&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;title&amp;gt;LinkedIn&amp;lt;/title&amp;gt;
    &amp;lt;link rel="shortcut icon" href="https://static-exp1.licdn.com/sc/h/al2o9zrvru7aqj8e1x2rzsrca" id="favicon-ico"&amp;gt;
    &amp;lt;link rel="apple-touch-icon" href="https://static-exp1.licdn.com/sc/h/2if24wp7oqlodqdlgei1n1520"&amp;gt;
    &amp;lt;link rel="apple-touch-icon-precomposed" href="https://static-exp1.licdn.com/sc/h/eahiplrwoq61f4uan012ia17i"&amp;gt;
    &amp;lt;link rel="apple-touch-icon-precomposed" href="https://static-exp1.licdn.com/sc/h/2if24wp7oqlodqdlgei1n1520"
        sizes="57x57"&amp;gt;
    &amp;lt;link rel="apple-touch-icon-precomposed" href="https://static-exp1.licdn.com/sc/h/eahiplrwoq61f4uan012ia17i"
        sizes="144x144"&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;

    &amp;lt;script src="index.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Ensure to add a title tag to your script, because it is where the flashing notifications will be implemented.&lt;/p&gt;



&lt;h2&gt;
  
  
  2. The JavaScript part
&lt;/h2&gt;

&lt;p&gt;Create an &lt;code&gt;index.js&lt;/code&gt; or &lt;code&gt;whateverfilename.js&lt;/code&gt; that you want. We will create a function that will change the title tag and toggle between the current page title and the new notification messages that you want to toast to the user.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We will be making use of the &lt;code&gt;document.title&lt;/code&gt; to have access to the title tag text in the HTML document.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code below will change the title of the page to the assigned string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;document.title = '1 new notification';

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

&lt;/div&gt;



&lt;p&gt;The output of the above code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bx3Aq3wX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640171837935/Cd1iADg9W.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bx3Aq3wX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640171837935/Cd1iADg9W.png" alt="image.png" width="880" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's move on!&lt;/p&gt;



&lt;h2&gt;
  
  
  The Flash Title Function
&lt;/h2&gt;

&lt;p&gt;Create a &lt;code&gt;flashTitle&lt;/code&gt; function. The function will accept two parameters, the &lt;code&gt;pageTitle&lt;/code&gt; and the &lt;code&gt;newTitle&lt;/code&gt;, then we will check if the current page title is the same as the &lt;code&gt;pageTitle&lt;/code&gt; parameter, if they are the same, then we want to set the current page title to the &lt;code&gt;newTitle&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;But if the current page title is not the same as the &lt;code&gt;pageTitle&lt;/code&gt; parameter, then we want to display the &lt;code&gt;pageTitle&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The code below is the translation of the explanation given above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function flashTitle(pageTitle, newTitle) {
  if (document.title == pageTitle) {
    document.title = newTitle;
  } else {
    document.title = pageTitle;
  }
}

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Calling the &lt;code&gt;flashTitle&lt;/code&gt; function at this point will only display the &lt;code&gt;pageTitle&lt;/code&gt; parameter, you will need the toggle effect.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h2&gt;
  
  
  The Toggle Effect
&lt;/h2&gt;

&lt;p&gt;The toggle effect adds the continuous swap of the page title and the new notification message, the toggle effect will be implemented using the &lt;code&gt;setInterval()&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;setInterval()&lt;/code&gt; method is used to call a function continuously at a specified time (in milliseconds), and its syntax is shown below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setInterval(functionNameWithoutBracket, NumberOfIntervalInMiliseconds);

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

&lt;/div&gt;



&lt;p&gt;We can call the &lt;code&gt;flashTitle&lt;/code&gt; function to run at an interval of 1500 milliseconds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setInterval("flashTitle('LinkedIn', '(18) New Feeds | LinkedIn')", 1500);

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The double quotation is required because we are passing arguments to the &lt;code&gt;flashTitle&lt;/code&gt; function, and setInterval does not require a parenthesis for a callback function&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h2&gt;
  
  
  The Flash Title
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uapc9x0X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640170211063/L5fFIZruTn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uapc9x0X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640170211063/L5fFIZruTn.gif" alt="ezgif.com-gif-maker (2).gif" width="800" height="46"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  The JavaScript Complete Code
&lt;/h2&gt;

&lt;p&gt;Below is the complete code snippet for the flash title JavaScript part.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function flashTitle(pageTitle, newTitle) {
  if (document.title == pageTitle) {
    document.title = newTitle;
  } else {
    document.title = pageTitle;
  }
}

setInterval("flashTitle('LinkedIn', '(18) New Feeds | LinkedIn')", 1500);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  Using Ternary Operator
&lt;/h2&gt;

&lt;p&gt;We can replace the if statements with the ternary operator as well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function flashTitle(pageTitle, newTitle) {
  document.title == pageTitle
    ? (document.title = newTitle)
    : (document.title = pageTitle);
}

setInterval("flashTitle('LinkedIn', '(18) New Feeds | LinkedIn')", 1500);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Kudos, you have successfully learned how to implement a flash title to a web application using JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--No7avsT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640174554881/E4RiKeuIi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--No7avsT2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1640174554881/E4RiKeuIi.gif" alt="Kudos, you have successfully learned how to implement a flash title to a web application using JavaScript." width="498" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Flash titles are very useful to alert the user of their new notifications when they are away on another website, and in this article, we have learned how to implement a flash title notification using JavaScript.&lt;/p&gt;




&lt;p&gt;Wow, what a journey, I am glad you made it to the end of this article, if you enjoyed and learned something new from this article, I will like to connect with you.&lt;/p&gt;

&lt;p&gt;Let's connect on&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href="https://twitter.com/intent/follow?screen_name=unclebigbay143"&gt;Twitter @unclebigbay143&lt;/a&gt; &lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.linkedin.com/in/unclebigbay/"&gt;LinkedIn @unclebigbay&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;See you in the next article. Bye Bye 🙋‍♂️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---96uVdrc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1622627809083/3i7ThmW-M.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---96uVdrc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1622627809083/3i7ThmW-M.png" alt="image.png" width="432" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you found my content helpful and want to support my blog, you can also &lt;a href="https://www.buymeacoffee.com/unclebigbay"&gt;buy me a coffee below&lt;/a&gt;, my blog lives on coffee 🙏.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Automate your GitHub pull requests with a PR Questionnaire Template</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Thu, 06 Jan 2022 10:17:57 +0000</pubDate>
      <link>https://dev.to/unclebigbay/automate-your-github-pull-requests-with-a-pr-questionnaire-template-2l3h</link>
      <guid>https://dev.to/unclebigbay/automate-your-github-pull-requests-with-a-pr-questionnaire-template-2l3h</guid>
      <description>&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640341418722%2FvRDb0elqB.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640341418722%2FvRDb0elqB.gif" alt="Merry Christmas from unclebigbay"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pull request is a means of submitting contributions to fix a bug or add a new feature to a publicly accessible project or a private project you've been granted write access to.&lt;/p&gt;

&lt;p&gt;A good pull request should answer what the pull request does, why the pull request is needed, and how the pull request can be tested.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1639496763652%2FcaWlqe1pJ.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1639496763652%2FcaWlqe1pJ.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pull request is the summary of the 1 liner or 200k lines of code you're adding to the repository, this summary will enable the maintainer to understand what changes you're making, why you're making the change, and what approach you're taking to make the changes.&lt;/p&gt;

&lt;p&gt;As a contributor, you should always have in mind that your pull request must answer the &lt;strong&gt;WHAT&lt;/strong&gt;, &lt;strong&gt;WHY&lt;/strong&gt;, and &lt;strong&gt;HOW&lt;/strong&gt; of the changes you are requesting to be added to the project.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1639496708704%2FGNKC9xekO.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1639496708704%2FGNKC9xekO.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But how do you do that?&lt;/p&gt;

&lt;p&gt;In this guide, you will learn how to set up a &lt;strong&gt;Pull Request Questionnaire Template&lt;/strong&gt; that will help you and your team have a standard and uniform pull request throughout your project.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This questionnaire will pop up for each of the new pull requests that are being opened on the repository&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h3&gt;
  
  
  Step 1:
&lt;/h3&gt;

&lt;p&gt;🔵 Create a &lt;code&gt;pull_request_template.md&lt;/code&gt; file&lt;/p&gt;

&lt;p&gt;You can create a &lt;code&gt;pull_request_template.md&lt;/code&gt; file directly on GitHub or on your local branch.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1639503827354%2FzPhJmQY7G.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1639503827354%2FzPhJmQY7G.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  Step 2:
&lt;/h3&gt;

&lt;p&gt;🔵 Create your pull request questionnaire template.&lt;/p&gt;

&lt;p&gt;These are questions you will like the contributors to answer for each pull request.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1639504165387%2F4Z9ftv2-SD.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1639504165387%2F4Z9ftv2-SD.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can edit the markdown sample below to suit your project preference.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# What does this PR do?

xxx

# Why this PR?

xxx

# How did you get it done?

xxx

# Screenshots (if appropriate)

xxx

# How can this be tested?

xxx


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

&lt;/div&gt;



&lt;p&gt;Click on the commit changes when you're done.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1639504708775%2Fuij5kEON1.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1639504708775%2Fuij5kEON1.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Congratulations!!! you have successfully added a pull request questionnaire for every pull request on your project repository.&lt;/p&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You have learned from this article how to create a pull request questionnaire template for your GitHub repositories.&lt;/p&gt;




&lt;p&gt;Wow, what a journey, I am glad you made it to the end of this article, if you enjoyed and learned something new from this article, I will like to connect with you.&lt;/p&gt;

&lt;p&gt;Let's connect on&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href="https://twitter.com/intent/follow?screen_name=unclebigbay143" rel="noopener noreferrer"&gt;Twitter @unclebigbay143&lt;/a&gt; &lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.linkedin.com/in/unclebigbay/" rel="noopener noreferrer"&gt;LinkedIn @unclebigbay&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;See you in the next article. Bye Bye 🙋‍♂️&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1622627809083%2F3i7ThmW-M.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1622627809083%2F3i7ThmW-M.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>versioncontrol</category>
    </item>
    <item>
      <title>Turning My 2021 Hashnode Tech Awards into NFTS - A walkthrough of how I did it</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Mon, 03 Jan 2022 09:05:42 +0000</pubDate>
      <link>https://dev.to/unclebigbay/turning-my-2021-hashnode-tech-awards-into-nfts-a-walkthrough-of-how-i-did-it-4p6</link>
      <guid>https://dev.to/unclebigbay/turning-my-2021-hashnode-tech-awards-into-nfts-a-walkthrough-of-how-i-did-it-4p6</guid>
      <description>&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640341418722%2FvRDb0elqB.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640341418722%2FvRDb0elqB.gif" alt="Merry Christmas from unclebigbay"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, After reading  &lt;a href="https://web3.hashnode.com/how-to-mint-an-nft-a-step-by-step-guide-to-creating-your-first-nft?utm_campaign=The%20Oversimplified%20Newsletter&amp;amp;utm_medium=email&amp;amp;utm_source=Revue%20newsletter" rel="noopener noreferrer"&gt;How To Mint an NFT - A Step-by-Step Guide To Creating Your First NFT&lt;/a&gt; by @&lt;a href="https://dev.to@heyOnuoha"&gt;Favor Onuoha&lt;/a&gt;, I decided to Mint my  &lt;a href="https://unclebigbay.com/badges" rel="noopener noreferrer"&gt;Hashnode award badges&lt;/a&gt; as my first NFT and I will be showing you how I did it.&lt;/p&gt;

&lt;p&gt;I don't know if that's actually a good idea, but who cares, that's what I feel like minting.&lt;/p&gt;

&lt;p&gt;Minting simply means to create something new on the blockchain, so in this article, you will experience how I created my first ever NFT on the blockchain.&lt;/p&gt;

&lt;p&gt;Let's get started.&lt;/p&gt;

&lt;p&gt;I will be making use of &lt;a href="https://metamask.io/" rel="noopener noreferrer"&gt;metamask&lt;/a&gt; and &lt;a href="https://opensea.io/" rel="noopener noreferrer"&gt;opensea&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Metamask
&lt;/h3&gt;

&lt;p&gt;balance/authentication/authorization&lt;/p&gt;

&lt;p&gt;In case you are hearing about MetaMask for the first time, MetaMask is basically a cryptocurrency wallet holder that allows you to interact with your Ethereum blockchain wallet account and can be used to connect to other blockchain applications.&lt;/p&gt;

&lt;p&gt;Meta mask is available for iOS/Android devices and browser extensions, click &lt;a href="https://metamask.io/download.html" rel="noopener noreferrer"&gt;here&lt;/a&gt; to get yours up and running.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep your security phrase and password safe like your life depends on it, there's no reset phrase (password) like web2.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What is OpenSea
&lt;/h3&gt;

&lt;p&gt;OpenSea is an online marketplace for non-fungible tokens (NFTs). It was founded by  &lt;a href="https://www.google.com/search?q=Devin+Finzer&amp;amp;rlz=1C1ASVC_enNG928NG928&amp;amp;oq=Devin+Finzer&amp;amp;aqs=chrome..69i57.354j0j9&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8" rel="noopener noreferrer"&gt;Devin Finzer&lt;/a&gt;  and  &lt;a href="https://www.google.com/search?q=Alex+Atallah&amp;amp;rlz=1C1ASVC_enNG928NG928&amp;amp;oq=Alex+Atallah&amp;amp;aqs=chrome..69i57.290j0j9&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8" rel="noopener noreferrer"&gt;Alex Atallah&lt;/a&gt; in New York on December 20, 2017.&lt;/p&gt;

&lt;p&gt;OpenSea has been around for a very long time, thanks to the Web3 and NFTs popularity explosion, we get to know about it now.&lt;/p&gt;

&lt;p&gt;It is where buying and selling of NFTs take place, this is the Alibaba of web3, you can upload your images, music, documents, and any other thing you wish to mint on the blockchain.&lt;/p&gt;

&lt;p&gt;Super happy to be minting my badges there, maybe someone will actually buy them, but I am not selling 🤪&lt;/p&gt;



&lt;h1&gt;
  
  
  Setting up OpenSea Account
&lt;/h1&gt;

&lt;p&gt;I head to &lt;a href="https://opensea.io/" rel="noopener noreferrer"&gt;opensea.io&lt;/a&gt; and click on the create button.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640253617844%2F5FEYBlA1n.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640253617844%2F5FEYBlA1n.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are several wallet options to connect with, but MetaMask is the most popular and that's what I already installed.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640254036738%2F7jYRYm__4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640254036738%2F7jYRYm__4.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The MetaMask browser extension pops up immediately after selecting the MetaMask provider option.&lt;/p&gt;

&lt;p&gt;Click on the Next button.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640254375322%2FVrC-ChBzku.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640254375322%2FVrC-ChBzku.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can be authenticated on the OpenSea marketplace, hit the connect button.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640254441051%2FrYwXcUG51.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640254441051%2FrYwXcUG51.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes you will see the sign button instead.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640254859780%2FpoWwyKasq.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640254859780%2FpoWwyKasq.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that's it, I'm in, we're in the OpenSea market.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640255279419%2FHf7q0Fduou.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640255279419%2FHf7q0Fduou.gif" alt="giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is my OpenSea dashboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640254524908%2FkgXNUvQyW.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640254524908%2FkgXNUvQyW.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But I'm &lt;strong&gt;unclebigbay&lt;/strong&gt; and not unnamed, it makes sense because my blockchain wallet doesn't carry a &lt;strong&gt;username&lt;/strong&gt; in my profile object for OpenSea to retrieve from, web3 only cares about my wallet address.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640255656410%2F2njVH8ge5.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640255656410%2F2njVH8ge5.gif" alt="2718b1a856037aa99a1a552efcacd05c.498x280x55.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hover on the user profile avatar on the navbar and select the setting link to update your profile on OpenSea.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640255777075%2FjLgDNZRAi.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640255777075%2FjLgDNZRAi.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fill in your profile details and hit the save button.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640255911529%2FAncFKBu0d.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640255911529%2FAncFKBu0d.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Profile updated.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640255985988%2FlSHOXIHEh.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640255985988%2FlSHOXIHEh.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h1&gt;
  
  
  Minting My Badges
&lt;/h1&gt;

&lt;p&gt;The business of the day, which is to mint my hashnode badges, you can check out the awards on  &lt;a href="https://cutt.ly/RUadSgr" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; if you haven't seen them yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create NFT
&lt;/h3&gt;

&lt;p&gt;Click on the create navigation link on the navbar.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640256748928%2FGx5V1D39L.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640256748928%2FGx5V1D39L.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  NFT profile
&lt;/h3&gt;

&lt;p&gt;The two required detail of the new NFT you want to mint is the document you want to upload, check the supported document first, and the name of the NFT.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640256469772%2FElHNIRhAr.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640256469772%2FElHNIRhAr.png" alt="image.png"&gt;&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640257519438%2FULAfTMocl.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640257519438%2FULAfTMocl.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I will be providing an external link to redirect to &lt;a href="https://unclebigbay.com/badges" rel="noopener noreferrer"&gt;my hashnode badge page&lt;/a&gt; and a short description of the awards.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640256598667%2FOUx4vSaMD.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640256598667%2FOUx4vSaMD.png" alt="image.png"&gt;&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640257592469%2FZL68CZEMWr.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640257592469%2FZL68CZEMWr.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I will be skipping the rest of the forms since I won't be selling my award badges 🤪.&lt;/p&gt;

&lt;p&gt;Click on the &lt;strong&gt;create&lt;/strong&gt; button to submit the NFT.&lt;/p&gt;



&lt;h1&gt;
  
  
  Done and Dusted
&lt;/h1&gt;

&lt;p&gt;Congratulations to me and you, we just successfully minted my very own first NFT together.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640257725748%2Fxy4pb_6bE.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1640257725748%2Fxy4pb_6bE.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can view my Hashnode award NFT badges &lt;a href="https://opensea.io/assets/0x495f947276749ce646f68ac8c248420045cb7b5e/106310183318563491576001418187544893345913273967622843574122850322892848103425/" rel="noopener noreferrer"&gt;HERE&lt;/a&gt; on OpenSea Marketplace.&lt;/p&gt;



&lt;h1&gt;
  
  
  Takeaways
&lt;/h1&gt;

&lt;p&gt;Minting your awards, documents, or any asset that you own as demonstrated in this walkthrough article guarantees ownership of a unique digital asset. You can mint-supported digital assets such as JPG, PNG, GIF, SVG, MP4, WEBM, MP3, WAV, OGG, GLB, GLTF, with a max size of 100 MB on OpenSea.&lt;/p&gt;

&lt;p&gt;Sounds cool, right? You can go ahead and mint yours using the step-by-step guide in this article.&lt;/p&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;I will be minting one of my articles very soon.&lt;/p&gt;




&lt;p&gt;Wow, what a journey, I am glad you made it to the end of this article, if you enjoyed and learned something new from this article, I will like to connect with you.&lt;/p&gt;

&lt;p&gt;Let's connect on&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href="https://twitter.com/intent/follow?screen_name=unclebigbay143" rel="noopener noreferrer"&gt;Twitter @unclebigbay143&lt;/a&gt; &lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.linkedin.com/in/unclebigbay/" rel="noopener noreferrer"&gt;LinkedIn @unclebigbay&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;See you in the next article. Bye Bye 🙋‍♂️&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1622627809083%2F3i7ThmW-M.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1622627809083%2F3i7ThmW-M.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>nfts</category>
    </item>
    <item>
      <title>Introduction to JavaScript Again?</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Tue, 07 Dec 2021 10:22:56 +0000</pubDate>
      <link>https://dev.to/unclebigbay/introduction-to-javascript-again-jai</link>
      <guid>https://dev.to/unclebigbay/introduction-to-javascript-again-jai</guid>
      <description>&lt;p&gt;Hello buddy 👋 , It actually took me a while to understand what to learn first in JavaScript and how to get started, and if you're in the same shoe right now, then this article is for you.&lt;/p&gt;

&lt;p&gt;In this episode, I will be introducing you to JavaScript, what to expect and how to get started as a JavaScript developer.&lt;/p&gt;

&lt;h1&gt;
  
  
  Prerequisites
&lt;/h1&gt;

&lt;p&gt;Before you continue with this introductory article, ensure you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have a working knowledge of HTML and CSS&lt;/li&gt;
&lt;li&gt;Else check out the &lt;a href="https://unclebigbay.com/skeleton-of-html-css-and-javascript"&gt;Skeleton of HTML, CSS and JavaScript&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because you will always see &lt;strong&gt;HTML&lt;/strong&gt;, &lt;strong&gt;CSS&lt;/strong&gt;, and &lt;strong&gt;JavaScript&lt;/strong&gt;.&lt;/p&gt;



&lt;h1&gt;
  
  
  What is JavaScript
&lt;/h1&gt;

&lt;p&gt;JavaScript is basically a programming language for the web, you can see JavaScript as the official language for web development and the only programming language that allows you to build frontend applications &lt;strong&gt;(web interface)&lt;/strong&gt;, backend applications &lt;strong&gt;(server+database)&lt;/strong&gt; down to mobile applications, and machine learning.&lt;/p&gt;

&lt;p&gt;This definition only means one thing, and it's that JavaScript knowledge can be applied in multiple fields, and their application also follows the same patterns.&lt;/p&gt;



&lt;h1&gt;
  
  
  Why Learn JavaScript?
&lt;/h1&gt;

&lt;p&gt;Imagine a website showing the same profile information for every logged-in user, or a button not responding to the action it's labeled, these are properties of static web pages, and a static webpage does not interact with the user because they lack little or no JavaScript (programming).&lt;/p&gt;

&lt;p&gt;With JavaScript we can add actions to our web pages, we can define what should happen when a button is clicked or a specific action is being taken or triggered on a web application.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a Static Webpage?
&lt;/h3&gt;

&lt;p&gt;A static webpage inherently displays hardcoded contents from the HTML file that won't change based on any user actions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mxHfux7Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638816510324/aMxxBbG8M.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mxHfux7Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638816510324/aMxxBbG8M.png" alt="image.png" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The contents of the dashboard above can only be updated from the HTML document and not based on the currently logged-in user.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a Dynamic Webpage?
&lt;/h3&gt;

&lt;p&gt;A dynamic webpage interacts with the user through triggered actions and a set of conditional rules, the contents of a dynamic web page change based on events and conditions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0o9O7ZWf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638816407300/wYeLth1454.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0o9O7ZWf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638816407300/wYeLth1454.png" alt="image.png" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The username and profile image are dynamic, which means the dashboard contents change each time a new user logs in.&lt;/p&gt;



&lt;h1&gt;
  
  
  Getting started with JavaScript
&lt;/h1&gt;

&lt;p&gt;There are a few concepts you should be aware of in order to start creating interactive applications with JavaScript, these concepts are important whether you're interested in using JavaScript for frontend or backend development, mobile applications, or any other area that JavaScript can be applied.&lt;/p&gt;




&lt;p&gt;Below are a few concepts you should learn first when learning JavaScript.&lt;/p&gt;



&lt;h2&gt;
  
  
  1. Learn JavaScript Data Types
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x8UL7i3B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829576685/_v_9-EJ60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x8UL7i3B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829576685/_v_9-EJ60.png" alt="image.png" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Data types are basically the data that can be legally used in JavaScript or any specific programming language.&lt;/p&gt;

&lt;p&gt;Just as we have &lt;strong&gt;A, B, C&lt;/strong&gt; to  &lt;strong&gt;Z&lt;/strong&gt; as alphabets, and digit &lt;strong&gt;0 to 9&lt;/strong&gt; as numerics, similarly JavaScript has a name for each of its acceptable data, which includes a &lt;strong&gt;string&lt;/strong&gt;, &lt;strong&gt;number&lt;/strong&gt;, &lt;strong&gt;array&lt;/strong&gt;, &lt;strong&gt;object&lt;/strong&gt;, &lt;strong&gt;undefined&lt;/strong&gt;, &lt;strong&gt;null&lt;/strong&gt;, and &lt;strong&gt;boolean&lt;/strong&gt;, they are referred to as data types.&lt;/p&gt;

&lt;p&gt;The difference between the data types in JavaScript is their syntax, structure, and the operations you can perform with them.&lt;/p&gt;

&lt;p&gt;It is important to understand how each of these data types works in JavaScript so that you won't end up performing an addition operation on &lt;strong&gt;A, B, C&lt;/strong&gt; alphabets instead of &lt;strong&gt;0 to 9&lt;/strong&gt; numbers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Learn more about JavaScript data types on  &lt;a href="https://www.w3schools.com/js/js_datatypes.asp"&gt;w3schools&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check out &lt;a href="https://unclebigbay.com/javascript-syntax-profile"&gt;JavaScript Syntax Profile&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  2. Learn JavaScript Variables
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pNwhPw0Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829650193/WBaZ7_P27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pNwhPw0Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829650193/WBaZ7_P27.png" alt="image.png" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Variables are like containers that can hold items for later use, we use variables to store any data type in JavaScript so that we can make reference to them later in our code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A variable can only hold one data type at a time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt; Learn more from &lt;a href="https://unclebigbay.com/generations-of-javascript-variables"&gt;Generations of JavaScript Variables&lt;/a&gt; article&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;
  
  
  2.1. Variable Declaration
&lt;/h3&gt;

&lt;p&gt;Variable declaration in JavaScript is all about booking a space (allocating memory) for a data type or value that you're not ready to store yet, it's basically an act of keeping a container to keep a cube of sugar that you're yet to purchase.&lt;/p&gt;

&lt;p&gt;There are three major techniques in which variables are created in JavaScript that you need to know, these techniques determine what operation or rules you want to allow for a particular variable you're declaring. &lt;/p&gt;

&lt;p&gt;Variable keyword declaration technique includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;var&lt;/code&gt; keyword&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;const&lt;/code&gt; keyword, and&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;let&lt;/code&gt; keyword&lt;/li&gt;
&lt;/ol&gt;



&lt;h3&gt;
  
  
  2.2. Variable Initilization
&lt;/h3&gt;

&lt;p&gt;Since variable declaration is the act of keeping space for later use, then variable initialization is the process of assigning or putting the value you're keeping the space for into the declared variable, which then means our container is not empty anymore.&lt;/p&gt;

&lt;p&gt;Check out the &lt;a href="https://unclebigbay.com/generations-of-javascript-variables"&gt;Generations of JavaScript Variables&lt;/a&gt; for full explanations.&lt;/p&gt;



&lt;h2&gt;
  
  
  3. Learn JavaScript Scope
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W2L9Z4bO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829697301/Z6eUl5dNj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W2L9Z4bO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829697301/Z6eUl5dNj.png" alt="image.png" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The term Scope in JavaScript refers to the current context of code, and it determines how variables can be referenced or accessed in the code.&lt;/p&gt;

&lt;p&gt;There are 3 main types of JavaScript scopes, which includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Global scope&lt;/li&gt;
&lt;li&gt;Local scope/function scope, and&lt;/li&gt;
&lt;li&gt;Block scope&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These 3 scopes provide ways to either secure a variable from being accessed outside or within a particular scope.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can learn more about JavaScript scope from Mr. @&lt;a href="https://dev.to@atapas"&gt;Tapas Adhikary&lt;/a&gt; &lt;a href="https://blog.greenroots.info/javascript-scope-fundamentals-with-tom-and-jerry"&gt;JavaScript Scope Fundamentals with Tom and Jerry&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  4. Learn JavaScript Functions
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jL_wjHAg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829723008/c2Uk36NF_.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jL_wjHAg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829723008/c2Uk36NF_.png" alt="image.png" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JavaScript functions are like procedures, they contain a set of instructions to be executed or invoked (called) when an event is been triggered.&lt;/p&gt;

&lt;p&gt;Functions are capable of accepting inputs and generating output based on the logic in the function.&lt;/p&gt;

&lt;p&gt;There are two types of JavaScript functions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Regular function (ES5)&lt;/p&gt;

&lt;p&gt;This is the default method of writing functions in JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Arrow function (ES6)&lt;/p&gt;

&lt;p&gt;JavaScript arrow functions came with the release of ECMAScript 2015, also known as ES6, arrow function has a concise syntax and it has some unique features that make it the favorite of several Javascript developers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do not bother much about arrow functions if you're still very new to it, you will figure the difference as you code more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Learn more about the difference between &lt;a href="https://betterprogramming.pub/difference-between-regular-functions-and-arrow-functions-f65639aba256"&gt;regular functions and arrow functions&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  5. Learn JavaScript Hoisting
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nj5cGkFC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829750525/LzYdAFN58.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nj5cGkFC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829750525/LzYdAFN58.png" alt="image.png" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hoisting is the next concept to learn when you're done with learning variables scope in JavaScript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hoisting is a JavaScript mechanism where variable declarations are moved to the top of their scope before code execution.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This concept will expose you to how JavaScript handles variables in each scope before execution, JavaScript basically moves all the declared variables to the top of every scope whether global or local scope.&lt;/p&gt;

&lt;p&gt;You need to know-how &lt;strong&gt;var&lt;/strong&gt;, &lt;strong&gt;const&lt;/strong&gt;, and &lt;strong&gt;let&lt;/strong&gt; works to understand this concept better.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Here is a detailed article to help you understand &lt;a href="https://blog.vivek-sharma.com/variable-hoisting-in-javascript"&gt;Variable Hoisting in Javascript&lt;/a&gt; by @&lt;a href="https://dev.to@vivekshrma"&gt;Vivek Sharma&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  6. Learn JavaScript Closures
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n9DU9-36--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829779738/cLMX1Qi_Z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n9DU9-36--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829779738/cLMX1Qi_Z.png" alt="image.png" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The JavaScript closure is basically a function inside of another function and this gives the inner function the ability to have access to the variable in the outer function.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn about JavaScript closures  &lt;a href="https://www.w3schools.com/js/js_function_closures.asp"&gt;here&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Learn JavaScript Callback functions
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rri_fIU0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829850594/9DBhGnxUF.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rri_fIU0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829850594/9DBhGnxUF.png" alt="image.png" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A callback is any function that is being passed to another function as an argument (input) and is executed later.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn callback  &lt;a href="https://www.w3schools.com/js/js_callback.asp"&gt;here&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Learn JavaScript Array and Array Methods.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TFsR4OYr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829910546/RvfDzWrrH.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TFsR4OYr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829910546/RvfDzWrrH.png" alt="image.png" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Array is one of JavaScript's data types that you cannot do without when you're convenient with variables and have a grasp of how functions works then you can proceed to learn JavaScript Arrand its methods.&lt;/p&gt;

&lt;p&gt;An array is also a container that can hold items, but unlike a variable that only holds a single data type at a time, the array data type on the other side can store as many collections of different data types at a time.&lt;/p&gt;



&lt;h2&gt;
  
  
  9. Learn JavaScript Fetch.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zUg3lGMf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829938198/NesParFv0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zUg3lGMf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829938198/NesParFv0.png" alt="image.png" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
Chances are you will not be working with static data forever, learning JavaScript fetch will enable you to interact with backend APIs and perform some &lt;strong&gt;HTTPS&lt;/strong&gt; calls.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href="https://www.w3schools.com/js/js_api_fetch.asp"&gt;Learn JavaScript fetch&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  10. Learn JavaScript Promises and Async/Await.
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9NxWV_Tq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829975208/tN8i5wD-H.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9NxWV_Tq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1638829975208/tN8i5wD-H.png" alt="image.png" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
While working with Fetch or backend generally, you need a way to resolve failure or success calls from the backend, which might take a while to arrive.&lt;/p&gt;

&lt;p&gt;The JavaScript promises is a technique of handling asynchronous operations in JavaScript.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Check out &lt;a href="https://blog.greenroots.info/javascript-promises-explain-like-i-am-five"&gt;JavaScript Promises - Explain Like I'm Five&lt;/a&gt; by @&lt;a href="https://dev.to@atapas"&gt;Tapas Adhikary&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://blog.greenroots.info/javascript-async-and-await-in-plain-english-please"&gt;JavaScript async and await - in plain English, please&lt;/a&gt; by @&lt;a href="https://dev.to@atapas"&gt;Tapas Adhikary&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  11. Learn DOM manipulation
&lt;/h2&gt;

&lt;p&gt;The Document Object Model is used to access HTML elements in JavaScript, this concept allows us to interact with the HTML elements directly from the JavaScript code.&lt;/p&gt;

&lt;p&gt;DOM can be used to modify the text, color, background color, and other HTML element properties using JavaScript.&lt;/p&gt;

&lt;p&gt;You can learn more about DOM manipulation from  &lt;a href="https://www.w3schools.com/js/js_htmldom.asp"&gt;here&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  12. Build Projects
&lt;/h2&gt;

&lt;p&gt;The best way to know you've really understood a concept is by implementing those concepts in a project.  Ensure to apply all these concepts in a side project as your learning continues.&lt;/p&gt;

&lt;p&gt;JavaScript projects you can work on.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Todo list.&lt;/li&gt;
&lt;li&gt;Count down.&lt;/li&gt;
&lt;li&gt;Tic Tac Toe.&lt;/li&gt;
&lt;li&gt;Pong game.&lt;/li&gt;
&lt;li&gt;Vanilla JavaScript stopwatch.&lt;/li&gt;
&lt;li&gt;JavaScript clock.&lt;/li&gt;
&lt;li&gt;JavaScript calculator.&lt;/li&gt;
&lt;li&gt;A Quiz Application&lt;/li&gt;
&lt;li&gt;A Game Application&lt;/li&gt;
&lt;li&gt;Music App.&lt;/li&gt;
&lt;li&gt;File Converter.&lt;/li&gt;
&lt;li&gt;Interactive Map.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These projects will help you to make use of the JavaScript concepts that you've learned, you can proceed to build more advanced projects with JavaScript when you're convenient understanding how these applications work.&lt;/p&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;This article covers the important basics of JavaScript that are essential for you to know before proceeding to any of the JavaScript frameworks, I hope this article has helped you to know some concepts to focus on more in JavaScript.&lt;/p&gt;

&lt;p&gt;See you in the next one.&lt;/p&gt;




&lt;p&gt;Wow, what a journey, I am glad you made it to the end of this article, if you enjoyed and learned something new from this article, I will like to connect with you.&lt;/p&gt;

&lt;p&gt;Let's connect on&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href="https://twitter.com/intent/follow?screen_name=unclebigbay143"&gt;Twitter @unclebigbay143&lt;/a&gt; &lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.linkedin.com/in/unclebigbay/"&gt;LinkedIn @unclebigbay&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;See you in the next article. Bye Bye 🙋‍♂️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---96uVdrc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1622627809083/3i7ThmW-M.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---96uVdrc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1622627809083/3i7ThmW-M.png" alt="image.png" width="432" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Data Visualization with Chart.js</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Tue, 30 Nov 2021 08:21:41 +0000</pubDate>
      <link>https://dev.to/unclebigbay/data-visualization-with-chartjs-5b2l</link>
      <guid>https://dev.to/unclebigbay/data-visualization-with-chartjs-5b2l</guid>
      <description>&lt;p&gt;Hello my gorgeous friend on the internet, I have written this article specially for you to guide you on how to get started with data visualization using chart.js.&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Table Of Contents
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;What is Chart.js&lt;/li&gt;
&lt;li&gt;Getting Started with Chart.js&lt;/li&gt;
&lt;li&gt;Bar Chart&lt;/li&gt;
&lt;li&gt;Line Chart&lt;/li&gt;
&lt;li&gt;Pie Chart&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Prerequisites
&lt;/h1&gt;

&lt;p&gt;Before you continue with this tutorial article, you should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have working experience with JavaScript&lt;/li&gt;
&lt;li&gt;Know the basics of HTML attributes such as an &lt;strong&gt;id&lt;/strong&gt; and &lt;strong&gt;class&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Have a code editor (I will be using &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt; )&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;One of the most important features that a developer should be able to implement on a web application is a diagrammatic representation of data, which allows users to have a clear visual of data on a website.&lt;/p&gt;

&lt;p&gt;Whether it's financial data, page view analytics, or statistics of items, which are mostly found on the dashboard.&lt;/p&gt;

&lt;p&gt;In this tutorial article, we'll learn how to make use of *&lt;em&gt;chart.js *&lt;/em&gt; to create a visual representation of data in JavaScript.&lt;/p&gt;

&lt;h1&gt;
  
  
  Demo
&lt;/h1&gt;

&lt;p&gt;You can check out the demo of what we will be building together in this article &lt;a href="https://cutt.ly/XT7q0mL" rel="noopener noreferrer"&gt;here.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Or watch the demo video below.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1637004261612%2FlnvUD3WAw.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1637004261612%2FlnvUD3WAw.gif" alt="chart js bar chart line chart pie chart demo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Chart.JS?
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Chart.js&lt;/strong&gt; is an open source JavaScript library that is used for data visualization that supports up to eight different charts including the bar chart, line chart, area chart, pie chart, bubble chart, radar chart, polar chart, and scatter chart.&lt;/p&gt;

&lt;p&gt;For this tutorial, we will be focusing on the bar chart, line chart, and pie chart, and at the end of this article, you will learn how to implement these three charts.&lt;/p&gt;

&lt;h1&gt;
  
  
  Getting Started with Chart.js
&lt;/h1&gt;

&lt;p&gt;There are three major ways of adding &lt;strong&gt;chart.js&lt;/strong&gt; to your project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; &lt;strong&gt;Through Package Manager&lt;/strong&gt; (Highly recommended)&lt;/p&gt;

&lt;p&gt;You can install Chart.js through  &lt;a href="https://www.npmjs.com/package/chart.js" rel="noopener noreferrer"&gt;npm&lt;/a&gt;, &lt;a href="https://yarnpkg.com/package/react-chartjs-2" rel="noopener noreferrer"&gt;yarn&lt;/a&gt;, or any other package manager installer for your Node, React, Vue, Angular, or any other supporting frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;strong&gt;Through CDNJS&lt;/strong&gt; (Recommended)&lt;/p&gt;

&lt;p&gt;Another way of adding chart.js to a project is through the Content Delivery Network, which means all the built files of chart.js can be accessed directly from the &lt;a href="https://cdnjs.com/libraries/Chart.js" rel="noopener noreferrer"&gt;cdnjs&lt;/a&gt; or &lt;a href="https://www.jsdelivr.com/package/npm/chart.js?path=dist" rel="noopener noreferrer"&gt;jsDelivr&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;strong&gt;Through GitHub&lt;/strong&gt; (Less recommended)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.chartjs.org/" rel="noopener noreferrer"&gt;Chart.js&lt;/a&gt; is an open source project, which means you can download the latest version of chart.js directly from GitHub &lt;a href="https://github.com/chartjs/Chart.js" rel="noopener noreferrer"&gt;here&lt;/a&gt;, but this method requires you to fork, clone, build and test the chart.js before getting it to work on your machine, this method is way too tedious.&lt;/p&gt;

&lt;p&gt;In this tutorial, we will be making use of the &lt;a href="https://cdnjs.com/libraries/Chart.js" rel="noopener noreferrer"&gt;cdnjs&lt;/a&gt; method to add  &lt;a href="https://www.chartjs.org/" rel="noopener noreferrer"&gt;chart.js&lt;/a&gt; to our project, you can always try out other methods on your own using this &lt;a href="https://www.chartjs.org/docs/2.9.4/getting-started/installation.html" rel="noopener noreferrer"&gt;guide&lt;/a&gt;.&lt;/p&gt;



&lt;h1&gt;
  
  
  How Chart.js Works in HTML
&lt;/h1&gt;

&lt;p&gt;In this section, I will lay out how chart.js works and explain the minimum things you need to set up a chart with the chart.js library.&lt;/p&gt;

&lt;p&gt;I will break this section down into two parts; &lt;strong&gt;The HTML part&lt;/strong&gt; and &lt;strong&gt;The JavaScript part&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Html Part:
&lt;/h3&gt;

&lt;p&gt;This part involves importing the &lt;strong&gt;chart.js&lt;/strong&gt; cdn link into your html document and setting up a &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; html tag.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; html tag is used to draw graphics on a web page using JavaScript, now you understand why there are two parts to cover when working with chart.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Import chart.js cdn in your HTML document.&lt;/p&gt;

&lt;p&gt;You can get the latest version of chart.js from &lt;a href="https://cdnjs.com/libraries/Chart.js" rel="noopener noreferrer"&gt;here&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;&amp;lt;!-- Chart.js Script --&amp;gt;
&amp;lt;script src="Chart-cdn-goes-here"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Specify where you what to display the chart in your HTML document, also note that it is very important to wrap the canvas tag inside of a container, as the canvas tag needs the parent container to make the chart responsive, we will address this issue later in this guide.&lt;/p&gt;

&lt;p&gt;The canvas &lt;code&gt;id&lt;/code&gt; will be used later to make reference to the canvas element in the JavaScript part.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;section class="chart-wrapper"&amp;gt;
  &amp;lt;!-- chart canvas --&amp;gt;
  &amp;lt;canvas id="chart-name"&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;/section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The JavaScript Part
&lt;/h3&gt;

&lt;p&gt;Welcome to the JavaScript part, there are a couple of things that are common and important when working with any chart in chart.js, this includes;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The canvas reference to display the chart.&lt;/li&gt;
&lt;li&gt;The chart configuration.

&lt;ul&gt;
&lt;li&gt;The chart type.&lt;/li&gt;
&lt;li&gt;The chart labels, the horizontal labels of the chart.&lt;/li&gt;
&lt;li&gt;The chart datasets.&lt;/li&gt;
&lt;li&gt;The chart data, the vertical labels of the chart.&lt;/li&gt;
&lt;li&gt;The chart label, which is the title or name of the chart.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The chart instance, which is needed to initiate a new type of chart.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let me show you the code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 1. The canvas reference to display the chart.
const chartCanvas = document.getElementById('chart-canva').getContext('2d');

// 2. The chart configuration.
const config = {
  type: 'bar', // chart type
  data: {
    // The chart labels, the horizontal labels of the chart.
    labels: ['label-1', 'label-2', 'label-3', 'label-4', 'label-5'],

    // The chart datasets
    datasets: [
      {
        // The chart data, the horizontal labels of the chart.
        data: [67.7, 63.1, 54.7, 44.1, 40.2],

        // Chart label
        label: 'Chart Label',
      },
    ],
  },
  // Canvas are not responsive by default
  options: {
    responsive: true,
  },
};

// 3. The chart instance, which is needed to initiate a new type of chart.
const newBarChart = new Chart(chartCanvas, config);


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

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;getContext('2d')&lt;/code&gt; gives us access to the 2D drawing on the canvas HTML tag, this configuration is optional and &lt;code&gt;document.getElementById('chart-canva')&lt;/code&gt; is enough.&lt;/p&gt;

&lt;p&gt;The code above will produce the output below:&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636950822355%2FAJ1lpXJUF.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636950822355%2FAJ1lpXJUF.png" alt="Chart.js Basic setup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that's not responsive, the canvas tag is not responsive by default, and we might need a small size chart for our application, the chart.js has a configuration option named &lt;code&gt;responsive&lt;/code&gt;, which you need to set to &lt;code&gt;true&lt;/code&gt; for the chart to resize when the parent container or element resizes, this will make the chart take the width and height of its parent element.&lt;/p&gt;

&lt;p&gt;The methods below do not work 😢&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;canvas width="50vw" height="50vh"&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas style="width: 50vw; height: 50vh;"&amp;gt;&amp;lt;/canvas&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code below demonstrates how to make your charts in chart.js responsive.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&amp;lt;section class="chart-wrapper"&amp;gt;
   &amp;lt;!-- chart canvas --&amp;gt;
   &amp;lt;canvas id="chart-name"&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;/section&amp;gt;

&amp;lt;style&amp;gt;
   .chart-wrapper {
      position: relative;
      width: 50vw;

      /* align at page center*/
      margin: 0 auto;
   }
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The chart wrapper &lt;code&gt;position&lt;/code&gt; should be set to &lt;code&gt;relative&lt;/code&gt; for the chart to be responsive with the container across different sizes.&lt;/p&gt;

&lt;p&gt;Now we have a responsive bar chart.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636952849365%2FXYCSw9qup.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636952849365%2FXYCSw9qup.png" alt="A responsive bar chart in chart.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So far, working with chart.js is not as difficult as it seems, right? All you need to get started with any type of chart are what has been demonstrated above, you can go ahead and change the type of chart to &lt;code&gt;line&lt;/code&gt;, &lt;code&gt;pie&lt;/code&gt;, or any other type of &lt;code&gt;chart&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And you should have the corresponding charts displayed on your screen.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636953369020%2FKmTIn17jl.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636953369020%2FKmTIn17jl.png" alt="a bar chart, line chart and pie chart in chart.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The chart label will be undefined if the label is not set as shown below.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636953824660%2Fk75J31qet.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636953824660%2Fk75J31qet.png" alt="a bar chart with the undefined label"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Down to this point, we have learned the concepts to build any type of chart using chart.js and with these concepts at your reach, you will be able to handle any chart in &lt;strong&gt;chart.js&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the next section, we'll use a real-world use case of charts to visualize data and also add styles to our not-so-cute charts.&lt;/p&gt;



&lt;h1&gt;
  
  
  Task
&lt;/h1&gt;

&lt;p&gt;Let's apply what we've learned to a real-world scenario: Our task is to display the most popular technologies from the &lt;a href="https://insights.stackoverflow.com/survey/2020#most-popular-technologies" rel="noopener noreferrer"&gt;2020 Stack Overflow Developer Survey&lt;/a&gt; results using a Bar Chart, Line Chart, and Pie Chart.&lt;/p&gt;

&lt;p&gt;Result of the Most Popular Technologies Survey.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Vote Percentage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JAVASCRIPT&lt;/td&gt;
&lt;td&gt;67.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML/CSS&lt;/td&gt;
&lt;td&gt;63.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL&lt;/td&gt;
&lt;td&gt;54.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PYTHON&lt;/td&gt;
&lt;td&gt;44.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JAVA&lt;/td&gt;
&lt;td&gt;40.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We won't go into detail about the CSS part of the solution because this tutorial is focused on building charts with the chart.js JavaScript library. &lt;/p&gt;

&lt;p&gt;Copy and paste the HTML and CSS code below as a starter kit, most CSS styles are just to make our page look more attractive.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
    &amp;lt;link rel="stylesheet" href="./chart.css"&amp;gt;
    &amp;lt;title&amp;gt;Getting Started with chart.js&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;

    &amp;lt;!-- HEADER SECTION --&amp;gt;
    &amp;lt;header&amp;gt;
        &amp;lt;!-- NAVBAR SECTION --&amp;gt;
        &amp;lt;nav&amp;gt;
            &amp;lt;a href="" class="nav-links read-guide"&amp;gt;Read Guide&amp;lt;/a&amp;gt;
            &amp;lt;div class="nav-right"&amp;gt;
                &amp;lt;a href="#bar-chart" class="nav-links"&amp;gt;Bar Chart&amp;lt;/a&amp;gt;
                &amp;lt;a href="#line-chart" class="nav-links"&amp;gt;Line Chart&amp;lt;/a&amp;gt;
                &amp;lt;a href="#pie-chart" class="nav-links"&amp;gt;Pie Chart&amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/nav&amp;gt;
        &amp;lt;!-- HERO SECTION --&amp;gt;
        &amp;lt;section class="hero"&amp;gt;
            &amp;lt;h1 class="hero-text"&amp;gt;Getting Started with Chart.js &amp;lt;br /&amp;gt; (DEMO)&amp;lt;/h1&amp;gt;
        &amp;lt;/section&amp;gt;
    &amp;lt;/header&amp;gt;

    &amp;lt;main&amp;gt;
        &amp;lt;!-- Charts goes in here --&amp;gt;
    &amp;lt;/main&amp;gt;

    &amp;lt;footer&amp;gt;
        &amp;lt;h2&amp;gt;Design with 🧡 by &amp;lt;span&amp;gt;UNCLEBIGBAY&amp;lt;/span&amp;gt;&amp;lt;/h2&amp;gt;
    &amp;lt;/footer&amp;gt;


    &amp;lt;!-- Chart.js Script --&amp;gt;
    &amp;lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.0/chart.min.js"
        integrity="sha512-GMGzUEevhWh8Tc/njS0bDpwgxdCJLQBWG3Z2Ct+JGOpVnEmjvNx6ts4v6A2XJf1HOrtOsfhv3hBKpK9kE5z8AQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer"&amp;gt;&amp;lt;/script&amp;gt;

    &amp;lt;!-- Bar Chart Script --&amp;gt;
    &amp;lt;script src="./bar-chart.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;!-- Line Chart Script --&amp;gt;
    &amp;lt;script src="./line-chart.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;!-- Pie Chart Script --&amp;gt;
    &amp;lt;script src="./pie-chart.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the following files: &lt;code&gt;chart.css&lt;/code&gt;, &lt;code&gt;bar-chart.js&lt;/code&gt;, &lt;code&gt;line-chart.js&lt;/code&gt;, and &lt;code&gt;pie-chart.js&lt;/code&gt;, we will be writing our code in them very soon.&lt;/p&gt;

&lt;p&gt;Open your &lt;code&gt;chart.css&lt;/code&gt; file and put the CSS code below inside.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@import url('https://fonts.googleapis.com/css2?family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&amp;amp;display=swap');

* {
  margin: 0;
  box-sizing: border-box;
}

:root {
  --primary-color: #0b0d60;
  --app-white: #ffffff;
  --bar-chart-bg: #3a0ca3;
  --line-chart-bg: #560bad;
  --pie-chart-bg: #7209b7;
}

html {
  scroll-behavior: smooth;
}

body {
  line-height: 1.3;
  font-family: 'Ubuntu';
  background-color: var(--pie-chart-bg);
}

header {
  padding: 0.9rem;
  background-color: var(--primary-color);
  height: 100vh;
}

/* FIX THE NAVBAR ACROSS ALL SECTIONS */
nav {
  position: fixed;
  left: 0;
  width: 100%;
  z-index: 9;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

.nav-links.read-guide {
  opacity: 1;
  font-size: 22px;
  margin-bottom: 0.6rem;
  text-decoration-line: unset;
  opacity: 0.7;
}

.nav-links.read-guide:hover {
  opacity: 0.9;
}

.nav-right {
  display: flex;
  justify-content: space-between;
  width: 100%;
}

.nav-links {
  padding: 0.5rem;
  color: #fff;
  text-decoration: none;
  opacity: 0.9;
  font-size: 1.1em;
  font-weight: 600;
  transition: 0.5s;
  text-decoration-line: underline;
  text-underline-offset: 10px;
}

.nav-links:hover {
  opacity: 1;
  text-underline-offset: 12px;
}

/* HERO SECTION */

.hero {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%;
  text-align: center;
}

.hero-text {
  color: #fff;
  font-size: 48px;
  line-height: 1.5;
}

/* CHART SECTION */

.chart-section {
  height: 100vh;
  padding-top: 70px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.chart-wrapper {
  width: 95%;
  background-color: white;
}

.chart-heading {
  font-size: 38px;
  text-align: center;
  margin-bottom: 2rem;
  color: var(--app-white);
  opacity: 0.8;
}

.chart-section.bar-chart {
  background-color: var(--bar-chart-bg);
}

.chart-section.line-chart {
  background-color: var(--line-chart-bg);
}

.chart-section.pie-chart {
  background-color: var(--pie-chart-bg);
}

/* FOOTER */
footer {
  text-align: center;
  color: var(--app-white);
  padding: 2rem;
  font-size: 12px;
  opacity: 0.8;
}

footer span {
  font-weight: 900;
}

@media (min-width: 900px) {
  header {
    padding: 1rem 0.9rem;
  }

  nav {
    padding: 0 2rem;
    flex-direction: row;
  }

  .nav-links.read-guide {
    margin-bottom: 1rem;
  }

  .nav-right {
    width: 40%;
  }

  /* HERO SECTION */
  .hero {
    height: 80vh;
  }

  .hero-text {
    font-size: 48px;
    line-height: 1.6;
  }

  /* CHART SECTION */
  .chart-wrapper {
    width: 55vw;
  }

  .chart-heading {
    font-size: 48px;
  }
}

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

&lt;/div&gt;



&lt;p&gt;Save your files, and open the &lt;code&gt;chart.html&lt;/code&gt; on your browser, your starter template should look something like this.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636991057382%2FCDIArne1Q.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636991057382%2FCDIArne1Q.png" alt="frame_generic_dark (10).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Building Bar Chart in Chart.js
&lt;/h1&gt;

&lt;p&gt;In this section, we will be creating a visual of the survey result in a bar chart using the concept we've learned from the previous section.&lt;/p&gt;

&lt;p&gt;Create a section for the bar chart in the &lt;code&gt;chart.html&lt;/code&gt; file as shown below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- BAR CHART SECTION --&amp;gt;
&amp;lt;section class="chart-section bar-chart" id="bar-chart"&amp;gt;
    &amp;lt;h2 class="chart-heading"&amp;gt;Bar Chart&amp;lt;/h2&amp;gt;
    &amp;lt;div class="chart-wrapper"&amp;gt;
        &amp;lt;!-- chart canva --&amp;gt;
        &amp;lt;canvas id="js-bar-chart"&amp;gt;&amp;lt;/canvas&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our bar chart should look something like this at the end of this section.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636716604103%2F1PpHPOMNf.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636716604103%2F1PpHPOMNf.png" alt="bar chart built with chart.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The difference between the above bar chart and the basic bar chart is the different background color of the bars, the dark borders around the bars, the percentage (%) symbol of the data, and the label background color.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636994820160%2FCHfwOx3Ma.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636994820160%2FCHfwOx3Ma.png" alt="frame_generic_dark (6).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The chart.js library allows us to style anything we can see on the chart through the dataset object and not CSS, I will show you how in a bit.&lt;/p&gt;

&lt;p&gt;The chart label will take the background color of the first data in the data array, which is the JavaScript yellow in the example given above.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Anything you see, you can style - Anonymous&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another tricky part is adding the percentage (%) symbol to the bar chart data on the vertical labels.&lt;/p&gt;

&lt;p&gt;We won't do this, because it won't work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
 data: ["67.7%", "63.1%", "54.7%", "44.1%", "40.2%"]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rather, we will be making use of a callback function to add the percentage (%) symbol to each of the data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding Background Color to Chart.js
&lt;/h3&gt;

&lt;p&gt;To add background colors to each of the data been represented on a &lt;strong&gt;chart.js&lt;/strong&gt; chart, pass a &lt;code&gt;backgroundColor&lt;/code&gt; property inside of the dataset as shown in &lt;code&gt;bar-chart.js&lt;/code&gt; below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  // Chart label horizontal
    labels: ['JAVASCRIPT', 'HTML/CSS', 'SQL', 'PYTHON', 'JAVA'],
    datasets: [
      {
        // Chart label
        label: 'Programming languages votes',
        // Chart data
        data: [67.7, 63.1, 54.7, 44.1, 40.2],
        // Chart data background color
        backgroundColor: [
          'yellow',
          'blue',
          'brown',
          'purple',
          'indigo',
          'gray',
        ],
      },
    ],
},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure to import the &lt;code&gt;bar-chart.js&lt;/code&gt; if you're not working with the HTML template.&lt;/p&gt;

&lt;p&gt;The arrangement of the &lt;code&gt;backgroundColor&lt;/code&gt; array must match the arrangement of the &lt;code&gt;data&lt;/code&gt; array and the &lt;code&gt;labels&lt;/code&gt; array.&lt;/p&gt;

&lt;p&gt;This is what I mean.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;JAVASCRIPT -&amp;gt; 67.7 -&amp;gt; yellow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HTML/CSS -&amp;gt; 63.1 -&amp;gt; blue&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SQL -&amp;gt; 54.7 -&amp;gt; brown&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PYTHON -&amp;gt; 44.1 -&amp;gt; purple&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JAVA -&amp;gt; 40.2 -&amp;gt; indigo&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And you can add &lt;code&gt;borderWidth&lt;/code&gt; and &lt;code&gt;borderColor&lt;/code&gt; to your chart like this.&lt;br&gt;
&lt;/p&gt;

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

   // Chart border styles
   borderWidth: 0.3,
   borderColor: 'black',
},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adding Symbols to Chart.js Data
&lt;/h3&gt;

&lt;p&gt;To add any symbol to data in chart.js, we need to define a callback function in the chart configuration option, which is defined as shown below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; options: {
    scales: {
      y: {
        ticks: {
          callback: function (value) {
            return value + '%';
          },
        },
      },
    },
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;y&lt;/code&gt; represents the y-axis of the chart which is also the vertical side of the chart, where the chart data is been displayed.&lt;/p&gt;

&lt;p&gt;The callback function gives us access to each of the values in the chart data array before they are been rendered to the UI and it returns the new format we define, which is to append the percentage (%) symbol to the data in this case.&lt;/p&gt;

&lt;p&gt;I have created a gist &lt;a href="https://gist.github.com/unclebay143/b9a044c09954f176b746df2ec0c9bf5c" rel="noopener noreferrer"&gt;here&lt;/a&gt;  for the complete JavaScript code of the bar chart.&lt;/p&gt;

&lt;h1&gt;
  
  
  Building Line Chart in Chart.js
&lt;/h1&gt;

&lt;p&gt;In this section, we will visualize the survey data in a line chart.&lt;/p&gt;

&lt;p&gt;Our final line chart will look like this.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636982190819%2F3wZWOzmE-.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636982190819%2F3wZWOzmE-.png" alt="frame_generic_dark (9).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a new section for the line chart with a canvas tag, always remember to wrap the canvas tag with a parent element like below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- LINE CHART SECTION --&amp;gt;
&amp;lt;section class="chart-section line-chart" id="line-chart"&amp;gt;
    &amp;lt;h2 class="chart-heading"&amp;gt;Line Chart&amp;lt;/h2&amp;gt;
    &amp;lt;div class="chart-wrapper"&amp;gt;
        &amp;lt;!-- chart canva --&amp;gt;
        &amp;lt;canvas id="js-line-chart"&amp;gt;&amp;lt;/canvas&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Now, copy and paste the code below into your &lt;code&gt;line-chat.js&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Grab the bar chart canva
const lineChartContext = document
  .getElementById('js-line-chart')
  .getContext('2d');

// Creating a new chart instance
const newLineChart = new Chart(lineChartContext, {
  // Chart configuration
  type: 'line',
  data: {
    // Chart Label Vertical
    labels: ['JAVASCRIPT', 'HTML/CSS', 'SQL', 'PYTHON', 'JAVA'],
    datasets: [
      {
        // Chart lable
        label: 'Programming languages votes',
        // Chart data
        data: [67.7, 63.1, 54.7, 44.1, 40.2],
        // Chart data background color
        backgroundColor: ['yellow', 'blue', 'brown', 'purple', 'indigo'],
        // Chart border styles
        borderWidth: 0.3,
        borderColor: 'black',
      },
    ],
  },
  options: {
    responsive: true,
    scales: {
      y: {
        ticks: {
          callback: function (value) {
            return value + '%';
          },
        },
      },
    },
  },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only differences between the code in &lt;code&gt;bar-chart.js&lt;/code&gt; and the code in &lt;code&gt;line-chart.js&lt;/code&gt; are the variable name and the chart type.&lt;/p&gt;

&lt;p&gt;You should be more familiar with the code structure of the charts by now.&lt;/p&gt;

&lt;h1&gt;
  
  
  Building a Pie Chart in Chart.js
&lt;/h1&gt;

&lt;p&gt;Finally in this section, we'll represent the survey result in a pie chart.&lt;/p&gt;

&lt;p&gt;Create a new section for the pie chart in your html document like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- PIE CHART SECTION --&amp;gt;
&amp;lt;section class="chart-section pie-chart" id="pie-chart"&amp;gt;
    &amp;lt;h2 class="chart-heading"&amp;gt;Pie Chart&amp;lt;/h2&amp;gt;
    &amp;lt;div class="chart-wrapper"&amp;gt;
        &amp;lt;!-- chart canva --&amp;gt;
        &amp;lt;canvas id="js-pie-chart"&amp;gt;&amp;lt;/canvas&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/section&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Create a &lt;code&gt;pie-chart.js&lt;/code&gt; file and copy-paste the code below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Grab the bar chart canva
const pieChartContext = document
  .getElementById('js-pie-chart')
  .getContext('2d');

// Creating a new chart instance
const newPieChart = new Chart(pieChartContext, {
  // Chart configuration
  type: 'pie',
  data: {
    // Chart Label Vertical
    labels: ['JAVASCRIPT', 'HTML/CSS', 'SQL', 'PYTHON', 'JAVA'],
    datasets: [
      {
        // Chart data
        data: [67.7, 63.1, 54.7, 44.1, 40.2],
        label: 'Programming languages votes',
        backgroundColor: ['yellow', 'blue', 'brown', 'purple', 'indigo'],
        borderWidth: 0.3,
        borderColor: 'black',
      },
    ],
  },
  options: {
    responsive: true,
    // Maintain the original canvas aspect ratio (width / height) when resizing.
    maintainAspectRatio: false,
  },
});

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

&lt;/div&gt;



&lt;p&gt;The code for the &lt;code&gt;pie chart&lt;/code&gt; above is pretty much the same as the &lt;code&gt;bar chart&lt;/code&gt;, and &lt;code&gt;line chart&lt;/code&gt; implementation.&lt;/p&gt;

&lt;p&gt;But the pie chart needs extra help to become fully responsive across all screen sizes, so we need to set the &lt;code&gt;maintainAspectRatio&lt;/code&gt; to &lt;strong&gt;false&lt;/strong&gt; in the configuration option to make it responsive across all screen sizes.&lt;/p&gt;

&lt;p&gt;Without &lt;code&gt;maintainAspectRatio&lt;/code&gt; property&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636996134569%2Fvxgis9u3v.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636996134569%2Fvxgis9u3v.png" alt="frame_generic_dark (11).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;maintainAspectRatio&lt;/code&gt; set to false&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636996283122%2FzhUrfYRo4.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1636996283122%2FzhUrfYRo4.png" alt="frame_generic_dark (12).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Data presentation is an important element to have in a frontend application, and in this post, you learned how to use the chart.js library to create a bar chart, a line chart, and a pie chart.&lt;/p&gt;

&lt;p&gt;With the knowledge gained from this post, you can use chart.js to work with more complex data.&lt;/p&gt;

&lt;h1&gt;
  
  
  Reference
&lt;/h1&gt;

&lt;p&gt;If you are interested in learning more about charts, the resource below will help you to take data visualization with charts to the next level.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://www.chartjs.org" rel="noopener noreferrer"&gt;Chart.js Official Documentation&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>chartjs</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Creating your First CRUD Restful API with Node.JS and Hoppscotch</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Sat, 20 Nov 2021 08:13:57 +0000</pubDate>
      <link>https://dev.to/unclebigbay/creating-your-first-crud-restful-api-with-nodejs-and-hoppscotch-4lc7</link>
      <guid>https://dev.to/unclebigbay/creating-your-first-crud-restful-api-with-nodejs-and-hoppscotch-4lc7</guid>
      <description>&lt;p&gt;This full package tutorial is initially posted on Aviyel, an open source community, you can continue reading from the site to support their open source community. &lt;a href="https://aviyel.com/post/1393/creating-your-first-crud-restful-api-with-node-js-and-hoppscotch" rel="noopener noreferrer"&gt;Click here to read on Aviyel&lt;/a&gt; &lt;/p&gt;




&lt;p&gt;I will be doing a live demo of this project at &lt;a class="mentioned-user" href="https://dev.to/aviyel4"&gt;@aviyel4&lt;/a&gt; community on Sunday, you can RSVP the Event &lt;a href="https://aviyel.com/events/192/learning-rest-apis-from-beginner-to-advanced-with-node-js-hoppscotch" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;



&lt;br&gt;
Hello, my gorgeous friend on the internet 👋,

&lt;p&gt;If you're here and want to know how to build APIs, then you're most welcome, because, in this article, I'll show you the very importance of an API and how to create your first CRUD restful API using Node.JS, Express.js, and Hoppscotch.&lt;/p&gt;

&lt;p&gt;Hey buddy, this is a project-based article, so ensure to stick till the end 😉.&lt;/p&gt;
&lt;h1&gt;
  
  
  What we will build
&lt;/h1&gt;

&lt;p&gt;Straight to the point, we are building a Todo List Backend together!!!&lt;/p&gt;

&lt;p&gt;The reason for this is that todo list is a popular web development project that you might be familiar with, and there's a good chance you’ve used one before or built a todo list interface with HTML, CSS, and JavaScript.&lt;/p&gt;

&lt;p&gt;So in this article, we'll build a backend API for the popular Todo List project, and at the end of this article, you'll have a basic understanding of how API works and how to build your own APIs.&lt;/p&gt;


&lt;h1&gt;
  
  
  Prerequisites
&lt;/h1&gt;

&lt;p&gt;But before we get started buddy, let's quickly address the following questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do we really need APIs in our software?&lt;/li&gt;
&lt;li&gt;Why are we making use of Node JS?&lt;/li&gt;
&lt;li&gt;Why HoppScotch.io?&lt;/li&gt;
&lt;li&gt;What are the CRUD operations?&lt;/li&gt;
&lt;/ol&gt;


&lt;h1&gt;
  
  
  1. Do we really need APIs in our Software?
&lt;/h1&gt;

&lt;p&gt;Yes, my friend! We do; an API is a software communication and data exchange interface that allows two applications to communicate and exchange data. For example, a frontend application such as a todo list interface written in React.js, Vue.js, Angular, or Plain HTML, CSS, and JavaScript, can connect and exchange data (such as user information and logic) with a backend application API written in C#, Python, or Node.js.&lt;/p&gt;

&lt;p&gt;One of my favorite importance of using an API for software development is that you can have multiple frontend interfaces for your project backends, such as a Web Version and a Mobile Version while making use of the same API and you don’t actually need to tamper with the frontend codebase when modifying the backend codebase or vice versa.&lt;/p&gt;



&lt;p&gt;In this tutorial, we'll focus on building the backend of our todo list application, where we'll make use of Node JS to provide a todo list functionality to any frontend technology and all this will be tested using Hoppscotch while Harperdb will serve as our todo list database.&lt;/p&gt;


&lt;h1&gt;
  
  
  2. Why are we making use of Node JS?
&lt;/h1&gt;

&lt;p&gt;You must have been using the &lt;code&gt;console.log()&lt;/code&gt; and doing DOM manipulations in your JavaScript code like everyone else in the frontend on your browser, that's okay, that process is called the client-side, but you should know now that the backend application or our APIs does not run on the browser, it runs on the server-side, the question now is how do we execute JavaScript outside of the browser?&lt;/p&gt;
&lt;h3&gt;
  
  
  Node to the rescue!!!
&lt;/h3&gt;

&lt;p&gt;Node or Node.js is an open-source JavaScript backend run-time environment that works outside a web browser, this means that with Node we can write and execute our JavaScript backend code on the server-side, and we can view our &lt;code&gt;console.log&lt;/code&gt; on the Node environment.&lt;/p&gt;

&lt;p&gt;Don’t be confused, I had demonstrated it somewhere in this article.&lt;/p&gt;
&lt;h1&gt;
  
  
  3. Why Hoppscotch?
&lt;/h1&gt;

&lt;p&gt;While building a backend API, we sometimes need to test them in a simple way as possible without any frontend interface, this also allows us to catch bugs as early as possible before pushing to production, this also allows the developers which is us to work independently on the APIs until the frontend guys are ready to consume them.&lt;/p&gt;

&lt;p&gt;But how do we achieve this? Through what is known as API testing tools, these tools are applications that allow us to test if our APIs functionalities are performing as expected before pushing them to production, and one of the good testing tools for API is the HOPPSCOTCH.&lt;/p&gt;

&lt;p&gt;HOPPSCOTCH formally known as the POSTWOMAN is a free super light-weight, web-based, and a progressive web application that allows us to test our API endpoints at any time and from anywhere without any complex configurations.&lt;/p&gt;

&lt;p&gt;HOPPSCOTCH is our official testing tool for this tutorial and we will be using it to test our Todo List APIs throughout this article, you can proceed to checkout how Hoppscotch works by pasting the emoji endpoint below in the Hoppscotch URL box and sending a GET request to the emoji-api endpoint or click &lt;a href="https://emoji-api.com/emojis/grinning-squinting-face?access_key=703a1b02ca24b0c6be3e02a89abb83b61bf07dc1" rel="noopener noreferrer"&gt;here&lt;/a&gt; for a prefilled URL.&lt;/p&gt;

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

&lt;p&gt;Cool 😎 isn’t it?&lt;/p&gt;

&lt;p&gt;We got a response of a grinning-squinting-face 😆 from the emoji-API endpoint, Hoppscotch has just saved us the stress of writing JavaScript &lt;code&gt;fetch()&lt;/code&gt; or &lt;code&gt;axios()&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;Well-done buddy, you’ve now come a very long way already, let’s proceed to check out what the CRUD operation is all about, let’s go there🏃‍♀️!!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfzw5pciamk97laq6ydl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfzw5pciamk97laq6ydl.jpg" alt="Photo Source: https://www.beta-labs.in/" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Before you continue, Aviyel is partnering with  &lt;a href="https://aviyel.com/search?term=hopscotch" rel="noopener noreferrer"&gt;Hoppscotch&lt;/a&gt; to scale open source projects within communities. You can consider continuing this article on  &lt;a href="https://aviyel.com/post/1393/creating-your-first-crud-restful-api-with-node-js-and-hoppscotch" rel="noopener noreferrer"&gt;Aviyel&lt;/a&gt; official website, to support their community. &lt;a href="https://aviyel.com/post/1393/creating-your-first-crud-restful-api-with-node-js-and-hoppscotch" rel="noopener noreferrer"&gt;Click here to continue reading on Aviyel&lt;/a&gt; &lt;/p&gt;



&lt;h1&gt;
  
  
  4. What is the CRUD operations
&lt;/h1&gt;

&lt;p&gt;The CRUD acronym stands for the four main types of SQL commands which are the Create, Read, Update, and Delete commands. These are considered important for the development of a continuous storage application. &lt;/p&gt;

&lt;p&gt;This implies that the CRUD commands allows us to perform some basic operation that enables us to carry out  help us to manipulate data in the database, these operation includes the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creation of new records - Add To-do item&lt;/li&gt;
&lt;li&gt;Reading of existing records - View all To-do items&lt;/li&gt;
&lt;li&gt;Updating of an existing record - Update To-do item&lt;/li&gt;
&lt;li&gt;Deletion of an existing record - Delete Completed To-do item&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hey buddy, now that we know about these technologies and what we’re going to build with them, tighten your seat belt as we’re going to implement the above operations in our todo list backend, Now!!!&lt;/p&gt;

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


&lt;h1&gt;
  
  
  Setting up your Node environment
&lt;/h1&gt;

&lt;p&gt;In this section, we will be setting up the JavaScript runtime environment earlier on our computer, and to start with kindly ensure to have Node.js installed before you proceed with this section, you can get it installed quickly from here while I wait for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can also run &lt;code&gt;node&lt;/code&gt; &lt;code&gt;--&lt;/code&gt;&lt;code&gt;version&lt;/code&gt; to check if you have the updated version installed already.&lt;/p&gt;

&lt;p&gt;Welcome back, now that you’ve installed Node.js on your computer, follow the instructions below to get your Node.js project started.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new folder and name it &lt;code&gt;todo-list-backend&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Open your &lt;code&gt;cmd&lt;/code&gt; or &lt;code&gt;git bash&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm install --global yarn&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Then run &lt;code&gt;yarn init&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ignore or provide answers to the questions in the command prompt like below
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqint2axuwsrqj0yi275e.png" width="800" height="160"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can choose to ignore the questions next time by running &lt;code&gt;yarn init -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Yarn is a faster alternative to NPM which is a package manager, that allows us to download packages through our &lt;code&gt;cmd&lt;/code&gt; or &lt;code&gt;git bash&lt;/code&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  Setting up the Server
&lt;/h1&gt;

&lt;p&gt;Now that you have the runtime environment setup on your computer, let’s proceed to install a few more packages on our computer that will help get our server running&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Install Express
&lt;/h2&gt;

&lt;p&gt;Express is a Node.js framework that provides us with lots of fast features, if Angular is a JavaScript framework, then express is a node.js framework.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;yarn add express&lt;/code&gt;  to install express in your project.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Install Nodemon
&lt;/h2&gt;

&lt;p&gt;Nodemon is a simple script monitoring package that helps us to automatically restart the runtime environment whenever there is a change in our project file, this is like an auto-refresh on a web browser.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;yarn add nodemon&lt;/code&gt; to install nodemon in your project.&lt;/p&gt;

&lt;p&gt;Open your &lt;code&gt;package.json&lt;/code&gt; and add the following code to enable &lt;code&gt;nodemon&lt;/code&gt; in your project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
  "start": "nodemon index.js"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your &lt;code&gt;package.js&lt;/code&gt; should look something like below&lt;/p&gt;

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

&lt;h2&gt;
  
  
  3. Install Cors
&lt;/h2&gt;

&lt;p&gt;Because API aids sharing of resources between two applications, we need to set up a mechanism called &lt;code&gt;cors&lt;/code&gt; which allows sharing of resources from two different domains.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;yarn add cors&lt;/code&gt; to install cors in your application&lt;/p&gt;




&lt;h2&gt;
  
  
  Hello, World Response
&lt;/h2&gt;

&lt;p&gt;Welcome to the interesting part, to this point we are good to write our first endpoint and to test our setup, we will write an endpoint that responds with the popular Hello, world text to the caller.&lt;/p&gt;

&lt;p&gt;Create an &lt;code&gt;index.js&lt;/code&gt; file and copy-paste the code below inside.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// import express
const express = require("express");
const app = express();
// set your preferred server port
const port = 3000;
// root endpoint response
app.get("/", (req, res) =&amp;gt; {
  res.send("Hello, World!");
});

app.listen(port, () =&amp;gt; {
  console.log(`Your server ⚡ is running 🏃‍♂️ on http://localhost:${port}`);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;yarn start&lt;/code&gt; and If all goes well, visit or click &lt;a href="http://localhost:3000/" rel="noopener noreferrer"&gt;http://localhost:3000/&lt;/a&gt; and you should have the console message in your terminal and Hello, World displayed on your browser screen like below. &lt;/p&gt;

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

&lt;p&gt;And if you encounter any error, trace your steps back to this point to figure out what you missed.&lt;/p&gt;

&lt;p&gt;If all works well you can proceed to play around with the code by changing the text response, I will wait for you 😉.&lt;/p&gt;




&lt;h1&gt;
  
  
  We need a Database
&lt;/h1&gt;

&lt;p&gt;Yes, we need a database to keep the todo items, and for this tutorial, we will be making use of the Harperdb cloud instance for our todo list application database.&lt;/p&gt;

&lt;p&gt;Follow the instruction below to set up your own Harperdb database&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Head to &lt;a href="https://studio.harperdb.io/sign-up" rel="noopener noreferrer"&gt;https://studio.harperdb.io/sign-up&lt;/a&gt; to create a free account&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe923cfi1f56og5umy3p8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe923cfi1f56og5umy3p8.png" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On your dashboard click on create new Harperdb cloud instance card&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flb9wap1akb7gwghoisvu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flb9wap1akb7gwghoisvu.png" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fill the instance information form and ensure to keep them safe&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fijsiha7vam727xuymgcf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fijsiha7vam727xuymgcf.png" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on instance details except you want to upgrade your database&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xxqotiesb3lyk4qclhy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xxqotiesb3lyk4qclhy.png" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm that your instance details are correct and proceed to click on the add instance button below the add coupon button.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcppdndsmgvasiiyji4w5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcppdndsmgvasiiyji4w5.png" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for Harperdb to fully create your new instance, it’s okay if it takes more than 10 minutes even after refreshing, just sip your coffee ☕.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiex8nwg8pvqaoz9b5gpl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiex8nwg8pvqaoz9b5gpl.png" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once it’s all done, click on the instance card and create a new schema named &lt;code&gt;todos&lt;/code&gt;&lt;br&gt;
Note: A schema is a collection of tables that is also similar to a database in SQL&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdonbaygrr5dzb0n2fnq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdonbaygrr5dzb0n2fnq6.png" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now create a table named &lt;code&gt;items&lt;/code&gt; with a hash attribute of id &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note: hash attribute is the unique identifier of each item of todos we will be creating&lt;/p&gt;

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




&lt;h1&gt;
  
  
  Connecting to Harperdb Cloud Database:
&lt;/h1&gt;

&lt;p&gt;At this point your Harperdb instance is ready for use, the next thing to do is to install the Node.js Client &lt;code&gt;harperive&lt;/code&gt; package which will allow you to communicate to your Harperdb cloud database from your Node.js application.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;yarn add harperive&lt;/code&gt; to install the package in your project.&lt;/p&gt;

&lt;p&gt;Now that you’ve successfully installed &lt;code&gt;harperive&lt;/code&gt; , the next step is to set up Harperdb authentication in your Node.js application, do you remember the instance URL, the admin username, and the admin password you set up while creating your Harperdb instance? That’s exactly what we need.&lt;/p&gt;

&lt;h1&gt;
  
  
  Securing your project sensitive details
&lt;/h1&gt;

&lt;p&gt;Because of how sensitive these details are, you need to keep the instance URL, username, and password in a secure environment that cannot be accessible by unauthorized people when you push your code to GitHub, the &lt;code&gt;.env&lt;/code&gt; file will serve as a secure environment and the package which will grant you access to this secure details from the Node.js application is the &lt;code&gt;dotenv&lt;/code&gt; package.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;yarn add dotenv&lt;/code&gt; to install the package in your project.&lt;/p&gt;

&lt;p&gt;With all this setup, I can now show you how to connect your Node.js application to your Harperdb cloud instance.&lt;/p&gt;

&lt;p&gt;The first thing to do is to create a &lt;code&gt;.env&lt;/code&gt; file and paste the following snippet inside&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSTANCE_URL=YOUR_INSTANCE_URL
INSTANCE_USERNAME=YOUR_INSTANCE_USERNAME
INSTANCE_PASSWORD=YOUR_INSTANCE_PASSWORD
INSTANCE_SCHEMA=YOUR_INSTANCE_SCHEMA (todo)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can get your instance URL from the config section on your dashboard, the instance schema is the collection of tables you created earlier, where the instance username and password are the credentials you used while creating your database instance.&lt;/p&gt;

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

&lt;p&gt;Create a file name &lt;code&gt;dbconfig.js&lt;/code&gt;  and paste the code below into it&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;require('dotenv').config();
const harperive = require('harperive');
const DB_CONFIG = {
  harperHost: process.env.INSTANCE_URL,
  username: process.env.INSTANCE_USERNAME,
  password: process.env.INSTANCE_PASSWORD,
  schema: process.env.INSTANCE_SCHEMA,
};

const Client = harperive.Client;
const db = new Client(DB_CONFIG);
module.exports = db;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since you have dotenv installed then we can make use of &lt;code&gt;process.env&lt;/code&gt; to have access to the variables in the &lt;code&gt;.env&lt;/code&gt; files and also use the harperive package to connect to our Harperdb cloud instance, which you can use to communicate to the database anywhere in your application using the exported &lt;code&gt;db&lt;/code&gt;, I will show you how it’s done shortly.&lt;/p&gt;

&lt;p&gt;Proceed to import all the packages you have installed in your &lt;code&gt;index.js&lt;/code&gt;, it should look something like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   // import express
const express = require("express");
const app = express();

//Parse URL-encoded bodies - Allows us to retrieve data from submitted data
app.use(express.urlencoded({ extended: true }));

// import cors
var cors = require("cors");
app.use(cors());

// import the harperdb instance
const db = require("./dbconfig");

// your preferred server port
const port = 3000;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Building the todo list Create Operation
&lt;/h1&gt;

&lt;p&gt;Welcome, this section is where you will learn how to develop the CRUD endpoints (routes) that will allow anyone to create a new todo item in your application.&lt;/p&gt;

&lt;p&gt;Let’s break this down; in order to achieve this, a user must submit an item through a form, and our todo list will have the following property&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;todo:&lt;/strong&gt; this is what the user wants to do i.e. “buy bread in the evening”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;status:&lt;/strong&gt; this is the completion status of a todo item and it is pending by default&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  What we need to achieve this
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Create a POST route, that the frontend can send data to, through a form,&lt;/li&gt;
&lt;li&gt;Find a way to retrieve the todo from the form,&lt;/li&gt;
&lt;li&gt;Validate the form submission,&lt;/li&gt;
&lt;li&gt;Prepare the todo and its completion status into a new object,&lt;/li&gt;
&lt;li&gt;Ensure to catch any errors and use asynchronous JavaScript,&lt;/li&gt;
&lt;li&gt;Send the new todo to the Harperdb cloud instance,&lt;/li&gt;
&lt;li&gt;And finally notify the frontend with success or error message&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now let’s write some code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
// 1. create your post route that handles creating new todo item
app.post("/add", async (req, res) =&amp;gt; {
  // 2. retrieve the todo from req.body
  // 3. Validate the todo to nsure the user does not submit an empty form
  if (!req.body.todo || req.body.todo === "") {
    res.status(400).send("Todo is required");
  } else {
    // 4. prepare the todo in an object
    const option = {
      todo: req.body.todo,
      status: "pending",
    };
    // 5. ensure to catch the error using try/catch
    try {
      // 6. if the todo is not empty
      const response = await db.insert({
        table: "items",
        records: [option],
      });
      // 7. notify the frontend or sender with the success response
      res.status(200).send(response);
    } catch (error) {
      // 7. notify the frontend or sender with the error response
      res.status(500).send(error);
    }
  }
});

// just a notification in the console
app.listen(port, () =&amp;gt; {
  console.log(`Your server ⚡ is running 🏃‍♂️ on http://localhost:${port}`);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Building the todo list Read Operation
&lt;/h1&gt;

&lt;p&gt;The READ operation is used to retrieve data from the database, and for our todo application, we are going to make use of it to retrieve all the available todo items that have been added from the Create operation endpoint.&lt;/p&gt;

&lt;p&gt;In order to retrieve all the todo items in our Harperdb cloud instance, we need to follow the steps below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a GET route&lt;/li&gt;
&lt;li&gt;Ensure to catch any errors and use asynchronous JavaScript&lt;/li&gt;
&lt;li&gt;Use the query method to select every data from a table&lt;/li&gt;
&lt;li&gt;And finally notify the frontend with success or error message
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
// 1. route to retrieve all todos in the database
app.get("/todos", async (req, res) =&amp;gt; {
  // 2. use try/catch to control errors
  try {
    // 3. user query method to get all todo from the database table
    const response = await db.query("SELECT * FROM todos.items");
    // 4. send success message to the frontend
    res.status(200).send(response);
  } catch (error) {
    // 4. send error message to the frontend
    res.status(500).send("something went wrong");
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Building the todo list Update Operation
&lt;/h1&gt;

&lt;p&gt;The UPDATE operation is used to modify or edit data in the database and for our todo list application, a user can decide to change their entry for a todo or update the status of any todo items say from &lt;code&gt;pending&lt;/code&gt; to &lt;code&gt;completed&lt;/code&gt; or as the case might be in the frontend design.&lt;/p&gt;

&lt;p&gt;In order to implement the update operation in our application, the following must be put into check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a POST route,&lt;/li&gt;
&lt;li&gt;Setup the new todo details in an object (the hash attribute is required),&lt;/li&gt;
&lt;li&gt;Ensure to catch the errors and use async/await,&lt;/li&gt;
&lt;li&gt;Send the new todo to the backend using the update method,&lt;/li&gt;
&lt;li&gt;And finally notify the frontend with success or error message.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
// 1. route to update a todo
app.post("/edit", async (req, res) =&amp;gt; {
  // 2. set the updated todo and specify the todo identifier - hash attribute
  const option = {
    id: req.body.id,
    todo: req.body.todo,
    status: req.body.status,
  };
  // 3. use try/catch to control errors
  try {
    // 4. send the updated todo
    const response = await db.update({
      table: "items",
      records: [option],
    });
    // 5. send success message to the frontend
    res.status(200).send(response);
  } catch (error) {
    // 5. send error message to the frontend
    res.status(500).send(error);
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Building the todo list Delete Operation
&lt;/h1&gt;

&lt;p&gt;The DELETE operation allows users to remove unwanted data, and in our todo application, a user should be able to delete/remove completed items from their todo.&lt;/p&gt;

&lt;p&gt;Follow the instructions below to add a delete operation to your backend application:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a POST route that expects a parameter in its URL,&lt;/li&gt;
&lt;li&gt;Get the parameter  from the URL parameter,&lt;/li&gt;
&lt;li&gt;Ensure to catch errors and use async/await,&lt;/li&gt;
&lt;li&gt;Use the Harperdb delete method to remove the todo from the database,&lt;/li&gt;
&lt;li&gt;And finally notify the frontend with success or error message.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 1. route to delete a todo using its id
app.post("/delete/:todo_id", async (req, res) =&amp;gt; {
  // 2. get the id from the url parameter
  const { todo_id } = req.params;
  // 3. use try/catch to control errors
  try {
    // 4. Send a delete request to the database
    const response = await db.delete({
      table: "items",
      hashValues: [todo_id],
    });
    // 5. send success message to the frontend
    res.status(200).send(response);
  } catch (error) {
    // 5. send error message to the frontend
    res.status(500).send(error);
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing Our Application With HoppScotch.io
&lt;/h2&gt;

&lt;p&gt;Congratulations on getting to the API testing section, you should be proud of yourself, I have created a GitHub git for the complete code of our todo list backend application HERE&lt;/p&gt;

&lt;p&gt;In this section, we will be testing our backend application using hoppscotch.io, head to hoppscotch.io, and follow the instruction below to test along.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Add Todo Route Endpoint
&lt;/h2&gt;

&lt;p&gt;To ensure that a new todo item sent from the frontend to our backend application will be stored successfully in the database, we need to test the endpoint URL first by pasting the add todo URL &lt;code&gt;http://localhost:3000/add&lt;/code&gt; in the Hoppscotch URL bar as shown below. You can visit here to launch Hoppscotch&lt;/p&gt;

&lt;p&gt;The add endpoint is a post request, select the &lt;code&gt;POST&lt;/code&gt; method from the dropdown.&lt;/p&gt;

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

&lt;p&gt;In order to add a new todo, select the body menu and select &lt;code&gt;application/json&lt;/code&gt; from the dropdown menu.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;application/json&lt;/code&gt; allows us to send data to the Node.js application from Hoppscotch, which can be retrieved through &lt;code&gt;req.body&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;You can post a new todo item by writing an object of the todo item in the Raw Request Body and clicking on the Send button to make your request to the server as shown below.&lt;/p&gt;

&lt;p&gt;Ensure to add quotes around your object properties &lt;code&gt;"&lt;/code&gt;&lt;code&gt;todo&lt;/code&gt;&lt;code&gt;"&lt;/code&gt; and &lt;code&gt;"&lt;/code&gt;&lt;code&gt;Buy bread in the evening&lt;/code&gt;&lt;code&gt;"&lt;/code&gt;, else your test would fail. &lt;/p&gt;

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

&lt;p&gt;If all goes well, you should get a success response from the server like this, this shows that our application is able to receive new data posted through the &lt;code&gt;http://localhost:3000/add&lt;/code&gt; endpoint.&lt;/p&gt;

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

&lt;p&gt;Try to add as many todo items as you want, but ensure that the object key is &lt;code&gt;"&lt;/code&gt;&lt;code&gt;todo&lt;/code&gt;&lt;code&gt;"&lt;/code&gt; or else you will get a 404 response, which is coming from our Node.js validation logic.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Testing the Get/Read Todo Route Endpoint
&lt;/h2&gt;

&lt;p&gt;In this section, I will show you how to retrieve the todo items that are stored in the database. The endpoint URL to get all todo items from the database is &lt;code&gt;http://localhost:3000/todos&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Paste the URL in the Hoppscotch URL bar and send a &lt;code&gt;GET&lt;/code&gt; request to the server.&lt;/p&gt;

&lt;p&gt;You will get a success response with an array of all the todo items that you have added previously, you should also notice that our todo application has more properties than we added initially during the &lt;code&gt;POST&lt;/code&gt; request to the server.&lt;/p&gt;

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

&lt;p&gt;The &lt;code&gt;status&lt;/code&gt; property is set for new todo items in our Node.js &lt;code&gt;/add&lt;/code&gt; route while the &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;__createdtime__&lt;/code&gt; and the &lt;code&gt;__updatedtime__&lt;/code&gt; are added by the Harperdb database, these are useful when you need to know when an item is been created or last updated, we will be using the &lt;code&gt;id&lt;/code&gt; property in the coming sections&lt;/p&gt;

&lt;p&gt;NOTE: If you encounter any error in this section, it is probably because you’re not sending a &lt;code&gt;GET&lt;/code&gt; request to the server.&lt;/p&gt;

&lt;p&gt;Testing the Update/Edit Route Endpoint&lt;/p&gt;

&lt;p&gt;In this section, I will show you how to update the record of an item from the database, the URL that we can use to update a todo item on our server is &lt;code&gt;http://localhost:3000/edit&lt;/code&gt; and it only accepts a &lt;code&gt;POST&lt;/code&gt; request.&lt;/p&gt;

&lt;p&gt;We can update the &lt;code&gt;todo&lt;/code&gt; or its &lt;code&gt;status&lt;/code&gt; and to achieve updating a todo item record in the database, we need to specify in the Raw Request Body the &lt;code&gt;id&lt;/code&gt; of the todo item and which property we want to update.&lt;/p&gt;

&lt;p&gt;You can send a &lt;code&gt;GET&lt;/code&gt; request to the server and copy the &lt;code&gt;id&lt;/code&gt; of the todo you wish to update in the database.&lt;/p&gt;

&lt;p&gt;I will be updating the &lt;code&gt;status&lt;/code&gt; property of the todo item to &lt;code&gt;completed&lt;/code&gt; as shown below.&lt;/p&gt;

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

&lt;p&gt;Ensure to send a valid &lt;code&gt;id&lt;/code&gt;, else nothing will be updated as shown below.&lt;/p&gt;

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

&lt;p&gt;Proceed to send a &lt;code&gt;GET&lt;/code&gt; request on your own and see if the data is updated, if the todo item is not updated as expected, you should retrace your steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Delete Route Endpoint
&lt;/h2&gt;

&lt;p&gt;In this section, I will show you how to remove an item from the database, and the URL to achieve this is &lt;code&gt;http://localhost:3000/delete/:id&lt;/code&gt;, this URL is quite different from other routes, it takes in a parameter called &lt;code&gt;id&lt;/code&gt;, which is the id of the todo item you wish to delete.&lt;/p&gt;

&lt;p&gt;The parameters in the route URL are retrieved in the Node.js routes with &lt;code&gt;req.params&lt;/code&gt;, your URL should look something like this &lt;br&gt;
&lt;code&gt;http://localhost:3000/delete/c7f032b1-a4a2-457b-ad50-8bb758a9fc10&lt;/code&gt;, paste the URL in the Hoppscotch URL bar and send a &lt;code&gt;POST&lt;/code&gt; request to the server.&lt;/p&gt;

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

&lt;p&gt;The server will ignore the Raw Request Body as it only retrieves data sent through the URL parameter and the todo item with the specified &lt;code&gt;id&lt;/code&gt; will be deleted from the database.&lt;/p&gt;

&lt;p&gt;Send a &lt;code&gt;GET&lt;/code&gt; request to fetch the todo items in our database and check the updated items.&lt;/p&gt;

&lt;p&gt;I will receive an empty array in my case because I only have a single todo item which I have also deleted, you will receive other todo items if you have more than two.&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;In this article, you have learned how to set up a Node.js backend project, connect it to a database, write your backend CRUD logic and test it using Hoppscotch an API testing tool, with this knowledge you’ve gained from this reading, you are good to go to kickstart your personal project and also apply it in any other backend project.&lt;/p&gt;

&lt;p&gt;Thanks for reading, I hope to see your comments and the cool things you will build going forward.&lt;/p&gt;

&lt;p&gt;Cheers,&lt;/p&gt;

&lt;h1&gt;
  
  
  What we installed for this project
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;express - Node.js fast framework&lt;/li&gt;
&lt;li&gt;harperive - Helps us to connect our Node.js to Harperdb&lt;/li&gt;
&lt;li&gt;nodemon - Helps us to restart our Node.js server when there’s a change&lt;/li&gt;
&lt;li&gt;dontenv - Allows us to have access to variables in the &lt;code&gt;dot.env&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;cors - Allows two origins to share resources&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>backend</category>
      <category>node</category>
      <category>express</category>
    </item>
    <item>
      <title>INTRODUCING: The Anonymous Feedback Platform powered by the CHERN Stack</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Fri, 30 Jul 2021 07:08:11 +0000</pubDate>
      <link>https://dev.to/unclebigbay/introducing-the-anonymous-feedback-platform-powered-by-the-chern-stack-pkn</link>
      <guid>https://dev.to/unclebigbay/introducing-the-anonymous-feedback-platform-powered-by-the-chern-stack-pkn</guid>
      <description>&lt;p&gt;Hello beautiful people 🤗,&lt;/p&gt;

&lt;p&gt;Do you agree we all need feedback at some point in our lives? Feedback from our last  &lt;a href="https://unclebigbay.com/introducing-developer-typing-game-platform-powered-by-the-hern-stack" rel="noopener noreferrer"&gt;open-source projects&lt;/a&gt;, clients, tweets, tech talk, or individual performances, even on social media.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627420873118%2F1_glRppbS.jpeg" 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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627420873118%2F1_glRppbS.jpeg" alt="anonymous-feedback-1200x550.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But why is feedback important?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Feedback is important because it helps us grow directly or indirectly and it is useful as the basis of our improvement.&lt;/p&gt;

&lt;p&gt;Feedback can come in a negative form, helping us to identify areas of improvement such as our &lt;strong&gt;confidence, communication, knowledge&lt;/strong&gt; and so on.&lt;/p&gt;

&lt;p&gt;Positive feedback on the other hand helps us to identify our &lt;strong&gt;strengths&lt;/strong&gt;, to &lt;strong&gt;measure our growth&lt;/strong&gt;, and to become more &lt;strong&gt;confident&lt;/strong&gt; in whatever we are doing right.&lt;/p&gt;

&lt;h3&gt;
  
  
  Now, the BIG question
&lt;/h3&gt;

&lt;p&gt;Why do people not give feedback?&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627421184378%2F9FZP3mhgv.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627421184378%2F9FZP3mhgv.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During this project research, I was drawn to &lt;strong&gt;CONFIDENCE&lt;/strong&gt;, and I realized a lot of people have the fear of the unknown, with several thoughts coming up, such as &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;worries that the receiver might not like them&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Thinking &lt;strong&gt;the receiver cannot handle their feedback,&lt;/strong&gt; and &lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;fear of passing the wrong impression to the receiver&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But feedbacks vary, some can be easily asked or given publicly, for example on a tweet comment asking questions such as &lt;strong&gt;"Do you like my new Twitter header"&lt;/strong&gt; or &lt;strong&gt;"Asking for feedback from a previous post?"&lt;/strong&gt; anyone can actually give and take such feedback publicly.&lt;/p&gt;

&lt;p&gt;But, what about feedbacks that are more personal or work-related (professional), including the shy people, who have valid feedbacks to give, either from our previous project, writing skills, or personal life but are not confident enough to come out openly?&lt;/p&gt;

&lt;p&gt;This should be inclusive as it might not go well if they share that publicly with you on social media, where your clients can easily see it.&lt;/p&gt;



&lt;h3&gt;
  
  
  THE SOLUTION: &lt;a href="https://anonymousfeedback.tk" rel="noopener noreferrer"&gt; The Anonymous Feedback Platform&lt;/a&gt;
&lt;/h3&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627114011241%2FOUZ5yVxgd.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627114011241%2FOUZ5yVxgd.png" alt="anonymous feedback home page.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://anonymousfeedback.tk" rel="noopener noreferrer"&gt;Anonymous Feedback&lt;/a&gt; Platform, is here to bridge the gap (confidence) between the person willing to give feedback and the receiver.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627420273205%2FQ9z0h8Lt4.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627420273205%2FQ9z0h8Lt4.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works ⚒
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Anonymous Feedback Platform allows people to register as a receiver.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Share their unique feedback links, and&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start receiving feedbacks from faceless people.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;People giving feedback do not need to worry about their identity, or else they intentionally expose it from their feedbacks, and the receiver on the other hand will not know who gave the feedback, and that's fair enough 😍.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The receiver gathers useful feedbacks and works on it.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com/watch?v=KKoKh5U9_XQ" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;
&lt;/h3&gt;





&lt;h3&gt;
  
  
  Technologies 🧩
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Frontend -  &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React.js&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Frontend Hosting -  &lt;a href="https://www.netlify.com/" rel="noopener noreferrer"&gt;Netlify&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Backend - &lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt; Node.js, Express.js&lt;/a&gt; ,  &lt;a href="https://www.npmjs.com/package/harperive" rel="noopener noreferrer"&gt;Harperive&lt;/a&gt; ,  &lt;a href="https://nodemailer.com/about/" rel="noopener noreferrer"&gt;Nodemailer&lt;/a&gt; .&lt;/li&gt;
&lt;li&gt;Backend Hosting -  &lt;a href="https://www.heroku.com/" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Authentication and User management -  &lt;a href="https://clerk.dev/" rel="noopener noreferrer"&gt;Clerk dev&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Database -  &lt;a href="https://harperdb.io/" rel="noopener noreferrer"&gt;HarperDB Cloud&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Version control -  &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;Github&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Payment -  &lt;a href="https://flutterwave.com/ng/" rel="noopener noreferrer"&gt;Flutterwave&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The CHERN stack is a development tool that combines &lt;strong&gt;Clerk dev&lt;/strong&gt;, &lt;strong&gt;HarperDB&lt;/strong&gt;, &lt;strong&gt;Express.js&lt;/strong&gt;, &lt;strong&gt;React.js&lt;/strong&gt;, and &lt;strong&gt;Node.js&lt;/strong&gt;.&lt;/p&gt;


&lt;/blockquote&gt;



&lt;h3&gt;
  
  
  Features 🚀
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Personal Account 👨‍🏫&lt;/li&gt;
&lt;li&gt;Unique Feedback Link 🔗&lt;/li&gt;
&lt;li&gt;Receive Feedback with Emojis 🤩&lt;/li&gt;
&lt;li&gt;Manage Feedbacks ⚙&lt;/li&gt;
&lt;li&gt;Starred Feedback ⭐&lt;/li&gt;
&lt;li&gt;Receive Free 5 Feedbacks 🤹‍♂️&lt;/li&gt;
&lt;/ol&gt;



&lt;h3&gt;
  
  
  1. Personal Account 👨‍🏫
&lt;/h3&gt;

&lt;p&gt;You can signup for an account on the  &lt;a href="https://anonymousfeedback.tk" rel="noopener noreferrer"&gt;Anonymous feedback platform&lt;/a&gt; to start receiving feedback. The &lt;strong&gt;registration, login, and user management&lt;/strong&gt; are handled by  &lt;a href="https://clerk.dev/" rel="noopener noreferrer"&gt;Clerk dev&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Signup page&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can go passwordless by signing up with your &lt;strong&gt;Github&lt;/strong&gt; or &lt;strong&gt;Google&lt;/strong&gt; account, but an OTP will be required each time you need to log in because your feedback should be your personal asset and we care to keep it secure from the third eye.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627125252248%2FTKGDOnp30.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627125252248%2FTKGDOnp30.png" alt="anonymous feedback signup page.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Login page&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627125265529%2FBYZNWGmu1.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627125265529%2FBYZNWGmu1.png" alt="anonymous feedback login page.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Unique Feedback Link 🔗
&lt;/h3&gt;

&lt;p&gt;Every registered user has a unique feedback URL to share and receive feedback from people.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627416238836%2FeX7bLl4C1.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627416238836%2FeX7bLl4C1.png" alt="frame_generic_dark (22).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Receive Feedback with Emojis 👍
&lt;/h3&gt;

&lt;p&gt;Every feedback comes with an emoji, the sender makes use of these emojis to express themselves and how they feel about their feedbacks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Feedback page&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627416790416%2FkQmzaOxRD.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627416790416%2FkQmzaOxRD.png" alt="frame_generic_dark (23).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Success page&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627417060150%2Fkr0fY840r.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627417060150%2Fkr0fY840r.png" alt="frame_generic_dark (24).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The receivers' reaction tab increases as they receive more feedback, this will make it much easier to visually keep track of how people really feel about their feedbacks.&lt;/p&gt;

&lt;p&gt;For some reason, the receiver might want to share their feedback on their social media, maybe a client likes their services, this will also help pass their value and attract more clients 😎.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627417165997%2FZFBFKGrAS.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627417165997%2FZFBFKGrAS.png" alt="frame_generic_dark (25).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This feature is inspired by @&lt;a href="https://dev.to@hashnode"&gt;Hashnode&lt;/a&gt; article reactions 🤗&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4. Manage Feedbacks ⚙
&lt;/h3&gt;

&lt;p&gt;What happens to feedbacks that have been treated? and moreover, not all feedbacks are valid and should be taken seriously, receivers can trash feedbacks that have been treated or are not relevant, some people can just test out your feedback link 🤦‍♂️.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627417829583%2FomV-wnQ8s.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627417829583%2FomV-wnQ8s.png" alt="frame_generic_dark (26).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Starred Feedback ⭐
&lt;/h3&gt;

&lt;p&gt;Starred feedback features allow the receiver to organize and easily identify their favorite or current feedback they want to work on.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627453261658%2FnnPju5PUrc.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627453261658%2FnnPju5PUrc.png" alt="frame_generic_dark (29).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Receive Free 5 Feedbacks 🤹‍♂️
&lt;/h3&gt;

&lt;p&gt;Every receiver has 5 free feedbacks limits, and this is to keep the database clean, the upgrade payment goes to the upgrading of the Heroku free dyno of the project. &lt;/p&gt;

&lt;p&gt;The subscription is a &lt;strong&gt;one-time purchase&lt;/strong&gt; and the &lt;strong&gt;price is not fixed&lt;/strong&gt;, the payment gateway is powered by  &lt;a href="https://flutterwave.com/" rel="noopener noreferrer"&gt;flutterwave&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627418876524%2FV4xr7Ueql.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627418876524%2FV4xr7Ueql.png" alt="frame_generic_dark (28).png"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  Competitor 🎳
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.secretmessage.link/" rel="noopener noreferrer"&gt;secretmessage&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Competitive Advantage 🎯
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Feedback with Emoji Expression&lt;/li&gt;
&lt;li&gt;Personal Secure Account&lt;/li&gt;
&lt;li&gt;Secure Feedback Link&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  FAQ
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Who can use the Anonymous Feedback platform&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This platform can be used by both individuals and organizations to receive feedbacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. How much is the upgrade fee&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You decide fee and the fee is used for upgrading the Heroku dyno&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Is my account secure?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We value your feedback as much as you do, only you can view and manage your feedbacks, ensure to use a secure password if you don't want an &lt;strong&gt;OTP&lt;/strong&gt; authentication.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;
  
  
  Challenges ⚠
&lt;/h3&gt;

&lt;p&gt;My major difficulty is combining school activities, and blogging with the hackathon, as bugs are normal 😂, technically it took me some days trying to make use of custom &lt;strong&gt;registration&lt;/strong&gt; and &lt;strong&gt;login&lt;/strong&gt; pages through the &lt;strong&gt;HTTP API&lt;/strong&gt; request, and more days, figuring out how to keep the users on &lt;strong&gt;Clerk&lt;/strong&gt; in sync with my &lt;strong&gt;Database&lt;/strong&gt;, the &lt;strong&gt;Clerk&lt;/strong&gt; technical support which I reached out to for the first issue said I just reported a valid bug, so I have no choice than to make use of their awesome &lt;strong&gt;SDK&lt;/strong&gt; at the end which handles the UI and authentication logics.&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627450815207%2FrHO9eUHIl.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1627450815207%2FrHO9eUHIl.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The clerk documentation has been updated concerning the issue&lt;/p&gt;
&lt;/blockquote&gt;



&lt;h3&gt;
  
  
  What I learned
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Using a third party like  &lt;a href="https://clerk.dev/" rel="noopener noreferrer"&gt;Clerk dev&lt;/a&gt; for authentication and user management&lt;/li&gt;
&lt;li&gt;Another chance to work on the backend using &lt;a href="https://harperdb.io/" rel="noopener noreferrer"&gt;Harperdb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Improve communication and giving details information while reporting bugs&lt;/li&gt;
&lt;/ol&gt;



&lt;h3&gt;
  
  
  Contribution
&lt;/h3&gt;

&lt;p&gt;If there is anything you feel could be better, the anonymous feedback platform is an open-source project, so feel free to review and send in pull requests to the project Frontend Repository and Backend Repositories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Useful Links
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://anonymousfeedback.tk" rel="noopener noreferrer"&gt;The Anonymous Feedback Platform&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/unclebay143/anonymous-feedback" rel="noopener noreferrer"&gt;Frontend Repository&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/unclebay143/anonymous-feedback-backend" rel="noopener noreferrer"&gt;Backend Repository&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;You can send me feedback on the project using my feedback link  &lt;a href="https://anonymousfeedback.tk/to/unclebigbay" rel="noopener noreferrer"&gt;https://anonymousfeedback.tk/to/unclebigbay&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Thanks a lot @&lt;a href="https://dev.to@hashnode"&gt;Hashnode&lt;/a&gt; for another opportunity to put our skills into solving real-world problems&lt;/p&gt;







&lt;p&gt;A few weeks ago I developed and submitted  &lt;a href="https://unclebigbay.com/introducing-developer-typing-game-platform-powered-by-the-hern-stack" rel="noopener noreferrer"&gt;The Developer Typing Game&lt;/a&gt; for the @&lt;a href="https://dev.to@hashnode"&gt;Hashnode&lt;/a&gt; +  &lt;a href="//harperdb.io"&gt;Harperdb&lt;/a&gt; hackathon you can check it out  &lt;a href="https://unclebigbay.com/introducing-developer-typing-game-platform-powered-by-the-hern-stack" rel="noopener noreferrer"&gt;HERE&lt;/a&gt; . &lt;/p&gt;




&lt;p&gt;Wow, what a journey, I am glad you made it to the end of this article, if you enjoyed and learned from this article, I will like to connect with you.&lt;/p&gt;

&lt;p&gt;Let's connect on&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href="https://twitter.com/intent/follow?screen_name=unclebigbay143" rel="noopener noreferrer"&gt;Twitter @unclebigbay143&lt;/a&gt; &lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.linkedin.com/in/unclebigbay/" rel="noopener noreferrer"&gt;LinkedIn @unclebigbay&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My friend and I are holding a meetup every Saturday to discuss JavaScript and other programming tips and to support ourselves.&lt;/p&gt;

&lt;p&gt;You can be a part 👇 of the community by &lt;a href="https://unclebigbayandfriends.netlify.app/" rel="noopener noreferrer"&gt; visiting our website&lt;/a&gt; &lt;/p&gt;




&lt;p&gt;See you in the next article. Bye Bye 🙋‍♂️&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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1622627809083%2F3i7ThmW-M.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%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1622627809083%2F3i7ThmW-M.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>anonymous</category>
      <category>performance</category>
      <category>personaldevelopment</category>
    </item>
    <item>
      <title>6 Tools to write an eye-catching article</title>
      <dc:creator>Unclebigbay</dc:creator>
      <pubDate>Tue, 27 Jul 2021 06:23:00 +0000</pubDate>
      <link>https://dev.to/unclebigbay/6-tools-to-write-an-eye-catching-article-299</link>
      <guid>https://dev.to/unclebigbay/6-tools-to-write-an-eye-catching-article-299</guid>
      <description>&lt;p&gt;Hello beautiful bloggers 👨‍💻, below I will be sharing the list of tools that I make use while writing an article.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Carbon
&lt;/h3&gt;

&lt;p&gt;Link :  &lt;a href="https://carbon.now.sh/"&gt;carbon.now.sh&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Most of the technical articles you will probably write will come with code fragments attached to them, and readers will not find it too easy and attractive to view codes as plain text, carbon allows us to make an image of our code snippets and can be downloaded as &lt;strong&gt;PNG or SVG&lt;/strong&gt; for use as an attachment in our blog post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VlkUJird--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627332083691/UrWftwaLs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VlkUJird--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627332083691/UrWftwaLs.png" alt="carbon (1).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Grammarly
&lt;/h3&gt;

&lt;p&gt;Link:  &lt;a href="https://grammarly.com/"&gt;grammarly.com&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;We are humans after all, which means we cannot notice all the errors in our articles before publications, but  &lt;a href="https://www.grammarly.com/"&gt;Grammarly&lt;/a&gt; can help identify typographical errors and provide suggestions on how to improve our sentences.&lt;/p&gt;

&lt;p&gt;My favorite Grammarly feature is the emoji prediction, which shows how the whole article will sound to the readers, I found this to be useful as it helps to adjust and be within the desired prediction.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I am a big fan of emoji&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RndGn1xm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627332977346/86wODetlF.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RndGn1xm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627332977346/86wODetlF.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. BrowserFrame
&lt;/h3&gt;

&lt;p&gt;Link:  &lt;a href="https://browserframe.com/"&gt;browserframe.com&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;No doubts, images add to the beaut of an article when they are used properly, browser frames consist of both mobile and desktop browser frames to present the images better on articles.&lt;/p&gt;

&lt;h4&gt;
  
  
  Without &lt;a href="https://browserframe.com/"&gt;browserframe.com&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8S5f-_0K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627333314964/gejMyVVag.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8S5f-_0K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627333314964/gejMyVVag.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  With &lt;a href="https://browserframe.com/"&gt;browserframe.com&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cYuYv22w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627333375753/lGZHO6Gna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cYuYv22w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627333375753/lGZHO6Gna.png" alt="frame_generic_dark (20).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Ray
&lt;/h3&gt;

&lt;p&gt;Link:  &lt;a href="https://ray.so/"&gt;ray.so&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Ray is my second goto after &lt;a href="https://carbon.now.sh/"&gt;carbon&lt;/a&gt;, ray features include, linear-gradient background for code snippets and also provide a share link for the generated images.&lt;/p&gt;

&lt;p&gt;I found this to be really cool 😎&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pC9qaeZw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627333693068/lt7CEmkTT.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pC9qaeZw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627333693068/lt7CEmkTT.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Canva
&lt;/h3&gt;

&lt;p&gt;Link:  &lt;a href="https://www.canva.com/"&gt;www.canva.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most of &lt;a href="https://unclebigbay.com/"&gt;my blog&lt;/a&gt; cover images are made using &lt;a href="https://www.canva.com/"&gt;canva&lt;/a&gt;, canva has several free design templates for both presentation and article cover images.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Google Gifs
&lt;/h3&gt;

&lt;p&gt;Link: google anything gif 😛&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--M0l-TYPf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627335514814/MFtqXDKD2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--M0l-TYPf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627335514814/MFtqXDKD2.gif" alt="200 (1).gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I personally enjoy adding gifs to my articles, I believe technical articles should not be boring.&lt;/p&gt;

&lt;p&gt;I think you might want to add some to your next article😍, you can get your preferred gif by visiting google and searching say &lt;strong&gt;"laughing coding gifs"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_BRI2TXb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627335605771/af_sqp7Cg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_BRI2TXb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627335605771/af_sqp7Cg.png" alt="frame_generic_dark (21).png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;@&lt;a href="https://dev.to@DThompsonDev"&gt;Danny Thompson&lt;/a&gt; is also rocking some gif too🤩&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0vqxKoiM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627335666379/4zmDrubKf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0vqxKoiM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1627335666379/4zmDrubKf.gif" alt="tenor (2).gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that's it for this article, I hope you have learned something new from this article, feel free to share your favorite tools in the comment section and which of the above tools is actually new to you.&lt;/p&gt;




&lt;p&gt;Wow, what a journey, I am glad you made it to the end of this article, if you enjoyed and learned from this article, I will like to connect with you.&lt;/p&gt;

&lt;p&gt;Let's connect on&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;a href="https://twitter.com/intent/follow?screen_name=unclebigbay143"&gt;Twitter @unclebigbay143&lt;/a&gt; &lt;/li&gt;
&lt;li&gt; &lt;a href="https://www.linkedin.com/in/unclebigbay/"&gt;LinkedIn @unclebigbay&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My friend and I are holding a meetup every Saturday to discuss JavaScript and other programming tips and to support ourselves.&lt;/p&gt;

&lt;p&gt;You can be a part 👇 of the community by &lt;a href="https://unclebigbayandfriends.netlify.app/"&gt; visiting our website&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;See you in the next article. Bye Bye 🙋‍♂️&lt;br&gt;
also buy me a coffee below.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
